|
|
package com.tianbo.warehouse.security.filter;
|
|
|
|
|
|
import com.tianbo.warehouse.security.CustomUserDetailService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
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.ServletRequest;
|
|
|
import javax.servlet.ServletResponse;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
|
|
|
/**
|
|
|
* 访问时判定JAVA WEB TOKEN,是否有TOKEN,有TOKEN是否超时,
|
|
|
* 正常则取出TOKEN ,从TOKEN中获取用户名,赋予系统登录。
|
|
|
* 注意此过滤器每次都会被访问,每个URL带TOKEN 访问这里然后去查用户的资料 会造成数据库压力。
|
|
|
* !!!!后期要把用户资料存储在Redis中,然后用户资料从redis中取,减少数据库压力。
|
|
|
*/
|
|
|
@Component
|
|
|
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter{
|
|
|
|
|
|
@Autowired
|
|
|
CustomUserDetailService userDetailService;
|
|
|
|
|
|
@Override
|
|
|
protected void doFilterInternal(
|
|
|
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
|
|
throws ServletException, IOException{
|
|
|
|
|
|
//请求头为 Authorization
|
|
|
//请求体为 Bearer token
|
|
|
String authHeader = request.getHeader("Authorization");
|
|
|
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
|
|
final String authToken = authHeader.substring("Bearer ".length());
|
|
|
|
|
|
String username = JwtTokenUtil.parseToken(authToken);
|
|
|
|
|
|
//有JWT 没有登录,去JWT的 信息 获取用户信息,赋予登录
|
|
|
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
|
|
|
UserDetails userDetails = userDetailService.loadUserByUsername(username);
|
|
|
if (userDetails != null) {
|
|
|
|
|
|
UsernamePasswordAuthenticationToken authentication =
|
|
|
new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
|
|
|
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
|
|
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
filterChain.doFilter(request, response);
|
|
|
}
|
|
|
} |
...
|
...
|
|