前言
身份认证是所有应用软件系统需要面对的问题,所以身份认证的共性很强,如果把身份认证独立于应用软件可以带来很多好处。
Acegi身份认证是一个开源代码项目,它能够实现身份认证和应用系统开发分离。所以掌握它能给我们项目开发带来很多好处。
如何学习好Acegi是我们用好它的必要前提。作为一个独立的身份认证系统应该具备以下部件:预先配置用户身份和用户权限;能够识别用户身份和对用户授权;
下面以我们最常用的方式简单介绍Acegi是如何实现身份认证的。预先在数据库中设定用户身份和用户权限,通过spring技术提供数据库访问方式,这样Acegi系统可以获得任何系统中存在的用户的权限,通过配置文件和程序实现把页面输入的用户名和密码传送到,Acegi通过比较确定用户是否可以使用资源。
Acegi的密码比较有加密和不加密区别,确定用户使用权限可以通过表决机制,使用的资源类型有三种:URL、方法、业务对象
下面的介绍以1.06的例子为准:这个例子讲解两种身份,一种身份可以编辑数据库内容,另外一个不可以编辑数据库内容。
学习过程
我学习Acegi经历了三个过程:第一、下载Acegi包和网上的例子配置好,使它能运行;第二、把下载的这个例子中业务相关的数据处理改成Dao方式(原来是jdbc方式);第三、加入数据权限处理
这样的过程使我对acegi的配置有了进一步了解和体会。
原理
Acegi认证授权主要基于两大技术,一是Filter机制,二是AOP的拦截机制。通过FilterSecurityInterceptor很好地实现了对URI的保护,通过MethodSecurityInterceptor实现了对Service的方法的拦截保护,通过ACL 实现了对prototype类型的Object进行过滤和保护。
HttpSessionContextIntegrationFilter 存储SecurityContext in HttpSession ChannelProcessingFilter 重定向到另一种协议,如http到https
ConcurrentSessionFilter 因为不使用任何SecurityContextHolder的功能,但是需要更新SessionRegistry来表示当前的发送请求的principal,通过在web.xml中注册Listener监听Session事件,并发布相关消息,然后由SessionRegistry获得消息以判断当前用户的Session数量。
AuthenticationProcessingFilter 普通认证机制(大多数用这个)
CasProcessingFilter CAS认证机制
BasicProcessingFilter Http协议的Basic认证机制
HttpRequestIntegrationFilter Authentication 从容器的HttpServletRequest.getUserPrincipal()获得
JbossIntegrationFilter 与Jboss相关。
SecurityContextHolderAwareRequestFilter 与servlet容器结合使用。
RememberMeProcessingFilter 基于Cookies方式进行认证。
AnonymousProcessingFilter 匿名认证。
ExceptionTranslationFilter 捕获所有的Acegi Security 异常,这样要么返回一个HTTP错误响应或者加载一个对应的AuthenticationEntryPoint
AuthenticationEntryPoint 认证入口