jwt自定义认证过滤器
Jwt认证
在许多的项目中,由于做了前后端分离配置,通过jwt生成token,所以需要一个jwt自定义认证过滤器,来实现jwt的token认证;
jwt自定义认证过滤器的作用
JWT自定义认证过滤器的作用是在请求到达后端服务器之前对JWT令牌进行验证和解析,以确保请求的合法性和身份的真实性。
- 验证令牌的有效性:通过检查令牌的签名和过期时间等信息,确保令牌是有效且未过期的。
- 解析令牌获取用户信息:从令牌中提取用户身份信息,如用户名、角色或权限等,以便后续的身份验证和授权操作。
- 进行身份验证:根据令牌中的用户信息,进行用户身份的验证,确保用户是合法的、存在的。
- 设置用户上下文:将验证通过的用户信息存放在上下文中,以便在后续的请求处理过程中使用,如获取当前用户信息、进行权限控制等。
- 过滤请求:根据请求的URL或其他条件,判断是否需要对请求进行身份验证和授权,以决定是否放行请求或返回相应的错误信息。
JWT自定义认证过滤器的实现步骤:
- 创建一个类,命名为JwtAuthenticationFilter,并继承BasicAuthenticationFilter类。
//BasicAuthenticationFilter类是Spring Security框架中的一个过滤器,用于处理基本身份验证。
//它是AbstractAuthenticationProcessingFilter类的子类,用于对请求进行身份验证和授权处理。
- 定义一个URL白名单数组,用于存储需要放行的请求地址。
// 定义一个URL_WHITELIST数组,存储需要放行的请求地址
private static final String URL_WHITELIST[] = {
"/login",
"/logout",
"/captcha",
"/password",
"/image/**"
};
- 创建JwtAuthenticationFilter类的构造函数,传入一个AuthenticationManager对象,用于处理身份验证。
// 定义JwtAuthenticationFilter类的构造函数,传入一个AuthenticationManager对象,该对象用于处理身份验证。
public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
}
- 重写doFilterInternal方法,该方法在每个请求中执行身份验证逻辑。
/**
* 重写doFilterInternal方法,该方法在每个请求中执行,用于身份验证。
* @param request 请求对象
* @param response 响应对象
* @param chain 过滤器链
* @throws IOException
* @throws ServletException
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// 获取请求头中的token
String token = request.getHeader("token");
// 打印请求的URL
System.out.println("请求的url:"+request.getRequestURI());
// 如果token为空或者请求地址在白名单中,则放行
if (StringUtil.isEmpty(token) || new ArrayList<String>(Arrays.asList(URL_WHITELIST)).contains(request.getRequestURI())){
chain.doFilter(request,response);//放行
return;
}
// 验证token是否有效
CheckResult checkResult = JwtUtils.validateJWT(token);//validateJWT时是自定义的验证JWT工具类
if (!checkResult.isSuccess()){
//如果验证结果不为空
switch (checkResult.getErrCode()){
// 如果token不存在
case JwtConstant.JWT_ERRCODE_NULL: throw new JwtException("token不存在!");
// 如果token过期
case JwtConstant.JWT_ERRCODE_EXPIRE: throw new JwtException("Token过期");
// 如果验证不通过
case JwtConstant.JWT_ERRCODE_FAIL: throw new JwtException("Token验证不通过");
}
}
// 验证通过,解析token获取用户名
Claims claims = JwtUtils.parseJWT(token);
String username = claims.getSubject();
// 根据用户名获取用户信息
SysUser sysUser = sysUserService.getByUserName(username);