前言
之前已经讲过 WebFlux 与 Security 的一种结合方式,又因为业务原因放弃了第一种实现的方式。
为了动态的 RBAC(Role-Based Access Control) 和接口级的权限管理和利用 Webflux 的吞吐和响应能力,又写另一种方式,这种方式放弃了一部分 Security 的能力,而利用自身的能力去书写,所以更加灵活,重要的是,已经把该踩的坑已经全部踩平,如有新坑,还望互相交流。
实践篇
Config 配置
之前已经写过,第一步需要配置 Scurity 的 Config,跟之前有一些区别
@EnableWebFluxSecurity @EnableReactiveMethodSecurity public class SecurityConfig { @Autowired private AuthenticationManager authenticationManager; @Autowired private SecurityContextRepository securityContextRepository; //security的鉴权排除列表 private static final String[] excludedAuthPages = { "/auth/login", "/auth/logout" }; @Bean SecurityWebFilterChain webFluxSecurityFilterChain(ServerHttpSecurity http) throws Exception { return http .exceptionHandling() .authenticationEntryPoint((swe, e) -> { return Mono.fromRunnable(() -> { swe.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); }); }).accessDeniedHandler((swe, e) -> { return Mono.fromRunnable(() -> { swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN); }); }).and() .csrf().disable() .formLogin().disable() .httpBasic().disable() .authenticationManager(authenticationManager) .securityContextRepository(securityContextRepository) .authorizeExchange() .pathMatchers(HttpMethod.OPTIONS).permitAll() .pathMatchers(excludedAuthPages).permitAll() .anyExchange().authenticated() .and().build(); } }
从上往下开始说明区别
1.增加认证异常处理,之前有登录成功与失败的类,现在已经不需要了,直接在配置遇到异常的处理方式
.authenticationEntryPoint : 认证失败进行 HTTP 401 状态码返回
.accessDeniedHandler : 访问被拒绝进行 HTTP 403 状态码返回
.formLogin : Security 登录认证功能关闭
.httpBasic : httpBasic 功能关闭
.authenticationManage : 重写认证管理,并进行配置
.securityContextRepository : 重写 Security 上下文存储库并进行配置(这个在上章提到过)
省下的配置都已经讲过了,就不多说了,配置根据自身业务需要在进行修改,有很多功能。
securityContextRepository 类
重写方法
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于