1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package com.api.base.config.auth;
- import com.api.base.config.auth.service.DetailsService;
- import com.api.common.JSONUtils;
- import com.api.core.response.Result;
- import com.api.core.response.ResultEnum;
- import com.api.core.response.ResultGenerator;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.data.redis.RedisConnectionFailureException;
- import org.springframework.http.HttpStatus;
- import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
- import org.springframework.security.core.context.SecurityContextHolder;
- import org.springframework.security.core.userdetails.UserDetails;
- import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
- import org.springframework.stereotype.Component;
- import org.springframework.web.filter.OncePerRequestFilter;
- import javax.servlet.FilterChain;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @Component
- public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
- @Value("${jwt.header}")
- private String tokenHeader;
- @Value("${jwt.tokenHead}")
- private String tokenHead;
- private DetailsService userDetailsService;
- private JwtTokenUtil jwtTokenUtil;
- @Autowired
- public JwtAuthenticationTokenFilter(DetailsService userDetailsService, JwtTokenUtil jwtTokenUtil) {
- this.userDetailsService = userDetailsService;
- this.jwtTokenUtil = jwtTokenUtil;
- }
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
- try {
- String authHeader = request.getHeader(tokenHeader);
- if (authHeader != null && authHeader.startsWith(tokenHead)) {
- String authToken = authHeader.substring(tokenHead.length());
- String username = jwtTokenUtil.getUsernameFromToken(authToken);
- if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
- UserDetails userDetails = userDetailsService.loadUserByUsername(username);
- if (jwtTokenUtil.validateToken(authToken, username)) {
- UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
- authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
- SecurityContextHolder.getContext().setAuthentication(authentication);
- }
- }
- }
- filterChain.doFilter(request, response);
- }catch (Exception e){
- logger.error("TokenFilterException",e);
- response.setHeader("Content-Type", "application/json;charset=utf-8");
- response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
- Result result = ResultGenerator.genExceptionResult();
- if(e instanceof RedisConnectionFailureException){
- result = ResultGenerator.genResult(ResultEnum.REDIS_CONNECTION_FAILUR);
- }
- response.getWriter().write(JSONUtils.obj2json(result));
- response.getWriter().flush();
- }
- }
- }
|