Kir*_* Ch 6 java spring spring-security
有人可以说这是一个重复的问题,但我查看了很多答案,尝试了很多方法但无法理解我错过了什么。
我在我的 REST 服务器中使用了非常基本的 Spring Security。当我第一次直接从浏览器向我的服务器发出请求到localhost:.../getData我当然会被要求授权。
然后服务器每次都允许这个请求。我如何注销以便下一个请求再次需要授权?
现在我尝试在我的服务器上使用几种方法来注销:
@RequestMapping(value = "/logoutMe2", method = RequestMethod.GET)
public void logout2() {
SecurityContextHolder.getContext().setAuthentication(null);
}
@RequestMapping(value = "/logoutMe3", method = RequestMethod.GET)
public void logout3() {
SecurityContextHolder.clearContext();
}
@RequestMapping(value = "/logoutMe", method = RequestMethod.GET)
public void logout(HttpServletRequest rq, HttpServletResponse rs) {
SecurityContextLogoutHandler securityContextLogoutHandler =
new SecurityContextLogoutHandler();
securityContextLogoutHandler.logout(rq, rs, null);
}
@RequestMapping(value = "/logoutMe4", method = RequestMethod.GET)
public static void myLogoff(HttpServletRequest request, HttpServletResponse response) {
CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
cookieClearingLogoutHandler.logout(request, response, null);
securityContextLogoutHandler.logout(request, response, null);
}
Run Code Online (Sandbox Code Playgroud)
如果我使用直接链接
我收到“未找到”错误。
我缺少什么?好像忘记了一些明显的事情……
编辑:正如其他人指出的那样,OP 遇到的问题是由于 BasicAuth 标头造成的。下面的答案并不能解决问题。
=====
Spring security 默认提供一个 URL /logout。
您可以使用WebSecurityConfigurerAdapter如下方式配置不同的 URL:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.logout()
.logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler)
.invalidateHttpSession(true)
.addLogoutHandler(logoutHandler)
.deleteCookies(cookieNamesToClear)
.and()
...
}
}
Run Code Online (Sandbox Code Playgroud)
以上是java配置。如果您使用 xml 命名空间配置,它将类似于以下内容:
<security:http>
...
<security:logout logout-url="/app/logout" />
...
</security:http>
Run Code Online (Sandbox Code Playgroud)
更多信息可以在以下链接中找到:
现在,有趣的是为什么你的logoutMe4不起作用。我不知道答案。它似乎做了足够的事情来完成注销,但我不知道您的完整配置,因此可能有一些内容尚未清除/无效。无论如何,您应该使用受支持的配置来执行注销,而不是手动执行注销,但仍然可以通过检查 spring-security 源代码并查看该类如何LogoutConfigurer配置SecurityContextLogoutHandler.
| 归档时间: |
|
| 查看次数: |
6683 次 |
| 最近记录: |