千家信息网

Spring Security核心配置有哪些

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要讲解了"Spring Security核心配置有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring Security核心配置有
千家信息网最后更新 2025年02月05日Spring Security核心配置有哪些

这篇文章主要讲解了"Spring Security核心配置有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring Security核心配置有哪些"吧!

核心配置解读

3.1 功能介绍

这是Spring Security入门指南中的配置项:

@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {      http          .authorizeRequests()              .antMatchers("/", "/home").permitAll()              .anyRequest().authenticated()              .and()          .formLogin()              .loginPage("/login")              .permitAll()              .and()          .logout()              .permitAll();  }  @Autowired  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {      auth          .inMemoryAuthentication()              .withUser("admin").password("admin").roles("USER");  }}

当配置了上述的javaconfig之后,我们的应用便具备了如下的功能:

  • 除了"/","/home"(首页),"/login"(登录),"/logout"(注销),之外,其他路径都需要认证。

  • 指定"/login"该路径为登录页面,当未认证的用户尝试访问任何受保护的资源时,都会跳转到"/login"。

  • 默认指定"/logout"为注销页面

  • 配置一个内存中的用户认证器,使用admin/admin作为用户名和密码,具有USER角色

  • 防止CSRF攻击

  • Session Fixation protection(可以参考我之前讲解Spring Session的文章,防止别人篡改sessionId)

  • Security Header(添加一系列和Header相关的控制)

    • HTTP Strict Transport Security for secure requests

    • 集成X-Content-Type-Options

    • 缓存控制

    • 集成X-XSS-Protection

    • X-Frame-Options integration to help prevent Clickjacking(iframe被默认禁止使用)

  • 为Servlet API集成了如下的几个方法

    • HttpServletRequest#getRemoteUser()

    • HttpServletRequest.html#getUserPrincipal()

    • HttpServletRequest.html#isUserInRole(java.lang.String)

    • HttpServletRequest.html#login(java.lang.String, java.lang.String)

    • HttpServletRequest.html#logout()

3.2 @EnableWebSecurity

我们自己定义的配置类WebSecurityConfig加上了@EnableWebSecurity注解,同时继承了WebSecurityConfigurerAdapter。你可能会在想谁的作用大一点,毫无疑问@EnableWebSecurity起到决定性的配置作用,它其实是个组合注解。

