zoukankan      html  css  js  c++  java
  • SpringSecurity+JWT 登录授权过滤器

    每次请求都会”携带“ token( token 在 request 的 header 里面)

    拦截验证过程:

      request -> header -> token -> username -> userDetails(getAuthentication()) -> authentication

      SecurityContextHolder.getContext().setAuthentication(authentication)  //建立安全上下文

    代码

    public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
        private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class);
        @Autowired
        private UserDetailsService userDetailsService;
        @Autowired
        private JwtTokenUtil jwtTokenUtil;
        @Value("${jwt.tokenHeader}")
        private String tokenHeader;
        @Value("${jwt.tokenHead}")
        private String tokenHead;
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain chain) throws ServletException,IOException {
            //request 中获取去 header
            String authHeader = request.getHeader(this.tokenHeader);
            //对header做判断
            if (authHeader != null && authHeader.startsWith(this.tokenHeader)) {
                //取出header
                //此处注意token之前有一个7字符长度的“Bearer “,
                String authToken = authHeader.substring(this.tokenHeader.length());// The part after "Bearer "
                //token中获取username
                String username = jwtTokenUtil.getUserNameFromToken(authToken);
                LOGGER.info("checking username:{}", username);
                //判断username
                if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                    //拿到userDetails
                    UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
                    //验证token
                    if (jwtTokenUtil.validateToken(authToken,userDetails)) {
                        //完整填充的 authentication(其中包含了权限集 getAuthorities())
                        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                                userDetails, null, userDetails.getAuthorities());
                        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                        LOGGER.info("authenticated user:{}", username);
                        //建立安全上下文
                        SecurityContextHolder.getContext().setAuthentication(authentication);
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }

    UserDetails

    public interface UserDetails extends Serializable {
        //用户的权限集,
        Collection<? extends GrantedAuthority> getAuthorities();
        //用户的加密后的密码, 不加密会使用`{noop}`前缀
        String getPassword();
        //应用内唯一的用户名
        String getUsername();
        //账户是否过期
        boolean isAccountNonExpired();
        //账户是否锁定
        boolean isAccountNonLocked();
        //凭证是否过期
        boolean isCredentialsNonExpired();
        //用户是否可用
        boolean isEnabled();
    }
  • 相关阅读:
    iframe+json
    qw
    MySql数据类型和Java数据类型对应一览
    MyEclipse生成get/set注释
    Redis集群_主从配置
    MyBatis输出sql需要log4j.properties配置
    默认没有创建两次定时实例的
    spring+freemarker+redis
    jquery easyui 扩展验证
    vs2010 安装 Ajax Control Toolkit
  • 原文地址:https://www.cnblogs.com/hellojava404/p/13160400.html
Copyright © 2011-2022 走看看