SpringSecurity-授权配置分层管理

概述

当前所有认证请求配置和应用权限配置在安全模块中,而很多权限配置是在应用模块提供的对应服务处理逻辑,这 样只有应用模块才知道的这些配置,所以要将它们抽取到应用中进行配置。

实现流程

  1. 创建 AuthorizeConfigurerProvider 授权配置统一接口。
  2. 针对每个功能模块都创建一个 AuthorizeConfigurerProvider 接口的模块权限配置实现类, 如:用户模块权限配置实现类、角色模块权限配置实现类
  3. 将对应权限配置抽取到对应 AuthorizeConfigurerProvider 的实现类中
  4. 创建一个授权配置管理者接口 AuthorizeConfigurerManager 管理所有的授权配置
  5. 通过 AuthorizeConfigurerManager 接口实现类,将 AuthorizeConfigureProvider 所有的授权配置实现类全部加 载到容器中。 

创建授权配置提供者

        方法参数是 HttpSecurity authorizeRequests() 返回值 , 因为都是基于它进行授权配置的
public interface AuthorizeConfigurerProvider { 
    /**
    * 参数为 authorizeRequests() 的返回值
    * @param config
    */
void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry
config); 
}

创建认证放行相关授权配置实现类

  • 实现 AuthorizeConfifigurerProvider 接口
  • SpringSecurityConfifig#confifigure 方法中关于身份认证相关请求配置抽取到这个 confifig ,
  • 指定容器加载组件顺序:@Order(Integer.MAX_VALUE) // 值越小加载越优先,值越大加载越靠后
@Component
public class CustomAuthorizeConfigurationProvider implements AuthorizeConfigurerProvider {             
    @Autowired
    private SecurityProperties securityProperties; 
    @Override
    public void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) { 
    // 放行/login/page不需要认证可访问
    config.antMatchers(securityProperties.getAuthentication().getLoginPage(),             
    securityProperties.getAuthentication().getImageCodeUrl(),         
    securityProperties.getAuthentication().getMobilePage(), 
    securityProperties.getAuthentication().getMobileCodeUrl() ).permitAll(); 
  } 
}

web 创建关于系统管理模块相关的授权配置提供者

  • 实现 AuthorizeConfifigurerProvider 接口
  • SpringSecurityConfifig#confifigure 方法中关于用户、角色、菜单模块授权配置抽取到这个 confifig
@Component
public class SystemAuthorizeConfigurerProvider implements AuthorizeConfigurerProvider {
    @Override
    public void
configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
    config.antMatchers("/user").hasAuthority("sys:user") 
    .antMatchers(HttpMethod.GET, "/role")
    .hasAuthority("sys:role") 
    .antMatchers(HttpMethod.GET, "/permission") //角色会加上前缀 ROLE_,即真实是 ROLE_ADMIN 
    .access("hasAuthority('sys:permission') or hasAnyRole('ADMIN')"); 
  } 
}

创建授权配置管理者

方法参数是 HttpSecurity authorizeRequests() 返回值 ,它用于接收 SpringSecurityConfifig 传递过来 的。
public interface AuthorizeConfigurerManager { 
    void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry
config); 
}
创建实现类 CustomAuthorizeConfifigurationManager 实现 AuthorizeConfifigurerManager 接口,加载所有的授权配置 类,也就是AuthorizeConfifigurerProvider接口所有子类实例
@Component
public class CustomAuthorizeConfigurationManager implements AuthorizeConfigurerManager {                 
     @Autowired 
List<AuthorizeConfigurerProvider> authorizeConfigurerProviders; 
    @Override
public void
configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) { 
        for(AuthorizeConfigurerProvider provider : authorizeConfigurerProviders) {
                provider.configure(config); 
        }
// 除了 AuthorizeConfigurerProvider 实现类中配置的,其他请求都需要身份认证
config.anyRequest().authenticated(); 
    } 
}

重构 SpringSecurityConfifig

@Configuration @EnableWebSecurity // 开启springsecurity过滤链 filter @EnableGlobalMethodSecurity(prePostEnabled = true) //开启注解方法级权限控制
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    // 配置文件参数 
    @Autowired
    private SecurityProperties securityProperties; 
    @Autowired
    private AuthenticationSuccessHandler customAuthenticationSuccessHandler;
     @Autowired
    private AuthenticationFailureHandler customAuthenticationFailureHandler; 
    @Autowired
    private ImageCodeValidateFilter imageCodeValidateFilter;

@Override
protected void configure(HttpSecurity http) throws Exception {
    /****
      ***
       */
    // 权限相关配置管理者, 将所有授权配置管理起来了 
    authorizeConfigurerManager.configure(http.authorizeRequests());
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值