`
野之皇
  • 浏览: 21072 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

根据Remember-Me进行自动登录(4)

阅读更多

根据Remember-Me进行自动登录

如果用户在登录时选择了Remember-Me的功能(即勾选“5天内不用再登录”复选框),登录成功后用户名/密码的信息就保存在客户机的Cookie中。下次用户直接访问站点的安全页面时,必须有一个过滤器能够自动调用RememberMeServices#autoLogin()完成自动登录的操作,这便是通过RememberMeProcessingFilter过滤器来完成的:

代码清单 14 applicationContext-acegi-security.xml

Remember-Me自动登录
<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
…
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,
logoutFilter,rememberMeProcessingFilter ①处理自动登录的过滤器
</value>
</property>
</bean>
<bean id="rememberMeProcessingFilter" ②自动登录过滤器
class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>②-1
<property name="authenticationManager" ref="authenticationManager"/>②-2
</bean>
<bean id="rememberMeServices" ③
class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="tokenValiditySeconds" value="432000"/>
<property name="key" value="baobaotao"/>
<property name="userDetailsService" ref="userDetailsService" />③-1
</bean>
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
<bean class="org.acegisecurity.providers.rememberme. ④
RememberMeAuthenticationProvider">
<property name="key" value=" baobaotao"/>
</bean>
</list>
</property>
</bean> 

首先,我们在过滤器链中添加一个rememberMeProcessingFilter,它负责对所有HTTP请求进行拦截,当发现SecurityContextHolder中没有包含有效的Authentication对象时,自动调用RememberMeServices#autoLogin()方法从Cookie中获取用户名/密码的编码串进行自动登录。所以rememberMeProcessingFilter首先要注入一个RememberMeServices Bean,如②-1所示。

在 代码清单 12中已经定义了一个被AuthenticationProcessingFilter 使用的RememberMeServices Bean。我们在前面说过, AuthenticationProcessingFilter在注入RememberMeServices Bean后,就会在适合的时候调用RememberMeServices#loginSuccess()方法将用户凭证保存到Cookie中。而RememberMeProcessingFilter则会调用RememberMeServices#autoLogin()方法对保存在Cookie中的用户凭证执行自动认证的操作。前者是将Authentication中的用户名/密码写入到Cookie中,而后者需要据此获得对应的UserDetails,进而再重现出Authentication对象。正如你所想到的一样,RememberMeServices需要通过一个UserDetailsService来完成这项工作,所以我们需要调整RememberMeServices的配置,如③-1所示。

rememberMeProcessingFilter通过rememberMeServices获取对应Cookie中用户的UserDetails后,就必须进行用户身份认证。这项工作依然委托给authenticationManager完成,所以在②-2中,我们给rememberMeProcessingFilter注入了authenticationManager Bean。

authenticationManager如何对基于Cookie的用户凭证进行认证呢?显然,不能采用原来的daoAuthenticationProvider所用的方法,因为Cookie所提供用户凭证和登录表单提供的用户凭证在格式上存在很大的差异。基于Remember-Me的用户名/密码信息是经过特殊编码的字符串,Acegi通过RememberMeAuthenticationProvider负责对基于Cookie的用户凭证信息进行认证。所以你必须将该认证提供者添加到authenticationManager中,如④所示,注意key属性的设置,它和 代码清单 12中的key必须相同。如果保存在数据库中的密码使用了特殊编码,则你必须为RememberMeAuthenticationProvider配置特定的密码编码器,请参考代码清单 8进行配置。

删除Remember-Me的Cookie

站点如何提供了Remember-Me的功能,就必须同时提供能让用户手工删除Cookie的功能,以便用户在某些情况下,能够删除掉Cookie。Acegi提供了一个并不是很理想的实现:在退出系统时通过配置一个LogoutHandler清除Remember-Me的Cookie。

在上一节中,我们知道SecurityContextLogoutHandler是LogoutHandler的实现类,它负责在退出系统时删除HttpSession中的SecurityContext。LogoutHandler接口的另一个实现类是TokenBasedRememberMeServices(如前所述,它同时也实现了RememberMeServices接口)。你可以在LogoutFilter中添加TokenBasedRememberMeServices,以便用户退出系统时连带清除Remember-Me。

由于TokenBasedRememberMeServices已经在前面配置好了,这里仅需要简单地将其加入到LogoutFilter的LogoutHandler列表中即可,如下所示:

代码清单 15 applicationContext-acegi-security.xml:清除Remember-Me的Cookie

<bean id="logoutFilter"
class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/index.jsp" />
<constructor-arg>
<list>
①添加清除Remember-Me Cookie的LogoutHandler
<ref bean="rememberMeServices"/>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
</list>
</constructor-arg>
<property name="filterProcessesUrl" value="/j_acegi_logout" />
</bean>
… 

 

想象一下,这种处理方式是否合理呢?可以说不合理得近乎点荒唐——用户在登录时选择启用Remember-Me功能,就是希望在退出系统后能够在Cookie中保留用户信息,方便后续系统的访问,现在居然在退出系统后就清除掉这个Cookie。也就是说,Remember-Me Cookie仅在用户登录到用户退出系统这段时间内有效,但这段时间我们根本不需要用到这个Cookie! httpSessionContextIntegrationFilter已经很好地通过HttpSession的转存实现了在不同请求之间共享Authentication的功能。

所以Acegi提供的这种设计,笔者认为只是一个使用范例,开发者必须编写自己的实现类以提供更有意义的实现。如在用户退出系统时,允许用户通过选择的方式决定是否删除Remember-Me的Cookie,或者专门提供一个清除Remember-Me Cookie的操作链接。

小结

使用Acegi,你就可以通过配置的方式完成应用程序的身份认证。这包括对密码进行加密的认证,使用Remember-Me,退出系统后清楚Session等在身份认证时常用的各项功能。用户认证是Acegi保护应用系统的第一步,因为只能获取操作用户的身份后,才能获取用户的权限,并根据用户权限进行程序安全控制。

分享到:
评论

相关推荐

    remember-me-feature

    通过Vaadin实施“记住我” 登录表单最常见的功能之一是“记住我”功能,即使HTTP会话期满后,该功能也允许用户从特定计算机上自动登录。 此示例应用程序显示了如何使用Vaadin实现“记住我”功能。 您可以在阅读完整...

    Spring Security学习之rememberMe自动登录的实现

    主要给大家介绍了关于Spring Security学习之rememberMe自动登录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    springsecurity3.0.5

    如果把那个临时cookie删除的话,则springsecuriyt生成新的session,user验证信息在本次登录中不存在,故需要从新登录(如果前面已经选择了rememberMe的话就自动登录,否则重新手动输入用户名和密码登录)。...

    软件课程设计 试验报告 代码 演示

    本题主要是要求设计一个可以自动生成四则运算的测试器,并且完全由用户决定出加、减、乘、除哪一种运算题,以及出一位数还是两位数的运算题,同时还要对用户给出的答案的对错进行判断。在程序运行过程中,用户可以...

    第03篇:Shiro 反序列化漏洞利用汇总1

    1、Shiro rememberMe反序列化漏洞(Shiro-550) 3、一键自动化漏洞利用 1、Shiro rememberMe反序列化漏洞(Shiro-5

    spring security 参考手册中文版

    37.5.1自动令牌包含 271 37.5.2解析CsrfToken 272 第七部分 Spring数据集成 273 38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 ...

    一个简单的后台管理系统-基于Java SSM,Java Config配置+源代码+文档说明

    * RememberMe * 菜单信息在数据库配置,前台渲染成菜单列表 * more ## 3开发环境 * Java SSM(Java Config) * 权限Spring Security * 缓存Ehcache(后期加入) * 后台数据校验Hibernate Validation(后期加入) * more...

    wifi-login-portal

    登录到wifi 记住您的凭据,因此您不必一遍又一遍地键入(请不要在公用计算机上这样做) 在不登录wifi的情况下注销您(累计,我认为这样做已经浪费了很多时间) 自动按小时登录(实验性功能,可能无法按预期工作) 让...

    AllLoginTests:适用于所有可能的登录测试方案的功能文件

    登录测试目标创建用于登录页面测试的方案的详尽列表登录页面考虑一个简单的登录页面,其中包含username field , password field , login button , forgot password link , remember me checkbox并create new ...

    PHP登录系统:具有登录,注册,用户配置文件,配置文件编辑,通过电子邮件进行帐户验证,密码重置系统,“记住我”功能等的嵌入式安全PHP身份验证系统

    可嵌入且高度安全PHP身份验证系统,包括登录,注册,用户配置文件,配置文件编辑,通过电子邮件进行帐户验证,密码重置系统,记住我功能,不活动时自动注销,全局错误和状态变量系统,身份验证检查等。 目录 入门 ...

    shiro权限框架例子

    使用spingmvc、shiro权限框架做的一个小例子,例子是基于简单的SpringMvc和shiro的配置完成,动态分配权限也写的相对简单,主要是在RememberMe中想在关闭网页后下次自动获取登录这点本人比较模糊,希望有大虾指点...

    shiroPoc

    转发器界面中快捷,生成有效载荷默认kph密钥,cc2利用链,获取信息,如果需要修改,请快捷选择配置生成后,会自动替换requestcontent,并攻击当然,这个jar包也可以直接在命令行下运行,生成rememberMe,或者检测,...

    SpringAll_wuyouzhuguli.tar.gz

    Spring Boot Shiro Remember Me Spring Boot Shiro权限控制 Spring Boot Shiro Redis Spring Boot Shiro Ehcache Spring Boot Thymeleaf中使用Shiro标签 Spring Boot Shiro在线会话管理 Spring Boot Shiro整合JWT 三...

    内存管理内存管理内存管理

    sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量: 清单 2. 分配程序初始化...

    ZendFramework中文文档

    10.5.7. 根据主键查找数据 10.5.8. 取回一条记录 10.5.9. 取回多条记录 10.5.10. Adding Domain Logic 10.6. Zend_Db_Table_Row 10.6.1. 简介 10.6.2. 取回一条记录 10.6.3. 修改数据 10.7. Zend_Db_Table_...

Global site tag (gtag.js) - Google Analytics