Spring Security 在springboot 3中禁用注销重定向并调用自定义注销rest端点

mcvgt66p  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(132)

我正在开发一个Springboot 3应用程序。我必须使用Jwt对象,所以我必须沿着spring-boot-starter-security导入此依赖项

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>

我有一个自定义的/logout休息端点。现在有了这个新的依赖项,当我调用我的端点时,它返回一个302代码并重定向到/login?logout
所以我改变了我的配置如下,使它调用自定义休息端点,但它只返回一个302与重定向URL。

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(request -> request
                    .requestMatchers("/login*")
                            .permitAll()
                            .anyRequest()
                            .permitAll())
            .logout(logout -> logout.logoutSuccessUrl("/cms/logout").permitAll());
    http.httpBasic(AbstractHttpConfigurer::disable);
    return http.build();
}

我不希望它重定向到另一个URL,我只想调用我的自定义注销休息端点。
我尝试了下面的方法,但它不工作

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(request -> request
                    .requestMatchers("/login*")
                            .permitAll()
                            .anyRequest()
                            .permitAll())
            .logout(logout -> logout.permitAll()
            .logoutSuccessHandler(((request, response, authentication) -> new CustomLogoutHandler())));
    http.httpBasic(AbstractHttpConfigurer::disable);
    return http.build();
}

private class CustomLogoutHandler implements LogoutSuccessHandler{
    @Autowired
    AuthServiceImpl authService;
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        authService.cmslogout(request,response);
    }
}

如果我删除注销,那么这就是我在浏览器中看到的:

如果可以整体禁用这个spring安全注销处理,那就更好了。
我定义了SecurityFilterChain bean,因为我们已经为这个资源服务器设置了自定义身份验证。访问令牌在cookie中传递以进行自定义身份验证。但是现在,我需要支持Keycloak OIDC。在本例中,我将访问令牌作为Authorization头的一部分。我对此有特定的过滤器,它拦截请求并决定身份验证流程。
对于keycloak OIDC,我的angular前端应用程序充当client-server,负责从keylcloak获取访问令牌,并将其添加到对resource-server的任何API调用中。
使用这个SecurityFilterChain配置,我允许所有请求,它避免了spring-security'的默认登录形式。现在我也需要绕过注销重定向。
请帮帮我

bfnvny8b

bfnvny8b1#

如果可以整体禁用这个spring安全注销处理,那就更好了。
只提供任何关于注销的信息(没有处理程序,没有成功处理程序,没有端点,什么都没有)。
登录和注销在OAuth2资源服务器上都没有意义。这是OAuth2客户端关注的问题。请参阅我的教程中的OAuth2基础部分。
另外,请参阅resource server tutorial内部以向未经授权的请求返回正确的401(而不是302 * 重定向到登录 *):

http.exceptionHandling(eh -> eh.authenticationEntryPoint((request, response, authException) -> {
    response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Bearer realm=\"Restricted Content\"");
    response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
}));

相关问题