从Spring Security上的JWT认证过滤器重定向

时间:2016-08-26 03:54:30

标签: spring spring-mvc spring-security jwt

我在我的应用程序上使用spring:boot启用jwt身份验证。一切都好。如果标题中有一个有效的标记,它将被验证并且响应正在发送。

但是如何将无效请求重定向到登录页面,并在成功登录后将它们重定向回其初始请求页面。

这是我的配置方法

    httpSecurity
 .csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
 .authorizeRequests()
 .antMatchers(HttpMethod.GET, "/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js")
 .permitAll().antMatchers("/auth/**").permitAll().anyRequest().authenticated();
httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
httpSecurity.headers().cacheControl();

这是我的身份验证过滤器

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String authToken = httpRequest.getHeader(this.tokenHeader);
    // authToken.startsWith("Bearer ")
    // String authToken = header.substring(7);
    String username = jwtTokenUtil.getUsernameFromToken(authToken);
    System.out.println("Token is " + authToken);
    System.out.println("Username is " + username);
    System.out.println("Audience is from " + jwtTokenUtil.getAudienceFromToken(authToken));
    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
        UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
        System.out.println(userDetails.getAuthorities());
        if (jwtTokenUtil.validateToken(authToken, userDetails)) {
            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                    userDetails, null, userDetails.getAuthorities());
            authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
            SecurityContextHolder.getContext().setAuthentication(authentication);
        } else {
            System.out.println("Token is invalid ");
        }
    }
    chain.doFilter(request, response);
}

}

1 个答案:

答案 0 :(得分:0)

使用JWT /无状态安全性的目的是不在后端保留任何需要请求返回该节点以使其正常运行的客户端数据,从而允许任何请求转到任何后端实例。这增加了应用程序的可伸缩性,同时也使得执行上述描述变得更加困难。

因为前端现在是存储用户状态的地方,所以JS或其他一些前端技术需要负责实现此行为。使用框架比vanilla JS具有更高的学习曲线,但从长远来看,管理和实现复杂的需求会更容易。