Spring记住我使用MongoDB不会删除令牌

时间:2016-11-07 15:28:10

标签: mongodb spring-mvc spring-security remember-me

我按照this教程实现了MongoDB的remember-me功能。

当我单击登录页面中的rememberme复选框时,令牌将保存在数据库中。如果我手动删除数据库条目并且cookie JSESSIONID maxage已过期我将被注销,如果JSESSIONID已过期且记住我的cookie没有,我仍然登录,这很棒。

一切顺利,但我有一个问题。如果我手动从数据库中删除令牌条目,则永远不会调用removeUserTokens函数?如果是,我应该在哪里实现这个?

谢谢。

2 个答案:

答案 0 :(得分:2)

必须按Java doc手动删除(例如通过批处理)。

<强>对PersistentTokenBasedRememberMeServices

  

请注意,虽然此类将使用创建令牌的日期   检查呈现的cookie是否早于配置的cookie   在这种情况下,tokenValiditySeconds属性和拒绝身份验证,它   不会从存储中删除这些令牌。合适的批处理   应该定期运行以从数据库中删除过期的令牌。

PersistentTokenBasedRememberMeServices用于为用户存储持久登录令牌的抽象(PersistentTokenRepository)。

答案 1 :(得分:1)

在搜索了一下后,我发现当我退出并将其配置到我的配置时:

http.authorizeRequests().antMatchers("/signup", "/about").permitAll().antMatchers("/doctor/**")
            .hasRole("DOCTOR").anyRequest().authenticated().and().rememberMe().rememberMeParameter("remember-me")
            .tokenRepository(tokenRepository).tokenValiditySeconds(1209600).and().formLogin().loginPage("/login")
            .failureUrl("/login?error=true").permitAll().and().logout().logoutUrl("/logout")
            .deleteCookies("JSESSIONID").invalidateHttpSession(true).logoutSuccessUrl("/login").permitAll();....

调用removeUserTokens方法,并从db中删除关联的标记。我认为诀窍是:

.logout().logoutUrl("/logout")
            .deleteCookies("JSESSIONID").invalidateHttpSession(true)

同样如上面所述的notionquest,我在每个星期五凌晨3点添加了一个Spring cron作业,以防数据库中遗留一些内容。

@Scheduled(cron = "0 0 3 * * FRI")
public void doScheduledWork() {
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.WEEK_OF_MONTH, -2);

    tokenRepository.deleteBeforeDated(calendar.getTime());
    logger.info("INFO", "Cron job runed at " + new Date() + " until " + calendar.getTime() + " !");
}