当前位置: 首页 > 知识库问答 >
问题:

Spring Security with JWT:验证令牌的JWT过滤器不会被调用

叶俊郎
2023-03-14

我正在使用带有JWT的Spring Security来验证rest api。登录时,会生成JWT令牌并共享给移动客户端。但是,后续请求中的令牌没有经过验证。安全配置有什么问题吗?

Spring Security版本-5.1.6。释放

//安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

    @Autowired
    private JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter;

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.
            httpBasic().disable().
            csrf().disable().
            exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).
            and().
                addFilterBefore(jwtTokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class).
                sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
            and().
                authorizeRequests().antMatchers("/user/login").permitAll().
                antMatchers("/user/test").authenticated().
                anyRequest().authenticated();
    }

}

//JWT Token Auth Filter——永远不会调用它

@Component
public class JwtTokenAuthenticationFilter extends GenericFilterBean {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
        String token = jwtTokenProvider.resolveToken((HttpServletRequest) req);
        if (null != token && jwtTokenProvider.validateToken(token)) {
            Authentication auth = jwtTokenProvider.getAuthentication(token);
            if (null != auth) {
                SecurityContextHolder.getContext().setAuthentication(auth);
            }
        }
        filterChain.doFilter(req, res);
    }
}

我希望登录后的所有请求都将根据JWT令牌进行身份验证。我尝试将要验证的服务的名称输入如下:

antMatchers("/user/test").authenticated().

此外,还添加了任何经过身份验证的请求,但这两个请求都不起作用。

anyRequest().authenticated();

共有1个答案

苏雅珺
2023-03-14

试着替换

addFilterBefore(jwtTokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class).

通过

addFilterBefore(jwtTokenAuthenticationFilter), BasicAuthenticationFilter.class);

如果没有运行,请更改jwtTokenAuthentiationFilter类以避免成为Spring bean并像这样使用:

addFilterBefore(new JwtTokenAuthenticationFilter(jwtTokenProvider)), BasicAuthenticationFilter.class);

并在安全类中添加以下代码:

@Autowired
private JwtTokenProvider jwtTokenProvider;
 类似资料:
  • 我在做一个全堆栈的web应用程序。我的前端由angular-cli组成,后端由node+Express构建。

  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?

  • 我有一个Spring-Boot-keydeport项目,我发现Spring-Boot不能用keydeport验证JWT。例如,如果我从keydepeat获得一个令牌并关闭keydepeat,我仍然可以使用这个JWT令牌访问我的endpoint。我有这个安全配置程序类: “converter”没有什么特别的,只是从JWT令牌中提取角色并返回它们的列表。 如何强制Spring Security性验证J

  • 我已经创建了一个简单的spring boot应用程序,我已经使用KeyCloak对其进行了身份验证。当我调用服务(http://localhost:8080/table1data)时,它会将我重定向到keycloak登录页面,在该页面中插入我的领域用户名和密码,然后返回数据。现在到现在一切都很好。 我想要另一个场景。如果我的用户已经拥有相应领域的有效令牌,并且他希望使用正确的令牌访问相同的URL,