使用acegi在业务逻辑层获得Web层的用户ID

目 录
前 言 3
第一章 环境搭建 4
1.1 环境配置 4
第二章 相关的Java类 13
2.1 接口TESTAOPINTERFACE 13
2.2 接口实现类TESTAOPINTERFACEIMPL 14
2.3 接口实现类TESTAOPINTERFACE的ADVICE类 14
2.4 DATASOURCEMETHODDEFINITIONSOURCEEDITOR类 17
第三章 测试页面 18
3.1 登录页面 18
3.2 登录后进入INDEX.jsp 19
3.3 调用业务方法的页面 20


前 言
我在公司产品升级中引入struts+spring+hibernate3的框架时,那时还没有引入Acegi安全系统框架,直到在最近的开发中发现了这样一个问题:Web层可以很容易地得到登录用户的userId,但业务逻辑层的接口如何获得UserId来进行方法调用的安全控制?一开始的接口设计中,有不少方法的第一个参数都是一个String类型的userId变量,但总不能每个方法都带一个userId做为参数吧?那当然不能。
那么如何将userId传给业务逻辑层的接口,或者传给业务逻辑接口的前置通知类(MethodBeforeAdvice)?在Advice类获得userId后,就可以根据userId控制方法的执行权限。既然不能使用业务方法中带userId参数的笨拙办法,那么有什么其他的方法可以传递userId呢?我最初考虑由前端传递一个Session,后来又考虑开发一个Listener,但我还没来得及去尝试这些方法的时候,偶尔翻了翻买来的《Spring in Action中文版》中介绍的acegi安全系统,觉得这个安全框架既然能够实现方法级的权限控制,就一定可以解决我现在遇到的问题:我要在业务接口的Advice类中获得登录用户的身份!《Spring in Action中文版》介绍的内容比较基础,没有直接给出一个现成的范例,于是到网上狂找一气,在google上用acegi关键字搜索了10页,找到几篇好文章,最有帮助的应该是网名为“一餐三碗”的先生的一个示例,不过在看他的例子是用acegi0.8.3做的,而我那时手头已经下载了acegi1.0,于是结合acegi1.0下载包和“一餐三碗”老兄的Demo,花了一整天的时间,终于调通了一个基于acegi1.0的例子,这个例子配置了MD5加密,后台的口令验证是根据登录表单的口令进行MD5加密后,与数据库用户表中此用户的加密口令进行比较。
我想大家一定很着急先知道我们如何实现在业务方法或Advice类中获得用户身份,所以我先介绍这个例子的具体实现,然后再介绍一下Acegi。


第一章 环境搭建
1.1 环境配置
1、下载acegi:
http://nchc.dl.sourceforge.net/sourceforge/acegisecurity/acegi-security-1.0.0-src.zip
http://prdownloads.sourceforge.net/acegisecurity/acegi-security-1.0.0.zip?download
下载后需要将zip文件中的jar包解压出来,放到Web应用可以找到的lib目录下。

2、配置MySQL库

当然也可以使用其他数据库,这里以MySql库为例,MySql安装好以后需要建几个表,大家可以从这个地址下载“一餐三碗”先生(从名字看应该是男士)提供的例子,里面有数据库表的sql文件: Java.net/Files/youlq/Acegi.zip">http://www.blogJava.net/Files/youlq/Acegi.zip。

3、配置 web.xml
〈?xml version="1.0" encoding="GB2312"?〉
〈!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "Java.sun.com/dtd/web-app_2_3.dtd">http://Java.sun.com/dtd/web-app_2_3.dtd"〉

〈web-app〉
〈display-name〉acegi10〈/display-name〉

〈context-param〉
〈param-name〉contextConfigLocation〈/param-name〉
〈param-value〉/WEB-INF/classes/applicationContext-acegi-security.xml
/WEB-INF/classes/applicationContext.xml
〈/param-value〉
〈/context-param〉

〈context-param〉
〈param-name〉log4jConfigLocation〈/param-name〉
〈param-value〉/WEB-INF/classes/log4j.properties〈/param-value〉
〈/context-param〉


〈servlet〉
〈servlet-name〉SpringContextServlet〈/servlet-name〉
〈servlet-class〉
org.springframework.web.context.ContextLoaderServlet
〈/servlet-class〉
〈load-on-startup〉1〈/load-on-startup〉
〈/servlet〉
〈filter〉
〈filter-name〉Acegi Filter Chain Proxy〈/filter-name〉
〈filter-class〉org.acegisecurity.util.FilterToBeanProxy〈/filter-class〉
〈init-param〉
〈param-name〉targetClass〈/param-name〉
〈param-value〉org.acegisecurity.util.FilterChainProxy〈/param-value〉
〈/init-param〉
〈/filter〉

〈filter-mapping〉
〈filter-name〉Acegi Filter Chain Proxy〈/filter-name〉
〈url-pattern〉/*〈/url-pattern〉
〈/filter-mapping〉

〈!--
- Loads the root application context of this web app at startup.
- The application context is then available via
- WebApplicationContextUtils.getWebApplicationContext(servletContext).
--〉
〈listener〉
〈listener-class〉org.springframework.web.context.ContextLoaderListener〈/listener-class〉
〈/listener〉

〈listener〉
〈listener-class〉org.springframework.web.util.Log4jConfigListener〈/listener-class〉
〈/listener〉

〈!--
The HttpSessionEventPublisher will publish
HttpSessionCreatedEvent and HttpSessionDestroyedEvent
to the WebApplicationContext
--〉
〈listener〉
〈listener-class〉org.acegisecurity.ui.session.HttpSessionEventPublisher〈/listener-class〉
〈/listener〉


〈/web-app〉

4、WEB-INF\classes下的applicationContext.xml文件:

〈?xml version="1.0" encoding="UTF-8"?〉
〈!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"〉
〈beans〉
〈bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"〉

共6页 首页 上一页 [1] [2] [3] [4] [5下一页 尾页>
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z