论坛首页 Java企业应用论坛

整合ACEGI到现有系统-步骤祥解

浏览 15551 次
该帖已经被评为良好帖
作者 正文
   发表时间:2006-11-09  
初次使用,有不足之处还请多多指教。

前提:现有系统里已经有了很多跟User相关的类例如UserContext, UserInfo等,在原来的action里已经实现了登陆验证,并且已经
把登陆成功后返回的UserContext保存到session中了,在目前的程序中很多地方都已经使用了从保存在session中的UserContext获取
用户信息的代码了(当然这是一个统一的方法)

目标:在不改变现有代码的情况下集成ACEGI到系统中(当然Action中的login是肯定要改的了),我的意思是不改变代码中获得UserContext的方式

过程:
1:修改web.xml,加入FilterToBeanProxy,增加applicationContext-acegi-security.xml文件,按照sample配置这个xml文件,相关的配置
从前的帖子上有,请执行查找。

2:改造登陆过程,login页面必须包含j_username, j_password这两个字段,用来存放username和password,以便在AuthenticationProcessingFilter
中获得用户输入的用户名和密码,这一点有写霸道,必须用这两个名字,要么不用,这是我在系统里修改的第一个地方,不过再想想,我原来
再action中得到用户名和密码就是用来验证的,现在acegi做了这件是,我把原来的字段改掉也没有什么影响。

3:再AuthenticationProcessingFilter中我使用了daoAuthenticationProvider来验证用户的合法性,对于DaoAuthenticationProvider,它的
关键在于userDetailsService这个属性,DaoAuthenticationProvider通过userDetailsService来获得UserDetails,而我们系统中获得用户信息的
方法远比org.acegisecurity.userdetails.jdbc.JdbcDaoImpl复杂,在现有系统中有一个UserService接口专门来处理User相关的事情,所以我
对UserService接口的实现类UserServiceImpl进行了改造是期实现UserDetailsService接口,返回UserServece对象。

4:现有系统中UserContext类已经包含了完整的用户信息,系统中很多地方都用到了这个类,所以这个类不能够废除,方法是使UserContext
实现UserServece,其实在UserServiceImpl返回的UserServece对象就是UserContext类型的。

5:实现自己的passwordEncoder,由于系统中password的加密方式跟acegi提供的不同,所以么实现自己的passwordEncoder,其实只需要
继承org.acegisecurity.providers.encoding.BasePasswordEncoder,实现org.acegisecurity.providers.encoding.PasswordEncoder即可
在encodePassword方法中实现现有的加密方法,在isPasswordValid方法中判断密码的合法性。

6:action.login中的改动,原来login中从页面获得用户输入的用户名,密码调用UserService进行验证,返回UserContext对象,然后把UserContext
对象set到Session相关的对象中去,例如(简单起见)
session.setAttribute(someKey, uctx);

现在用户认证的过程被acegi做了,那action.login做什么呢?怎么得到UserContext呢,其实很简单
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();	
    UserContext userCtx = (UserContext)auth.getPrincipal();

done
7:剩下的事情就是在acegi中配置权限了。
   发表时间:2007-02-04  
我如果想登录自己实现,acegi只实现权限控制该怎么做呢?
0 请登录后投票
   发表时间:2007-02-05  
北京泥人 写道
我如果想登录自己实现,acegi只实现权限控制该怎么做呢?
在login成功后,设置 acegi的 UserContext
0 请登录后投票
   发表时间:2007-02-06  
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
      <property name="authenticationFailureUrl"><value>/security/fail_login.jsp</value></property>
      <property name="defaultTargetUrl"><value>/login_check.do?method=login</value></property>
      <property name="filterProcessesUrl"><value>/j_acegi_security_check.do</value></property>
      <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
      <property name="alwaysUseDefaultTargetUrl"><value>true</value></property>
   </bean>

我做的系统里通过配置alwaysUseDefaultTargetUrl这个属性,在用户login后,一定调用login_check.do,在struts action里处理login后续动作,这里你可以写你自己的逻辑
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics