文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

全新Spring Security安全管理配置使用详解

2024-11-30 01:27

关注

1. 简介

Spring Security 是一个提供身份验证、授权和防护常见攻击的框架。它为确保命令式和反应式应用程序的安全提供一流的支持,是确保基于 Spring 的应用程序安全的事实标准。

Spring Scurity核心分为2大模块:

  1. 认证(Authentication):认证是建立一个他声明的主体的过程(一个主体一般是指用户、设备或一些可以在你的应用程序中执行的其他系统)。常见的身份认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
  2. 授权(Authorization):当身份认证通过后,去访问系统的资源,系统会判断用户是否拥有访问该资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。比如会员管理模块有增删改查功能,有的用户只能进行查询,而有的用户可以进行修改、删除。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

从Spring Security5.7开始之前的安全配置方式及Web授权处理方式发生了变化,接下来将详细介绍配置的变化。

2. 安全配置

2.1 配置方式

在5.7之前的版本自定义安全配置通过如下方式:

@Component
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  protected void configure(HttpSecurity http) throws Exception {
    // ...
  }
}

在5.7之后推荐如下配置方式

@Configuration
public class SecurityConfig {
  @Bean
  @Order(Ordered.HIGHEST_PRECEDENCE)
  SecurityFilterChain controllerFilterChain(HttpSecurity http) throws Exception {
    // ...
    return http.build() ;
  }
}

通过配置安全过滤器链的方式配置,具体内部的配置细节还都是围绕着HttpSecurity进行配置。

2.2 配置不同的过滤器链

在一个配置文件中我们可以非常方便的配置多个过滤器链,针对不同的请求进行拦截。

@Configuration
public class SecurityConfig {
  @Bean
  @Order(1)
  SecurityFilterChain controllerFilterChain(HttpSecurity http) {
    // 当前过滤器链只对/demos/**, /login, /logout进行拦截
    http.requestMatchers(matchers -> matchers.antMatchers("/demos/**", "/login", "/logout")) ;
    http.authorizeHttpRequests().antMatchers("/**").authenticated() ;
    http.formLogin(Customizer.withDefaults()) ;
    // ...
    return http.build() ;
  }
  @Bean
  @Order(2)
  SecurityFilterChain managementSecurityFilterChain(HttpSecurity http) throws Exception {
    // 该过滤器只会对/ac/**的请求进行拦截
    http.requestMatchers(matchers -> matchers.antMatchers("/ac/**")) ;
    // ...
    http.formLogin(Customizer.withDefaults());
    return http.build();
  }
}

以上配置了2个过滤器链,根据配置的@Order值,优先级分别:controllerFilterChain,managementSecurityFilterChain。当访问除上面指定的uri模式以为的请求都将自动放行。

2.3 用户验证配置

在5.7版本之前,我们通过如下配置配置内存用户

public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
      .passwordEncoder(NoOpPasswordEncoder.getInstance())
      .withUser("admin")
      .password("123123")
      .authorities(Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"))) ;
  }
}

5.7 只有由于推荐的是通过自定义SecurityFilterChain的方式,所以我们需要通过如下的方式进行配置:

@Configuration
public class SecurityConfig {
  @Bean
  @Order(0)
  SecurityFilterChain controllerFilterChain(HttpSecurity http) throws Exception {
    AuthenticationManagerBuilder builder = http.getSharedObject(AuthenticationManagerBuilder.class) ;
    builder.inMemoryAuthentication()
      .passwordEncoder(NoOpPasswordEncoder.getInstance())
      .withUser("admin")
      .password("123123")
      .authorities(Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"))) ;
    // ...
  }
}

2.4 授权方式

在5.7之后推荐配置认证授权的方式如下

@Bean
public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception {
  http.authorizeHttpRequests().antMatchers("/users/**").hasAnyRole("ADMIN") ;
  // ...
  return http.build() ;
}

通过上面的authorizeHttpRequests方式进行授权配置,会向过滤器链中添加AuthorizationFilter过滤器。在该过滤器中会进行权限的验证。

2.5 自定义授权决策

如果需要对请求的uri进行更加精确的匹配验证,如:/users/{id},需要验证只有这里的id值为666才方向。

@Bean
public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception {
  http.authorizeHttpRequests(registry -> {
    registry.antMatchers("/users/{id}").access(new AuthorizationManager() {
      @Override
      public AuthorizationDecision check(Supplier authentication,
          RequestAuthorizationContext object)
        // 获取路径上的值信息,其中key=id,value=xxx
        Map variables 
        // 这里的第一个参数是boolean,确定了授权是否通过
        return new AuthorityAuthorizationDecision(variables.get("id").equals("666"), Arrays.asList(new SimpleGrantedAuthority("D"))) ;
      }
    }) ;
  }) ;
}

2.6 全局认证

如果配置了多个不同的SecurityFilterChain,而每个认证都使用相同的用户体系,那么我们可以定义AuthenticationProvider或者UserDetailsService 类型的Bean即可。

@Bean
UserDetailsService userDetailsService() {
  return new UserDetailsService() {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      return null;
    }
  } ;
}
@Bean
AuthenticationProvider authenticationProvider() {
  return new AuthenticationProvider() {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
      return null;
    }
    @Override
    public boolean supports(Class authentication) {
      return false;
    }
  } ;
}


以上是本篇文章的全部内容, 希望对你有所帮助。

完毕!!!

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