成功登录系统的后置处理
一般的业务系统在用户登录成功后,需要在数据库中记录一条相应的用户登录日志。我们可以通过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中获取。
分享到:
相关推荐
本文件为机械行业适用,本代码为机械制造行业软件生成代码的后置处理。
瑞士GF公司的五轴加工中心,型号HEM_500U,这个五轴加工中心的数控系统为海德汉530系统。这个后置处理程序为Hypermill五轴后置处理程序,正版软件带来的。
论述了变截面叶片的结构和加工工艺,针对A回转台/B摆动轴式五轴联动数控机床的叶片加工,分析了后置处理中重要的机床运动轨迹坐标变换;就进、出汽边曲线段加工时,机床旋转自由度大幅摆动导致加工表面质量下降的问题,...
UG_德马吉的后置处理程序,包括立加和卧加的。
ArtCAM 后置处理编写说明 ArtCAM是世界顶级的艺术浮雕设计加工软件解决方案,是具有三十多年历史的英国Delcam公司的产品。
在机床上实际应用过,带换刀功能,并且加工时间等一应俱全。
jmeter用beanshell后置处理程序生成全局变量 jmx脚本(全)
五轴数控加工编程后置处理技术研究 五轴数控加工编程后置处理技术研究
精雕3.5维宏操作系统G代码后置修正.epst
文档文件
讲解了MASTERCAM后置处理系统设置的方法
五轴联动数控加工后置处理研究. 五轴联动数控加工后置处理研究.
基于MasterCAM9_0后置处理程序的二次开发.pdf
常用数控车CAD_CAM软件的后置处理设置.pdf
Mastercam后置处理文件及设定方法详解
瑞士GF公司的五轴加工中心,型号HEM_700U,这个五轴加工中心的数控系统为海德汉530系统。这个后置处理程序为Powermill五轴后置处理程序,pmoptz格式,与500U后置的区别是,这个后置处理支持循环19。
用于配置维宏系统机床的G代码的后置文件,可用有效去除某些G代码文件维宏系统报错的问题,可用于精雕等可配置后置文件的雕刻软件
ug后置处理教程
Mastercam 9 后置处理修改说明
基于MasterCAM9_0后置处理程序的修改