Spring安全保护注销url



我在我的项目中使用spring安全。我使用@ preauthorization注释配置安全端点。我希望spring安全保护注销URL,我在配置文件中指定了。

protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers(LOGOUT_URL).authenticated()
.anyRequest().permitAll()
.and()
.logout()
.logoutUrl(LOGOUT_URL)
.invalidateHttpSession(true)
.logoutSuccessHandler(logoutSuccessHandler);
}

这里我允许任何请求,除了注销。我猜这个配置只适用于@RestController端点。但是如何配置它来禁止未认证的用户使用logout

为了保护LogoutFilter处理的注销端点,在安全过滤器链配置中,LogoutFilter应该位于Authentication和Authorization Filters之后。

我们可以禁用默认的注销过滤器注册,并在AuthorizationFilter之后注册我们的LogoutFilter,如下所示:

protected void configure(HttpSecurity http) throws Exception {
// Initial configurations
// Add logout filter configuration
http.logout().disable()
.addFilterAfter(logoutFilter(), AuthorizationFilter.class);
}
@Bean
public LogoutFilter logoutFilter() {
return new LogoutFilter(oidcLogoutSuccessHandler()
, new SecurityContextLogoutHandler());          
}   

我试图禁用spring安全/logout默认处理程序并管理我自己的rest控制器方法。实际上,spring security在任何身份验证过滤器检查之前使用LogoutFilter。因此,一旦我们禁用logout,就像其他受保护的端点一样,请求将到达您自己的控制器,然后您可以在那里添加自定义退出逻辑。

http.authorizeHttpRequests()
.requestMatchers("/", "/signup",
"/login", "/token", "/login/google", "/login/facebook", "/confirmEmail",
"/sendResetPasswordEmail", "/resetPassword")
.permitAll()
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.logout {
it.disable()
}

我自己的注销控制器方法的工作

@GetMapping(
"/logout",
consumes = [MediaType.APPLICATION_JSON_VALUE],
produces = [MediaType.APPLICATION_JSON_VALUE]
)
fun logout(
request: HttpServletRequest,
response: HttpServletResponse,
jwtAuthToken: JwtAuthenticationToken
) : ResponseEntity<Any> {
val currentTime = LocalDateTime.now()
logger.info("JWT Token Value = $jwtAuthToken.principal")
// ADD YOUR OWN LOGOUT LOGIC HERE
return return ResponseEntity.ok().body(
LogoutResponseSuccess("Logged out successfully")
)
}

最新更新