概述 我们可以通过集成AbstractAuthenticationProcessingFilter
或者现有的过滤器来完成自定义的身份认证过滤器
身份验证过滤器的主要责任是何时进行身份认证以及如何进行身份认证等
实现案例 以下是实现案例,可根据需求进行拓展和剔除
1. 继承AbstractAuthenticationProcessingFilter
public class GetRequestAuthenticationFilter extends AbstractAuthenticationProcessingFilter { }
2. 重写
attemptAuthentication()
方法
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (request.getMethod().toUpperCase().equals("GET")) {
// 创建身份认证对象
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("test", "test");
// 设置细节信息
token.setDetails(new WebAuthenticationDetails(request));
// 将身份认证对象交给身份认证管理器进行身份认证
return this.getAuthenticationManager().authenticate(token);
}
return null;
}
3. 为Filter设置
AuthenticationManager
【Spring Security 自定义身份认证过滤器】可通过自定义AuthenticationManager
和默认AuthenticationManager
设置自定义
AuthenticationManager
public GetRequestAuthenticationFilter testFilter(){
GetRequestAuthenticationFilter filter = new GetRequestAuthenticationFilter();
filter.setAuthenticationManager(new ProviderManager(Arrays.asList(new AuthenticationProvider() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if ("admin".equals(authentication.getPrincipal()) && "123456".equals(authentication.getCredentials())) {
List grantedAuthorities = Arrays.asList(new SimpleGrantedAuthority("admin"));
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getAuthorities(), grantedAuthorities);
token.setDetails(authentication.getDetails());
return token;
}else{
throw new BadCredentialsException("账号密码错误");
}
}@Override
public boolean supports(Class> aClass) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(aClass);
}
})));
return filter;
}
默认
ProviderManager
GetRequestAuthenticationFilter filter = new GetRequestAuthenticationFilter();
filter.setAuthenticationManager(super.authenticationManager());
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)