@Import({ WebSecurityConfiguration.class, //       SpringWebMvcImportSelector.class }) // @EnableGlobalAuthentication // @Configurationpublic @interface EnableWebSecurity {   boolean debug() default false;}

@Import是springboot提供的用于引入外部的配置的注解,可以理解为:@EnableWebSecurity注解激活了@Import注解中包含的配置类。

@Import(AuthenticationConfiguration.class)@Configurationpublic @interface EnableGlobalAuthentication {}

注意点同样在@Import之中,它实际上激活了AuthenticationConfiguration这样的一个配置类,用来配置认证相关的核心类。

也就是说:@EnableWebSecurity完成的工作便是加载了WebSecurityConfiguration,AuthenticationConfiguration这两个核心配置类,也就此将spring security的职责划分为了配置安全信息,配置认证信息两部分。

WebSecurityConfiguration

在这个配置类中,有一个非常重要的Bean被注册了。

@Configurationpublic class WebSecurityConfiguration {    //DEFAULT_FILTER_NAME = "springSecurityFilterChain"    @Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)    public Filter springSecurityFilterChain() throws Exception {        ...    } }

在未使用springboot之前,大多数人都应该对"springSecurityFilterChain"这个名词不会陌生,他是spring security的核心过滤器,是整个认证的入口。在曾经的XML配置中,想要启用spring security,需要在web.xml中进行如下配置:

                springSecurityFilterChain        org.springframework.web.filter.DelegatingFilterProxy                springSecurityFilterChain        /*

而在springboot集成之后,这样的XML被java配置取代。WebSecurityConfiguration中完成了声明springSecurityFilterChain的作用,并且最终交给DelegatingFilterProxy这个代理类,负责拦截请求(注意DelegatingFilterProxy这个类不是spring security包中的,而是存在于web包中,spring使用了代理模式来实现安全过滤的解耦)。

AuthenticationConfiguration
@Configuration@Import(ObjectPostProcessorConfiguration.class)public class AuthenticationConfiguration {      @Bean    public AuthenticationManagerBuilder authenticationManagerBuilder(            ObjectPostProcessor objectPostProcessor) {        return new AuthenticationManagerBuilder(objectPostProcessor);    }      public AuthenticationManager getAuthenticationManager() throws Exception {        ...    }}

AuthenticationConfiguration的主要任务,便是负责生成全局的身份认证管理者AuthenticationManager。还记得在《Spring Security(一)--Architecture Overview》中,介绍了Spring Security的认证体系,AuthenticationManager便是最核心的身份认证管理器。

3.3 WebSecurityConfigurerAdapter

适配器模式在spring中被广泛的使用,在配置中使用Adapter的好处便是,我们可以选择性的配置想要修改的那一部分配置,而不用覆盖其他不相关的配置。WebSecurityConfigurerAdapter中我们可以选择自己想要修改的内容,来进行重写,而其提供了三个configure重载方法,是我们主要关心的:

由参数就可以知道,分别是对AuthenticationManagerBuilder,WebSecurity,HttpSecurity进行个性化的配置。

HttpSecurity常用配置
@Configuration@EnableWebSecuritypublic class CustomWebSecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http            .authorizeRequests()                .antMatchers("/resources/**", "/signup", "/about").permitAll()                .antMatchers("/admin/**").hasRole("ADMIN")                .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")                .anyRequest().authenticated()                .and()            .formLogin()                .usernameParameter("username")                .passwordParameter("password")                .failureForwardUrl("/login?error")                .loginPage("/login")                .permitAll()                .and()            .logout()                .logoutUrl("/logout")                .logoutSuccessUrl("/index")                .permitAll()                .and()            .httpBasic()                .disable();    }}

上述是一个使用Java Configuration配置HttpSecurity的典型配置,其中http作为根开始配置,每一个and()对应了一个模块的配置(等同于xml配置中的结束标签),并且and()返回了HttpSecurity本身,于是可以连续进行配置。他们配置的含义也非常容易通过变量本身来推测,

  • authorizeRequests()配置路径拦截,表明路径访问所对应的权限,角色,认证信息。

  • formLogin()对应表单认证相关的配置

  • logout()对应了注销相关的配置

  • httpBasic()可以配置basic登录

  • etc

他们分别代表了http请求相关的安全配置,这些配置项无一例外的返回了Configurer类,而所有的http相关配置可以通过查看HttpSecurity的主要方法得知:

需要对http协议有一定的了解才能完全掌握所有的配置,不过,springboot和spring security的自动配置已经足够使用了。其中每一项Configurer(e.g.FormLoginConfigurer,CsrfConfigurer)都是HttpConfigurer的细化配置项。

WebSecurityBuilder
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Override    public void configure(WebSecurity web) throws Exception {        web            .ignoring()            .antMatchers("/resources/**");    }}

以笔者的经验,这个配置中并不会出现太多的配置信息。

AuthenticationManagerBuilder
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {        auth            .inMemoryAuthentication()            .withUser("admin").password("admin").roles("USER");    }}

想要在WebSecurityConfigurerAdapter中进行认证相关的配置,可以使用configure(AuthenticationManagerBuilder auth)暴露一个AuthenticationManager的建造器:AuthenticationManagerBuilder 。如上所示,我们便完成了内存中用户的配置。

细心的朋友会发现,在前面的文章中我们配置内存中的用户时,似乎不是这么配置的,而是:

@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Autowired    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {        auth            .inMemoryAuthentication()                .withUser("admin").password("admin").roles("USER");    }}

如果你的应用只有唯一一个WebSecurityConfigurerAdapter,那么他们之间的差距可以被忽略,从方法名可以看出两者的区别:使用@Autowired注入的AuthenticationManagerBuilder是全局的身份认证器,作用域可以跨越多个WebSecurityConfigurerAdapter,以及影响到基于Method的安全控制;而 protectedconfigure()的方式则类似于一个匿名内部类,它的作用域局限于一个WebSecurityConfigurerAdapter内部。

感谢各位的阅读,以上就是"Spring Security核心配置有哪些"的内容了,经过本文的学习后,相信大家对Spring Security核心配置有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

配置 认证 核心 作用 注解 用户 安全 信息 方法 内存 内容 文章 路径 身份 身份认证 学习 控制 登录 全局 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络存储服务器哪家好用 天津使用软件开发现价 数据库资源监控库变化 星网锐捷软件开发类职位测评 威海智慧养老软件开发系统 公司邮箱接收服务器地址怎么查看 pc服务器怎么连接电视 微信内部数据库能查到聊天么 涉邪教网络安全和保密建设工作 网络安全知识培训记录表 play商店显示连接不到服务器 惠普服务器代理商名单 值得相信的网络安全公司 互联网之光博览会天玑科技 atlas数据库 网络安全10字诗歌 武汉学习网络技术有限公司 哪些银行软件开发好 甲骨文数据库建表 怎么从数据库中读取数据并计算 云南软件开发培训学校大 网络安全铅笔手抄报 车载网络技术凌永成下载 前端开发与数据库 数据库教学设计案例分析 广西大学网络安全系 世界十大网络安全公司排名 如何管理各服务器运维人员 茅箭区信息软件开发专业服务 为什么接收文件要新建数据库
0