展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

授权配置分层管理

  • 简介
当前所有认证请求配置和应用权限配置在安全模块中,而很多权限配置是在应用模块提供的对应服务处理逻辑,这样只有应用模块才知道的这些配置,所以要将它们抽取到应用中进行配置
  • 实现步骤
1. 创建 AuthorizeConfigurerProvider 授权配置统一接口。
2. 针对每个功能模块都创建一个 AuthorizeConfigurerProvider 接口的模块权限配置实现类,如:用户模块权限配置实现类、角色模块权限配置实现类
3. 将对应权限配置抽取到对应 AuthorizeConfigurerProvider 的实现类中
4. 创建一个授权配置管理者接口 AuthorizeConfigurerManager 管理所有的授权配置
5. 通过 AuthorizeConfigurerManager 接口实现类,将 AuthorizeConfigureProvider 所有的授权配置实现类全部加载到容器中。
  • 代码实现
public interface AuthorizeConfigurerProvider {

    void confiure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);

}

@Component
@Order(Integer.MAX_VALUE) // 值越小加载越优先,值越大加载越靠后
public class CustomAuthorizeConfigurerProvider implements AuthorizeConfigurerProvider {

    @Override
    public void confiure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
        config.antMatchers("/login",
                                        "/test"
        ).permitAll(); // 放行/login/page不需要认证可访问
        // 其他请求都要通过身份认证
        config.anyRequest().authenticated();
    }

}

@Component
public class SystemAuthorizeConfigurerProvider implements AuthorizeConfigurerProvider {

    @Override
    public void confiure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
        // 有 sys:user 权限的可以访问任意请求方式的/role
        config.antMatchers("/success").hasAuthority("sys:user")
        // 有 sys:role 权限的可以访问 get方式的/role
        .antMatchers(HttpMethod.GET,"/test1").hasAuthority("sys:role");
    }

}

public interface AuthorizeConfigurerManager {

    void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);

}

@Component
public class CutomAuthorizeConfigurerManager implements AuthorizeConfigurerManager {

    @Autowired
    List<AuthorizeConfigurerProvider> authorizeConfigurerProviders;

    // 将一个个AuthorizeConfigurerProvider的实现类,传入配置的参数 ExpressionInterceptUrlRegistry
    @Override
    public void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
        for(AuthorizeConfigurerProvider provider: authorizeConfigurerProviders) {
            provider.confiure(config);
        }
    }

}

# security配置类中添加如下
@Autowired
private AuthorizeConfigurerManager authorizeConfigurerManager;

authorizeConfigurerManager.configure(http.authorizeRequests());
posted @ 2022-06-27 16:50  DogLeftover  阅读(20)  评论(0编辑  收藏  举报