您的位置:首页 > 其它

acegi 用户登录成功后记录用户登录日志

2009-07-24 15:46 302 查看
最近整理了一下开发工作,在开发过程中,对用户的登录日志进行记录,是每个系统最基础的工作,faceye使用了acegi作为基础安全框架,也需
要对用户登录日志进行记录,查阅了一下网上的资料,有提到使用Spring的ApplicationEvent来做的,主要是做一个
ApplicationListener,判断event类型,如果是用户登录成功event,就做日志记录.

看了一下,不太喜欢,于是,打开acegi的源码来看了一下,顺便说一下,这里的源码指的是acegi2.0.

当前使用到的用户登录,主要有两种类型,一种输入用户名密码登录,另一种是根据cookie记录进行登录,所以,要针对这两个Filter进行修改.

通常,我们使用的登录验证器是这个:AuthenticationProcessingFilter

所做的配置为:

<beanid="authenticationProcessingFilter"

class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">

....

</bean>

那么,在这里,就需要对这个类进行一下重载

在这个类中,要看其父类中的:AbstractProcessingFilter的doFilterHttp方法

整体方法如下:

viewsource
print
?

01.

public

void

doFilterHttp(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainchain)

throws

IOException,


02.


ServletException{


03.


if

(requiresAuthentication(request,response)){


04.


if

(logger.isDebugEnabled()){


05.


logger.debug(

"Requestistoprocessauthentication"

);


06.


}


07.


AuthenticationauthResult;


08.


try

{


09.


onPreAuthentication(request,response);


10.


authResult=attemptAuthentication(request);


11.


}


12.


catch

(AuthenticationExceptionfailed){


13.


//Authenticationfailed


14.


unsuccessfulAuthentication(request,response,failed);


15.


return

;


16.


}


17.


//Authenticationsuccess


18.


if

(continueChainBeforeSuccessfulAuthentication){


19.


chain.doFilter(request,response);


20.


}


21.


successfulAuthentication(request,response,authResult);


22.


return

;


23.


}


24.


chain.doFilter(request,response);


25.


}


在这里,acegi已经给我们预留了登录成功后置事件接口,successfulAuthentication(...)

在这个方法里面,调用了一个空方法:

onSuccessfulAuthentication(request,response,authResult);

这个方法,在acegi的代码中,是一个懒汉型的,它只会在用户登录成功后被调用,如果用户登录失败,会相应的调用方法:

unsuccessfulAuthentication(HttpServletRequestrequest,HttpServletResponseresponse,AuthenticationExceptionfailed)

其中对应的后置方法为:

onUnsuccessfulAuthentication(request,response,failed);

这两个方法,都为懒汉型的,要对用户的登录动作(成功,失败)进行记录,只需要重载这两个方法即可.

所以,进行如下实现:

viewsource
print
?

01.

/**


02.


*


03.


*


04.


*@author:haipeng


05.


*@CopyRight:www.faceye.com


06.


*@System:www.faceye.com


07.


*@Create2009-7-20


08.


*@Packagecom.faceye.components.security.intercept


09.


*@Description:


10.


*/


11.

public

class

UserAuthenticationProcessingFilter

extends

AuthenticationProcessingFilter


12.

{


13.


private

IUserServiceuserService=

null

;


14.


private

IUserLoginLogServiceuserLoginLogService=

null

;


15.


public

IUserLoginLogServicegetUserLoginLogService()


16.


{


17.


return

userLoginLogService;


18.


}


19.



20.


public

void

setUserLoginLogService(IUserLoginLogServiceuserLoginLogService)


21.


{


22.


this

.userLoginLogService=userLoginLogService;


23.


}


24.


public

IUserServicegetUserService()


25.


{


26.


return

userService;


27.


}


28.



29.


public

void

setUserService(IUserServiceuserService)


30.


{


31.


this

.userService=userService;


32.


}


33.



34.


protected

void

onSuccessfulAuthentication(HttpServletRequestrequest,HttpServletResponseresponse,AuthenticationauthResult)

throws

IOException


35.


{


36.


if

(

null

!=authResult)


37.


{


38.


Stringusername=

null

;


39.


Objectobj=authResult.getPrincipal();


40.


if

(obj

instanceof

UserDetails){


41.


username=((UserDetails)obj).getUsername();


42.


}

else

{


43.


username=obj.toString();


44.


}


45.


WebAuthenticationDetailswebDetails=(WebAuthenticationDetails)authResult.getDetails();


46.


Stringip=webDetails.getRemoteAddress();


47.


if

(StringUtils.isNotEmpty(username))


48.


{


49.


Useruser=(User)((UserDetailsService)

this

.getUserService()).loadUserByUsername(username);


50.


if

(

null

!=user)


51.


{


52.


UserLoginLogentity=

new

UserLoginLog();


53.


entity.setUser(user);


54.


entity.setIp(ip);


55.


this

.getUserLoginLogService().save(entity);


56.


}


57.


}


58.


}


59.


}


60.

}


以此来记录用户的登录日志,当然,还可以实现相应的:

onUnsuccessfulAuthentication(request,response,failed);

与上述代码类似.

同时,用户还可能通过RemeberMe功能进行自动登录,这时,就需要对另外一个进行重载,代码如下:

viewsource
print
?

01.

/**


02.


*


03.


*


04.


*@author:haipeng


05.


*@CopyRight:www.faceye.com


06.


*@System:www.faceye.com


07.


*@Create2009-7-20


08.


*@Packagecom.faceye.components.security.intercept


09.


*@Description:


10.


*/


11.

public

class

UserRememberMeProcessingFilter

extends

RememberMeProcessingFilter


12.

{


13.


private

IUserServiceuserService=

null

;


14.


private

IUserLoginLogServiceuserLoginLogService=

null

;


15.


public

IUserServicegetUserService()


16.


{


17.


return

userService;


18.


}


19.


public

void

setUserService(IUserServiceuserService)


20.


{


21.


this

.userService=userService;


22.


}


23.


public

IUserLoginLogServicegetUserLoginLogService()


24.


{


25.


return

userLoginLogService;


26.


}


27.


public

void

setUserLoginLogService(IUserLoginLogServiceuserLoginLogService)


28.


{


29.


this

.userLoginLogService=userLoginLogService;


30.


}


31.


protected

void

onSuccessfulAuthentication(HttpServletRequestrequest,HttpServletResponseresponse,


32.


AuthenticationauthResult){


33.



34.


if

(

null

!=authResult)


35.


{


36.


Stringusername=

null

;


37.


Objectobj=authResult.getPrincipal();


38.


if

(obj

instanceof

UserDetails){


39.


username=((UserDetails)obj).getUsername();


40.


}

else

{


41.


username=obj.toString();


42.


}


43.


WebAuthenticationDetailswebDetails=(WebAuthenticationDetails)authResult.getDetails();


44.


Stringip=webDetails.getRemoteAddress();


45.


if

(StringUtils.isNotEmpty(username))


46.


{


47.


Useruser=(User)((UserDetailsService)

this

.getUserService()).loadUserByUsername(username);


48.


if

(

null

!=user)


49.


{


50.


UserLoginLogentity=

new

UserLoginLog();


51.


entity.setUser(user);


52.


entity.setIp(ip);


53.


this

.getUserLoginLogService().save(entity);


54.


}


55.


}


56.


}


57.


}


58.

}


至此,便可以完整的记录用户的登录日志了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: