【问题标题】:Redirect from JWT Authendication Filter on Spring Security从 Spring Security 中的 JWT 身份验证过滤器重定向
【发布时间】:2017-01-02 15:19:51
【问题描述】:

我在我的应用程序上使用带有 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);
}

}

【问题讨论】:

    标签: spring spring-mvc spring-security jwt


    【解决方案1】:

    使用 JWT / Stateless 安全性的目的是不在后端保留任何需要请求返回该节点才能使其正常运行的客户端数据,从而允许任何请求转到任何后端实例。这增加了应用程序的可扩展性,同时也让您更难以执行您刚才描述的操作。

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

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2022-01-15
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多