Acegi Security 学习

来源:互联网 发布:淘宝上的nike是正品吗 编辑:程序博客网 时间:2024/06/07 06:03

最近刚弄了acegi的一本书,学习了下怎么将这一权限控制框架集成到我们的日常使用的web程序中去:),Let`s Go!
什么是acegi?
Acegi Security 是用于企业 Web 应用程序的一个强大、灵活的安全性解决方案。Acegi 构建在 Java EE 的声明式安全性方法之上,并将 URL 和业务方法许可扩展至任意 Java 对象。Acegi Security 为应用程序提供全面的身份验证、授权、基于实例的访问控制、通道安全和用户验证功能。
如何在现有框架中集成acegi
看了这么牛的介绍,我们要怎么将acegi和我们现有系统进行集成呢?
下面以小弟自己弄得一个springMVC框架为例,看看如何一步一步来集成acegi
第一步:JAR包
   一如既往,麻烦的jar包(在使用mvn之前我一直为这个很头疼,无止境的冲突),这里我使用的0.9.0版的acegi-security
     <dependency>
     <groupId>org.acegisecurity</groupId>
     <artifactId>acegi-security</artifactId>
     <version>0.9.0</version>
  </dependency>
  如果你不是使用的mvn,没关系,去下载一个好了。http://sourceforge.net/projects/acegisecurity/files/
第二部:配置
  如果你不需要特殊的权限配置,基本上来说,配置就是你使用acegi的全部了:),让我们来看看怎么配置吧。
  beans-acegi-security.xml这个是我配置的acegi信息,大家可以看到已经和Spring集成了.

18个类的定义就支撑起了我们的acegi安全框架,不得不赞叹下acegi的牛人啊!
简单说明下,如果需要更加具体的说明可以google,也可以去看下http://www.springside.org.cn/docs/reference/Acegi3.htm这里介绍得比较详细,不像兰色说不清楚,嘿嘿!

filterChainProxy:是通过一个标准的FilterInvocationDefinitionSource 来实现配置的,在这个类下面有filterInvocationDefinitionSource配置项目,里面定义了一个过滤器的链,这决定了我们在页面上进行的任何一次请求均会经过这个过滤器链中所有过滤器的处理:)我定义的链比较简单,就是用了httpSessionContextIntegrationFilter、authenticationProcessingFilter、anonymousProcessingFilter、securityEnforcementFilter四个过滤器,还有很多acegi过滤器就不一一列出了,有兴趣的同学可以自己去参考一下其他网络资料或者书籍进行学习哦!
httpSessionContextIntegrationFilter:在多个请求之间共享SecurityContext,如果存在则必须放在过滤器链的第一位。用户认证后负责从Session中获取用户关联的SecurityContext存放到SecurityContextHolder,每个请求都会有SecurityContextHolder用来保存着SecurityContext,而SecurityContext又保存了包含acegi认证重要信息的Authentication对象。
authenticationProcessingFilter:使用认证处理过滤器处理匹配的URL,这里定义你的登录页面,成功跳转页面和失败页面,还可以设置是否需要记录登录状态等。
anonymousProcessingFilter:匿名用户处理。如果用户尚未登录,将生成一个匿名用户的Authentication存放到SecurityContext中
securityEnforcementFilter:强制安全验证过滤器。验证所请求的url是否在用户的权限范围内

第二部:数据库绑定
  

 上面的配置中,我们设置了认证数据是由数据库提供的,并且启用了MD5对密码进行加密和缓存,然后我们还可以看到两条sql语句。
  SELECT loginName as username,password,status as enabled FROM t_users WHERE loginName=? and status=1
  SELECT loginName as username,authority FROM t_users WHERE loginName=? and status=1
  这个是最基本的acegi的认证方式,需要提供的内容有
      用户信息:包括username(用户名),password(密码),enabled(开启状态)
      认证信息:包括username(登陆名),authority(认证级别)
      (上面的英文列名如果不扩展的话必须是一样的哦,如果你当前数据库中的字段名称不一样,请用as语句转换一下才能用)
  这个时候acegi就知道数据库中我们的用户信息及权限级别了:)

第三步 那acegi怎么控制用户访问呢?
  

  哈,上面的就是最基本的acegi的认证投票了,我们定义了一个反问URL角色过滤器用来告诉acegi访问url时候需要使用什么角色,用了一个投票器告诉acegi处理访问用户需要使用默认的ROLE_开头,从配置总我们可以看到两种角色ROLE_ANONYMOUS、ROLE_USER,对应authority(认证级别)中存放的内容哦,还有一种ROLE_ANONYMOUS,这个是默认任何人都可以访问的。

第四步 都配好了,怎么登陆?
  

 哈哈,有很多url页面了!
 filterProcessesUrl:用于认证的action
 defaultTargetUrl投票认证成功后跳转页面
 authenticationFailureUrl:投票认证失败后跳转页面
 loginFormUrl:认证失效用户重定向到登陆的表单url
 现在页面url也配置好了,让我们再看看登陆页面里面有什么呢?
    <form action="user_login.htm" method="post">
     <table border="1px" cellpadding="1" cellspacing="1" style="text-align: center">
   #if($errMsg)
  <tr>
       <td colspan="3"><style color="red">$errMsg</style></td>
      </tr>
   #end
      <tr>
       <td>用户名:</td>
       <td><input type="text" name="j_username"></td>
       <td>&nbsp;</td>
      </tr>
      <tr>
       <td>密  码:</td>
       <td><input type="password" name="j_password"></td>
       <td>&nbsp;</td>
      </tr><tr>
       <td>&nbsp;</td>
       <td><input id="submit" type="submit" value="登录" name="submit" />
   &nbsp;&nbsp;&nbsp;&nbsp;<input id="submit" type="button" value="注册" name="register" onClick="location.href='register.htm'"/></td>
       <td>&nbsp;</td>
      </tr>
     </table>
    </form>
  一个form就搞定了,action是刚才我们配置的地址,用户名和用户密码是默认的j_username,j_password这样就可以完成我们的登录了,大家可以是尝试一下哦!

 

 

 

 

原创粉丝点击