div class="col-xs-8">
label><input type="password" id="pwd" name="pwd" />
<input type="checkbox" id= "<em>remember-me</em> " name="<em>remember-me</em>"/> <label for="<em>remember-me</em>"> 记住我 </label> <input type="submit" value="登录" input type="password" id="pwd" name="pwd" /> <input type="checkbox" id="<em>remember-me</em> " name="<em>remember-me</em>" /> <label for="<em>remember-me</em>"> 记住我 </label> <input type="submit" value原理 清除Cookie 清除当前用户的remember-me记录 使当前session失效 清空当前的SecurityContext 重定向到登录界面 Spring Security的退出请求(默认为 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // 2 清空Cookie、remember-me CookieClearingLogoutHandler清空Cookie PersistentTokenBasedRememberMeServices清空remember-me SecurityContextLogoutHandler
("/login") .and() .httpBasic() .realmName("Spittr") .and() ... } 启用remember-me <input id="<em>remember-me</em>" name="<em>remember-me</em>" type="checkbox"/> <lable for="<em>remember-me</em>" class="inline"> 为了实现这一点,登录请求必须包含一个名为remember-me的参数。
可以看到,登录数据中,除了 username 和 password 之外,还有一个 remember-me,之所以给大家看这个,是想告诉大家,如果你你需要自定义登录页面,RememberMe 这个选项的 大家注意到,这里多了一个 remember-me,这就是这里实现的核心,关于这个 remember-me 我一会解释,我们先来测试效果。 接下来,我们关闭浏览器,再重新打开浏览器。 了解到 cookie 中 remember-me 的含义之后,那么我们对于记住我的登录流程也就很容易猜到了了。 这里主要从两个方面来介绍,一个是 remember-me 这个令牌生成的过程,另一个则是它解析的过程。 这是 remember-me 令牌生成的过程。至于是如何走到 onLoginSuccess 方法的,大家可以参考松哥之前的文章:松哥手把手带你捋一遍 Spring Security 登录流程。
" value="true"/>
我们注意,系统访问 hello 接口的时候,携带的 cookie: 大家注意到,这里多了一个 remember-me,这就是这里实现的核心,关于这个 remember-me 我一会解释,我们先来测试效果 ---- 实现原理 当我们登陆的时候,除了用户名、密码,我们还可以勾选remember-me。 如果我们勾选了remember-me,当我们登录成功之后服务端会生成一个Cookie返回给浏览器,这个Cookie的名字默认是remember-me;值是一个token令牌。 如果不设置默认是remember-me。 rememberMeCookieName设置了保存在浏览器端的cookie的名称,如果不设置默认也是remember-me。 这里主要从两个方面来介绍,一个是 remember-me 这个令牌生成的过程,另一个则是它解析的过程。
this.logger.debug(LogMessage
.of(() -> "SecurityContextHolder not populated with remember-me rememberMeAuth);
this.logger.debug(LogMessage.of(() -> "SecurityContextHolder populated with remember-me rejected Authentication returned by RememberMeServices: '%s'; "
+ "invalidating remember-me 实现
传统 web 开发记住我实现
通过源码分析得知必须在认证请求中加入参数remember-me值为”true,on,yes,1”其中任意一个才可以完成记住我功能,这个时候修改认证界面:
<! "text"/>
密码:<input name="passwd" type="password"/>
记住我: <input type="checkbox" name="<em>remember-me</em>
username">
密码:<input type="password" name="password">
<input type="checkbox" name="<em>remember-me</em> 指定数据库连接池
token-validity-seconds="60" 设置token存储时间为60秒 可省略
remember-me-parameter="<em>remember-me</em> " 指定记住的参数名 可省略
-->
<security:remember-me token-validity-seconds="1200"
data-source-ref ="dataSource"
remember-me-parameter="remember-me" />
然后我们再登录测试,然后我们会发现刚刚的表结构中多了一条记录
允许匿名用户访问 authenticated() --- 允许认证过的用户访问 denyAll() --- 无条件拒绝所有访问 fullyAuthenticated() --- 如果用户是完整认证的话(不是通过Remember-me String) --- 如果用户具备给定角色的话,就允许访问 not() --- 对其他访问方法的结果求反 permitAll() --- 无条件允许访问 rememberMe() --- 如果用户是通过Remember-me ,结果为true isAuthenticated() --- 如果当前用户进行了认证的话,结果为true isFullyAuthenticated() --- 如果当前用户进行了完整认证的话(不是通过Remember-me 功能进行的认证),结果为true isRememberMe() --- 如果当前用户是通过Remember-me自动认证的,结果为true permitAll --- 结果始终为true principal
Spring Security内置了remember-me的Cookie机制,只要配置就可实现记住登录状态的功能。 (1)在<http>元素下添加<remember-me>子元素,开启功能。 > </http> (2)在登录表单中添加“name”等于“remember-me”的checkbox。 " /> </form> 至此,当用户选择“记住登录状态”时,登录时将会多产生一个名为“remember-me”的长期cookie,用作下次免登录的标识。 不使用remember-me登录后的cookie 使用remember-me登录后的cookie 4 账户密码的散列加密 在实际应用中,我们往往需要对密码进行散列处理,以免被后台管理人员盗取,也就是说
退出原理 清除Cookie 清除当前用户的remember-me记录 使当前session失效 清空当前的SecurityContext 重定向到登录界面 Spring Security的退出请求(默认为 request, response, auth); return; } chain.doFilter(request, response); } 匹配当前拦截的请求 处理 清空Cookie、remember-me CookieClearingLogoutHandler清空Cookie PersistentTokenBasedRememberMeServices清空remember-me SecurityContextLogoutHandler
--使用表单登录--> <security:remember-me key="xx"/> <security:logout logout-url="/logout" logout-success-url JaasApiIntegrationFilter http/@jaas-api-provision REMEMBER_ME_FILTER RememberMeAuthenticationFilter http/remember-me
spring-security.xml 最简单的配置 1 <http auto-config="true" use-expressions="true"> 2 ... 3 <remember-me PERSISTENT_LOGINS 11 add constraint PK_PERSISTENT_LOGIN primary key (series); 然后将spring-security.xml中<remember-me /> 改为: 1 <remember-me data-source-ref="dataSource" 2 token-validity-seconds="1209600" 3 remember-me-parameter="remember-me" /> data-source-ref指定数据源,token-validity-seconds表示cookie的有效期(秒为单位),
,然后2a10 rememberme原理 当设置这个rememberme之后,登录的时候会生成JSESSION 和 remember-me两个字段给前端。 remember的生成过程 Base64(Base64(用户名):Base64(过期时间):Base64(用户名和密码和过期时间加密)) remember的使用过程 判断是否有这个remember-me
一.使用理由
Spring Security 中Remember Me为“记住我”功能,用户只需要在登录时添加remember-me复选框,取值为true。 username"/>
密码:<input type="text" name="password"/>
记住我: <input type="checkbox" name="<em>remember-me</em>
一、修改登录页面:login.html 在登录页面中添加自动登录复选框,自动登录字段名必须为:remember-me <! input type="password" name="password">
rememberMeServices AbstractRememberMeServices#loginSuccess private String parameter = DEFAULT_PARAMETER;//remember-me rememberMeRequested(request, parameter)) { logger.debug("Remember-me login not requested."); return logger.error("Failed to save persistent token ", e); } } 获取用户名 创建Token 存储都数据库 写入到浏览器的Cookie中 二次登录Remember-me
Exception e) { logger.error("Failed to save persistent token ", e); } } 二次登录Remember-me request, response); // 4 检查用户凭证 userDetailsChecker.check(user); logger.debug("Remember-me
首先,当我们单击登录按钮时,多了一个请求参数 remember-me,如图6-3所示。 很明显,remember-me 参数就是用来告诉服务端是否开启 RememberMe 功能,如果开发者自定义登录页面,那么默认情况下,是否开启 RememberMe 的参数就是 remember-me。 在响应头中给出了一个 remember-me 字符串。以后所有请求的请求头 Cookie 字段,都会自动携带上这个令牌,服务端利用该令牌可以校验用户身份是否合法。 大致的流程就是这样,但是大家发现这种方式安全隐患很大,一旦 remember-me 令牌泄漏,恶意用户就可以拿着这个令牌去随意访问系统资源。持久化令牌和二次校验可以在一定程度上降低该问题带来的风险。