Spring Security CookieTheftException

标签 spring spring-mvc spring-security spring-boot remember-me

我在 Spring Boot 应用程序中使用 PersistentTokenBasedRememberMeServices (Spring Security 4.0.3)。这是 token 配置的片段:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
        .failureHandler(myAuthenticationFailureHandler).loginProcessingUrl("/login").usernameParameter("username").passwordParameter("password")
        .and().exceptionHandling()
        .and().authorizeRequests()
        .antMatchers(this.getOpenURLS()).permitAll().anyRequest().authenticated().and().addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class).csrf().csrfTokenRepository(csrfTokenRepository())
        .and().rememberMe().rememberMeServices(rememberMeServices()).key(C_REMEMBER_ME_APP_KEY).and().logout();
    }

    @Bean
    public AbstractRememberMeServices rememberMeServices() {
        PersistentTokenBasedRememberMeServices rememberMeServices = null;
        try {
            rememberMeServices = new PersistentTokenBasedRememberMeServices(C_REMEMBER_ME_APP_KEY, userDetailsService, persistentTokenRepository());
            rememberMeServices.setTokenValiditySeconds((int) TimeUnit.SECONDS.convert(2, TimeUnit.DAYS));
            rememberMeServices.setParameter(C_REMEMBER_ME_PARAMETER);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rememberMeServices;
    }

配置按预期工作,我遇到的问题是我无法处理/捕获 org.springframework.security.web.authentication.rememberme.CookieTheftException每当提出这个问题。例如,因为我想确保我可以捕获这个异常,我开始与一个用户的 session ,进入数据库并更改 token (存储在浏览器中的不同值)并重新启动 tomcat 服务器。当我尝试访问该应用程序时,立即出现 CookieTheftException被抛出。

我的配置中有一个 SimpleMappingExceptionResolver Bean,如下所示:
@Bean(name = "simpleMappingExceptionResolver")
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
    SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();        
    Properties mappings = new Properties();

    mappings.setProperty("CookieTheftException", "cookieException");
    mappings.setProperty(".CookieTheftException", "cookieException");
    mappings.setProperty("org.springframework.security.web.authentication.rememberme.CookieTheftException", "cookieException");

    r.setOrder(Integer.MIN_VALUE);
    r.setExceptionMappings(mappings); 
    r.setDefaultErrorView("error"); 
    r.setExceptionAttribute("ex");
    r.setWarnLogCategory("example.MvcLogger");
    return r;
}

另外,我添加了这样的@ControllerAdvice:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {

public static final String DEFAULT_ERROR_VIEW = "errorCookie";

@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", e);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName(DEFAULT_ERROR_VIEW);
    return mav;
}

}

不幸的是,这些都无法捕获异常。奇怪的是,如果我在任何 Controller 中手动引发异常,则当前配置成功处理异常。

看起来由于 DispatcherServlet 抛出异常,@ControllerAdvice 和 SimpleMappingExceptionResolver 都能够捕获异常?我错过了什么吗?任何帮助将不胜感激。谢谢。

最佳答案

我为此挣扎了很长时间,找不到任何有意义的东西。当我正在研究您使用 ErrorController 的建议时作为一种解决方法,我注意到 BasicErrorController说这个:
* {@code @ExceptionHandler}) or by adding servlet * {@link AbstractEmbeddedServletContainerFactory#setErrorPages container error pages}.
既然你说你的工作有效,我认为可以通过使用 addErrorPages 将它们添加到 servlet 容器中来捕获相同的错误。 .瞧,我的 @Configuration类(class):

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return container -> {
        container.addErrorPages(new ErrorPage(CookieTheftException.class, "/login"));
    };
}

我只是希望用户在此异常后必须再次登录,因此您可以看到我只是将他们发送到登录页面。

关于Spring Security CookieTheftException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715818/

相关文章:

java - 设置蒲公英数据表中的可见行数

java - org.hibernate.LazyInitializationException : could not initialize proxy - no Session. Spring + Hibernate + HSQLDB

java - 如何使基本身份验证作为 Angular JS/Spring 启动应用程序中的 keycloak 的替代方案

java - POST 请求得到 405 响应,而不是由 access-denied-handler 处理

java - Spring Security Java Config 未生成注销 url

spring - 如何为 Spring Integration JDBC 出站 channel 适配器创建动态查询?

java - 是否有 uuid validator 注释?

java - Spring MVC Json 解析限制的最佳解决方法

java - 通过java代码向Spring 3添加组件

spring-mvc - 除非使用GobalScope调用,否则将依次调用kotlin异步调用