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