gpt4 book ai didi

Spring Boot/Spring Security AuthenticationEntryPoint 未执行

转载 作者:IT老高 更新时间:2023-10-28 13:47:30 24 4
gpt4 key购买 nike

我创建了一个包含此方法的类 JwtAuthenticationFilter:

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
Authentication authentication = null;

if(hasJsonToken(request)) {
JwtAuthenticationToken jwtAuthenticationToken = new JwtAuthenticationToken(getJsonToken(request));
authentication = getAuthenticationManager().authenticate(jwtAuthenticationToken);
} else {
throw new AuthenticationCredentialsNotFoundException(AUTHENTICATION_CREDENTIALS_NOT_FOUND_MSG);
}

return authentication;
}

如果没有提供 JWT,则会抛出 AuthenticationCredentialsNotFoundException。我希望这会触发我的 AuthenticationEntryPoint 中的开始方法 - 如下所示:

@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpStatus.UNAUTHORIZED.value(),HttpStatus.UNAUTHORIZED.getReasonPhrase());
}

没有调用开始方法。这在我的 spring 安全配置(或其中的一部分)中:

@Bean
public RestAuthenticationEntryPoint restAuthenticationEntryPoint() {
return new RestAuthenticationEntryPoint();
}

protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.exceptionHandling().authenticationEntryPoint(restAuthenticationEntryPoint()).and()
.csrf().disable()
.authorizeRequests().antMatchers(AUTHORISED_SERVICE_REQUESTS_ANT_MATCHER).authenticated()
.anyRequest().permitAll();
}

不确定我在这里做错了什么,我希望有人向我指出。谢谢

我的 SecurityConfig 类扩展了 WebSecurityConfigurerAdapter 并使用 @Configuration 和 @EnableWebSecurity 进行注释

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}

我正在使用 Spring Boot 。

所以...最终我通过创建自定义 AuthenticationFailureHandler 并将其注册到我的 Authentication F.ilter 中得到了我想要的行为

jwtAuthenticationFilter.setAuthenticationFailureHandler(new JwtAuthenticationFailureHandler());

我现在的问题是,这是正确的做法吗? AuthenticationEntryPoint 和 AuthenticationFailureHandler 有什么区别?

最佳答案

AuthenticationEntryPointAuthenticationFailureHandler 之间的区别在于前者用于“告诉”未经身份验证的用户在哪里进行身份验证,例如,将他们重定向到登录表单。后者用于处理错误的登录尝试。

您的 AuthenticationEntryPoint 可能没有被调用,因为您正在抛出异常。如果用户尝试访问需要身份验证的端点并且您没有抛出任何东西,它将被调用。在没有凭据的情况下,不验证用户就足够了,您不需要抛出异常。

如果您使用 JWT 身份验证创建应用程序,您可能不想将用户重定向到任何地方,因此您可以使用 org.springframework.security.web.authentication.HttpStatusEntryPoint 或像您这样的入口点,用于返回状态代码。

关于Spring Boot/Spring Security AuthenticationEntryPoint 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39512849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com