成功登录系统的后置处理
一般的业务系统在用户登录成功后,需要在数据库中记录一条相应的用户登录日志。我们可以通过Acegi提供的事件机制来完成这一功能。当用户身份认证成功后,Acegi会产生一个AuthenticationSuccessEvent事件,该事件是org.springframework.context.ApplicationEvent的子类,所以AuthenticationSuccessEvent是一个Spring容器事件。我们可以定义一个监听器响应该事件以记录用户登录日志,请看LoginSuccessListener的代码:
代码清单 9 LoginSuccessListener
package com.baobaotao.service;
import org.acegisecurity.Authentication;
import org.acegisecurity.event.authentication.AuthenticationSuccessEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class LoginSuccessListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof AuthenticationSuccessEvent) {①判断是否是认证成功的事件
AuthenticationSuccessEvent authEvent = (AuthenticationSuccessEvent)event;
Authentication auth = authEvent.getAuthentication();
String userName = auth.getName();
②这里,我们仅通过一条输出信息的语句模拟记录登录日志的操作
System.out.println("模拟记录用户["+userName+"]成功登录日志...");
}
}
}
通过扩展Spring的ApplicationListener接口定义一个监听Acegi AuthenticationSuccessEvent事务的监听器。在实际系统中,你可以使用DAO替换②处的逻辑,执行记录用户登录日志的操作。在编写好LoginSuccessListener后,剩下的工作就是在Spring容器中声明这个监听器,仅需要一行简单的配置就可以了:
<bean class="com.baobaotao.service.LoginSuccessListener"/>
这样,当用户登录并通过了Acegi的用户身份认证后, LoginSuccessListener监听器的onApplicationEvent()方法将接收到AuthenticationSuccessEvent事件。
在多个请求之间共享SecurityContext
我们知道SecurityContext保持着Acegi框架重要的Authentication对象,而SecurityContext保存在SecurityContextHolder中。然而SecurityContextHolder只为SecurityContext对象提供请求线程范围内的生命周期。也就是说,当一个登录认证请求结束后,用户相关的SecurityContext对象将从SecurityContextHolder中清除了。当用户发起下一个请求时,又必须重新进行身价认证,如何使SecurityContext在Session级别中进行共享呢?
Acegi通过HttpSessionContextIntegrationFilter解决这个问题,当一个请求到达时,它尝试从Session中获取用户关联的SecurityContext并将其放入到SecurityContextHolder中,当请求结束时,HttpSessionContextIntegrationFilter又将SecurityContext转存到HttpSession中。这样,Acegi就通过HttpSessionContextIntegrationFilter将SecurityContext对象在请求级的SecurityContextHolder和Session级的HttpSession中摆渡,从而保证SecurityContext可以在多个请求之间共享。
在过滤器链中,HttpSessionContextIntegrationFilter必须位于认证处理过滤器之前,这样认证处理过滤器当发现SecurityContextHolder中已经拥有和用户关联的经过认证的Authentication时,就可以短路掉用户身份认证的步骤:
代码清单 10 applicationContext-acegi-plugin.xml
通过HttpSession转存请求之间的SecurityContext
<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
…
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter ①
</value>
</property>
</bean>
<bean id="httpSessionContextIntegrationFilter" ②通过HttpSession转存SecurityContext的过滤器
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
…
在①处,我们将httpSessionContextIntegrationFilter放置在authenticationProcessingFilter之前。如果用户还未通过身份认证,httpSessionContextIntegrationFilter在HttpSession中找不到对应的SecurityContext,这时authenticationProcessingFilter将启用正常的认证流程。反之,如果已经通过了身份认证,SecurityContext将直接从HttpSession中获取。
分享到:
相关推荐
前置条件是用户登录到系统中,后置条件是如果这个用例成功,系统建立预定记录。否则,系统的状态没有变化。基本路径包括读者登录网上图书管理系统,查询到自己喜欢的书籍进行预订。 本资源摘要了图书管理系统的六个...
- **后置条件**:成功登录后,网站的用户信息板块将显示登录用户的详细信息。 - **基本路径** - 用户访问首页。 - 用户输入电子邮箱和密码。 - 用户点击“登录”按钮。 - 系统验证登录信息后,将用户重定向回...
本篇将基于给定的“计算机0802”课程材料,深入解析两个核心用例——取款与存款,在UML视角下的详细流程、参与者、前置条件、后置条件以及异常处理机制,以此揭示银行系统管理的内在逻辑。 ### 取款用例描述 #### ...
- 前置条件:图书管理员需登录系统。 - 后置条件:成功借阅则记录借阅信息,如有预定则取消预定;失败则系统状态不变。 - 扩展点:借阅者预定了书刊。 - 事件流:包括书刊检索、借阅状态确认、借阅者信息验证、...
- 数据流程:登录系统、选择操作、填写/修改/删除信息、保存。 - 前置条件:学生账户存在且登录成功。 - 后置条件:信息更新成功。 3. **登录功能**: - 功能简介:用户通过账号、密码进行身份验证。 - 数据...
- 前置条件:用户已登录系统。 - 后置条件:用户可在个人中心查看更新后的信息。 5. **管理员管理**: - 目标:管理员管理用户,对非法用户采取措施。 - 流程:管理员登录,浏览并处理不当问卷或封禁用户。 - ...
总经理登录系统。 2. 查看员工列表。 3. 修改员工信息。 4. 更新排班表。 5. 保存更改。 ##### 2.3 补充规格说明 - 系统需支持多用户并发访问。 - 系统具有数据备份与恢复功能。 - 界面友好,易于操作。 ####...
假设条件:图书管理员已经成功登录图书管理系统 基本操作流程: (1)图书管理员输入借阅证信息 (2)系统检查读者是否有超期的借阅信息与读者的借书数量是否已经达到借书限额 (4)图书管理员输入要借阅的图书...
- **系统登录用例图**:详细描述了用户与系统之间的登录交互流程。 - **系统用户购物用例图**:展示了用户在购物过程中的具体操作步骤,如添加商品至购物车、结算等。 - **卖家订单管理用例图**:针对管理员的角色,...
- **后置条件**:登录成功后,员工将被引导至与其职务相匹配的操作界面。 - **基本路径**: 1. 输入员工号。 2. 系统验证员工信息。 3. 验证成功后,进入相应的系统界面。 **UC2:录入商品信息** - **范围**:...
- **前置条件**:成功登录系统。 - **后置条件**:处理投诉信息。 - **正常流程**:登录 → 查看任务列表 → 提取任务 → 处理投诉。 #### 四、总结 本文档通过对旅游消费投诉管理系统的核心功能和用例进行详细...
后置条件描述了用例完成后系统的新状态,如图书已成功加入购物车。事件流则详细列出了正常流程及可能的异常情况,例如在图书缺货时,系统应提供相应的处理策略。 在Rational Rose中,每个用例都可以添加描述和非...
其它流:无后置条件:如果用例成功,将购物车内已配置计算机部件及数量存入临时数据库。 本文对二手车交易系统的需求进行了详细的分析,包括系统的目标设计、性能需求、运行环境要求、系统功能分析、UML用例图和...
系统通过事件流、前置条件、后置条件等要素,清晰地描述了注册过程中的各种可能情况,包括输入验证、信息保存和异常处理。此外,登录/注销功能同样被详细定义,确保用户能够顺利进入或退出系统。 在类设计中,每个...
系统用例模型将涵盖用户登录、商品浏览、购物车管理、订单处理、支付功能、用户评价等多个方面。 4.2. 系统用户描述 4.2.1. 会员用户描述 会员用户可以搜索商品、收藏商品、添加至购物车、进行购买、查看订单状态、...