前言
之前已经讲过 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 类
重写方法
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于