基础4-Spring MVC下整合-remember-me

关键源码

下面是AbstractRememberMeServices.loginSuccess、rememberMeRequested、onLoginSuccess方法的源码:

private String parameter = "remember-me"; public final void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) { if (!this.rememberMeRequested(request, this.parameter)) { this.logger.debug("Remember-me login not requested."); } else { this.onLoginSuccess(request, response, successfulAuthentication); } } protected boolean rememberMeRequested(HttpServletRequest request, String parameter) { if (this.alwaysRemember) { return true; } else { String paramValue = request.getParameter(parameter); if (paramValue != null && (paramValue.equalsIgnoreCase("true") || paramValue.equalsIgnoreCase("on") || paramValue.equalsIgnoreCase("yes") || paramValue.equals("1"))) { return true; } else { if (this.logger.isDebugEnabled()) { this.logger.debug("Did not send remember-me cookie (principal did not set parameter " + parameter + ")"); } return false; } } } protected abstract void onLoginSuccess(HttpServletRequest var1, HttpServletResponse var2, Authentication var3);

在loginSuccess方法中,通过parameter参数来获取该参数值,而parameter参数的key就是remember-me;

如果remember-me对应的值是true、on、yes、1中的任何一种,都可以看做是用户调用了remember-me的功能;

然后loginSuccess方法在启用remember-me功能后,紧接着调用了onLoginSuccess方法,下面看看该方法的实现类:

PersistentTokenBasedRememberMeServices.onLoginSuccess方法:

protected void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) { String username = successfulAuthentication.getName(); this.logger.debug("Creating new persistent login for user " + username); PersistentRememberMeToken persistentToken = new PersistentRememberMeToken(username, this.generateSeriesData(), this.generateTokenData(), new Date()); try { this.tokenRepository.createNewToken(persistentToken); this.addCookie(persistentToken, request, response); } catch (Exception var7) { this.logger.error("Failed to save persistent token ", var7); } }

这里通过tokenRepository.createNewToken方式保存到数据库,然后再通过addCookie方式保存到客户端浏览器中,因此,理论上来讲,只要用户不清理浏览器的cookie,基本上就可以长久使用remember-me功能;

开发过程

①页面编写一个input框,name属性为remember-me,value属性为true/on/yes/1;

②开启remember-me过滤器:

<security:http auto-config=”true” use-expressions=”true”> <security:remember-me token-validity-seconds=”60”> 开启remember-me过滤器,且设置token存储时间为60秒 </security:http>

remember-me安全性问题

由于cookie存储在客户端浏览器,再加上很多浏览器可以提供对cookie的编辑功能,这里就存在着其他人把合规用户的cookie放到自己的名下,进而对应用造成影响;

这里也需要应用在数据库层面创建存储cookie信息的表,这个表被Spring Security来使用:

create table persistent_logins(){ username varchar(64) not null, series varchar(64) not null, token varchar(64) not null, last_used timestamp not null, primary key (‘series’) }

然后配置该表对应的数据库连接信息:

<security:remember-me data-source-ref=”datasource”指定数据库连接池 token-validity-seconds=”60”设置token存储时间为60秒 remember-me-parameter=”remember-me”指定记住的参数名,不一定非要用remember-me />
经验分享 程序员 微信小程序 职场和发展