如何在Spring Security中设置一个与上下文路径不同的RememberMe cookie网址路径?
假设我网站的主页网址是(网址重写):
https://www.mysuperspecialdomain.com
我的登录页面有一个这样的网址:
https://www.mysuperspecialdomain.com/shop/account/login
成功登录后,RememberMe cookie的路径为/shop
(在浏览器中可见,例如Chrome)。这是项目的上下文路径。
这导致了这种情况,当我访问我的主页时,RememberMe没有登录。只有当我导航到一个以https://www.myspecialdomain.com/shop
开头的网址时,它才会这样做
答案 0 :(得分:2)
如果您使用的是Spring Security 4.1.0或更高版本,则可以配置cookie域,请参阅RememberMeConfigurer#rememberMeCookieDomain
:
记住我cookie的域名可见。
但您无法更改context path。
因此,您必须实现自己的RememberMeServices
(您可以创建现有的子类)并将其RememberMeConfigurer#rememberMeServices
添加到您的安全配置中。
答案 1 :(得分:1)
我找到了解决自己问题的方法 - 可以通过HttpServletResponseWrapper
来管理RememberMe-cookie的路径。这是解决方案(基于此答案https://stackoverflow.com/a/7047298/7095884):
定义HttpServletResponseWrapper:
public class RememberMeCookieResponseWrapper extends HttpServletResponseWrapper {
public RememberMeCookieResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void addCookie(Cookie cookie) {
if (cookie.getName().equals("shop")) {
cookie.setPath("/");
}
super.addCookie(cookie);
}
}
定义一个过滤器,它使用刚才定义的包装器包装servlet响应:
public class RememberMeCookieFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (response instanceof HttpServletResponse) {
HttpServletResponse newResponse =
new RememberMeCookieResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, newResponse);
}
}
}
将此过滤器添加到身份验证部分前面的Spring Filter Chain:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(new RememberMeCookieFilter(), UsernamePasswordAuthenticationFilter.class)
...