我按照this教程实现了MongoDB的remember-me功能。
当我单击登录页面中的rememberme复选框时,令牌将保存在数据库中。如果我手动删除数据库条目并且cookie JSESSIONID maxage已过期我将被注销,如果JSESSIONID已过期且记住我的cookie没有,我仍然登录,这很棒。
一切顺利,但我有一个问题。如果我手动从数据库中删除令牌条目,则永远不会调用removeUserTokens函数?如果是,我应该在哪里实现这个?
谢谢。
答案 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() + " !");
}