Acegi组件的一些说明

news/2024/7/4 1:10:49 标签: acegi, authentication, bean, class, filter, cookies
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 1.Filter 组件
HttpSessionContextIntegrationFilter
该Filter 负责每次请求从HttpSession中获取Authentication对象,然后把Authentication存于一个新的 ContextHolder对象(其实质上只是一个ThreadLocal对象)中,则让该次请求过程中的任何Filter都可以通过 ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦.在请 求完后把Authentication对象保存到HttpSession中供下次请求使用,最后把刚才生成的ContextHolder对象销毁.这样就 达到了让Authentication对象跨越多个请求的目的

注意此filter须在调用其他Acegi filter前使用:

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="httpSessionContextIntegrationFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.context.HttpSessionContextIntegrationFilter">
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



AuthenticationProcessingFilter
该Filter 负责处理登陆身份验证.当接受到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来 验证用户身份.如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面.如果验证失败,则再从 rememberMeServices中获取用户身份,若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationProcessingFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.webapp.AuthenticationProcessingFilter">
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"><ref class="tags" href="/tags/BEAN.html" title=bean>bean="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"/></property>
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationFailureUrl"><value>/class="tags" href="/tags/ACEGI.html" title=acegi>acegilogin.jsp?login_error=1</value></property>
    <property name="defaultTargetUrl"><value>/</value></property>
    <property name="filterProcessesUrl"><value>/j_class="tags" href="/tags/ACEGI.html" title=acegi>acegi_security_check</value></property>
    <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



LogoutFilter
该Filter负责处理退出登录后所需要的清理工作.它会把session销毁,把ContextHolder清空,把rememberMeService从cookies中清除掉,然后重定向到指定的退出登陆页面.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="logoutFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.logout.LogoutFilter">
    <constructor-arg value="/index.jsp"/> <!-- URL redirected to after logout ->
    <constructor-arg>
    <list>
    <ref class="tags" href="/tags/BEAN.html" title=bean>bean="rememberMeServices"/>
    <class="tags" href="/tags/BEAN.html" title=bean>bean class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
    </list>
    </constructor-arg>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



FilterInvocationInterceptor
该Filter 会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面.认证成功,则从 Authentication中获取用户的权限.然后从objectDefinitionSource属性获取各种URL资源所对应的权限.最后调用 AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配.如果匹配失败,则返回403错误给 用户.匹配成功则用户可以访问受保护的URL资源

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="filterInvocationInterceptor" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.intercept.web.FilterSecurityInterceptor">
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"><ref class="tags" href="/tags/BEAN.html" title=bean>bean="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"/></property>
    <property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
    <property name="objectDefinitionSource">
    <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /index.jsp=ROLE_ANONYMOUS,ROLE_USER
    /hello.htm=ROLE_ANONYMOUS,ROLE_USER
    /logoff.jsp=ROLE_ANONYMOUS,ROLE_USER
    /switchuser.jsp=ROLE_SUPERVISOR
    /j_class="tags" href="/tags/ACEGI.html" title=acegi>acegi_switch_user=ROLE_SUPERVISOR
    /class="tags" href="/tags/ACEGI.html" title=acegi>acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER
    /**=ROLE_USER
    </value>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



SecurityContextHolderAwareRequestFilter
该Filter 负责通过Decorate Model(装饰模式),装饰的HttpServletRequest对象.其Wapper是ServletRequest包装类 HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或者 SecurityContextHolderAwareRequestWrapper),附上获取用户权限信息,request参数,header, Date,headers和cookies的方法.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="securityContextHolderAwareRequestFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />



BasicProcessingFilter
该Filter负责处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如 IE,Navigator的HTTP头中获取用户信息,将他们转交给通过class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager属性装配的认证管理器。如果认证成 功,会将一个Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过 class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationEntryPoint属性装配)

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="basicProcessingFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.basicauth.BasicProcessingFilter">
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"><ref local="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager"/></property>
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationEntryPoint"><ref local="basicProcessingFilterEntryPoint"/></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="basicProcessingFilterEntryPoint" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
    <property name="realmName"><value>Contacts Realm</value></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



RememberMeProcessingFilter
该Filter 负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆。检查AuthenticationManager 中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中 获取Authentication对象

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="rememberMeProcessingFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.rememberme.RememberMeProcessingFilter">
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager" ref="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager" />
    <property name="rememberMeServices" ref="rememberMeServices" />
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



AnonymousProcessingFilter
该Filter负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="anonymousProcessingFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.anonymous.AnonymousProcessingFilter">
    <property name="key" value="changeThis" />
    <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



ExceptionTranslationFilter
该过滤器负责处理各种异常,然后重定向到相应的页面中。

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="exceptionTranslationFilter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.ExceptionTranslationFilter">
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationEntryPoint">
    <class="tags" href="/tags/BEAN.html" title=bean>bean class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    <property name="loginFormUrl" value="/login.jsp" />
    <property name="forceHttps" value="false" />
    </class="tags" href="/tags/BEAN.html" title=bean>bean>
    </property>
    <property name="accessDeniedHandler">
    <class="tags" href="/tags/BEAN.html" title=bean>bean class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/accessDenied.jsp" />
    </class="tags" href="/tags/BEAN.html" title=bean>bean>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



2.拦截器组件

MethodSecurityInterceptor
该拦截器实现了org.aopalliance.intercept.MethodInterceptor接口.在方法被调用之前,拦截器会先调 用 AuthenticationManager判断用户身份是否已验证,然后从objectDefinitionSource中获取方法所应用的权限,再调 用AccessDecisionManager来匹配用户权限和方法对应的权限.如果用户没有足够权限调用当前方法,则抛出 AccessDeniedException是方法不能被调用.调用runAsManager,使在调用方法前动态改变class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authentication中获 取用户权限.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="securityInterceptor" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
    <property name="validateConfigAttributes">
    <value>false</value>
    </property>
    <property name="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager">
    <ref local="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager" />
    </property>
    <property name="accessDecisionManager">
    <ref local="accessDecisionManager" />
    </property>
    <property name="runAsManager">
    <ref local="runAsManager" />
    </property>
    <property name="objectDefinitionSource">
    <value>
    sample.contact.ContactManager.create=ROLE_USER
    sample.contact.ContactManager.getAllRecipients=ROLE_ADMIN
    </value>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



BeanNameAutoProxyCreator
设置AOP代理的最简单方法就是用Spring的BeanNameAutoProxyCreator.在BeanNameAutoProxyCreator中选出你所需要的interceptor,和列出你所需要保护的Bean.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="proxyTargetClass" value="true" />
    <property name="interceptorNames">
    <list>
    <idref local="securityInterceptor" />
    </list>
    </property>
    <property name="class="tags" href="/tags/BEAN.html" title=bean>beanNames">
    <list>
    <idref class="tags" href="/tags/BEAN.html" title=bean>bean="userManager"/>
    <idref class="tags" href="/tags/BEAN.html" title=bean>bean="roleManager"/>
    <idref class="tags" href="/tags/BEAN.html" title=bean>bean="rescManager"/>
    </list>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>




3.其他组件

AccessDecisionManager
AccessDecisionManager 接口有decide()和support()方法.decide()方法是进行决策是否批准通过,如果没有抛出 AccessDeniedException则为允许访问资源,否则拒绝访问.support()方法是根据配置属性和受保护资源的类来判断是否需要对该 资源作出决策判断.
AccessDecisionManager有三个实现类,功能各不相同:
AffirmativeBased:当至少有一个Voter投允许票才通过
UnanimousBased:没有Voter投反对票时才通过
ConsensusBased:当所有Voter都投允许票时才通过

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="accessDecisionManager" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.vote.UnanimousBased">
    <property name="allowIfAllAbstainDecisions">
    <value>false</value>
    </property>
    <property name="decisionVoters">
    <list>
    <ref local="roleVoter" />
    </list>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="roleVoter" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.vote.RoleVoter" />



AuthenticationManager

AuthenticationManager的其中一个实现是ProviderManager,它负责把身份验证的工作委托给一个或多个Provider(认证提供者).

Provider 都是实现AuthenticationProvider接口,该接口有两个方法authenticate()和support(). authenticate()方法会尝试验证用户身份,若验证成功则返回一个Authentication对象,否则抛出一个 AuthenticationException.

support()方法会评估当前Authentication对象是否适合这个Provider来进行进一步的处理,而不是指已经通过.

Provir有多个实现.例如daoAuthenticationProvider,anonymousAuthenticationProvider,rememberMeAuthenticationProvider.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="class="tags" href="/tags/AUTHENTICATION.html" title=authentication>authenticationManager" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.ProviderManager">
    <property name="providers">
    <list>
    <ref local="daoAuthenticationProvider"/>
    <ref local="anonymousAuthenticationProvider"/>
    <ref local="rememberMeAuthenticationProvider"/>
    </list>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



daoAuthenticationProvider负责提供用户信息,包括用户名和密码。其中取用户名密码的工作就交给 userDetailsService来做。通过userCache来缓存用户信息,减少查询数据库次数。用passwordEncoder 来使用加密密码。userDetailsService的接口实现有jdbcDaoImpl和inMemoryDaoImpl。jdbcDaoImpl通 过数据库获取用户名和密码,而inMemoryDaoImpl则只是通过xml定义的方式来获取。
userCache的接口实现有EhCacheBasedUserCache和NullUserCache。NullUserCache实际上就是不进行缓存。EhCacheBasedUserCache是基于ehcache的开源缓存项目来实现的。
passwordEncoder是使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:
PlaintextPasswordEncoder---默认,不加密,返回明文.
ShaPasswordEncoder---哈希算法(SHA)加密
d5PasswordEncoder---消息摘要(MD5)加密

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="daoAuthenticationProvider" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.dao.DaoAuthenticationProvider">
    <property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>
    <property name="userCache"><ref local="userCache"/></property>
    <property name="passwordEncoder"><ref local="passwordEncoder"/></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="jdbcDaoImpl" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource"><ref class="tags" href="/tags/BEAN.html" title=bean>bean="dataSource"/></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="userCache" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
    <property name="cache"><ref local="userCacheBackend"/></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="passwordEncoder" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.encoding.Md5PasswordEncoder"/>

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
    <property name="cacheManager">
    <ref local="cacheManager"/>
    </property>
    <property name="cacheName">
    <value>userCache</value>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>
    <class="tags" href="/tags/BEAN.html" title=bean>bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>



anonymousAuthenticationProvider负责匿名用户的AnonymousAuthenticationToken的进一步处理

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="anonymousAuthenticationProvider" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
    <property name="key"><value>foobar</value></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



rememberMeAuthenticationProvider负责Cookies记忆用户RememberMeAuthenticationToken的进一步处理

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="rememberMeAuthenticationProvider" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
    <property name="key"><value>springRocks</value></property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



RememberMeServices

rememberMeServices 负责通过以cookie的形式保存先前的用户登录信息.在Authentication对象不存在时, rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookies 中获取用户登录信息,如果存在则并返回Authentication对象.在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功 后,则会调用loginSuccess()方法记录用信息在cookies中,否则调用loginFail()方法清楚cookie.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="rememberMeServices" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
    <property name="userDetailsService" ref="userDetailsService" />
    <property name="key" value="changeThis" />
    </class="tags" href="/tags/BEAN.html" title=bean>bean>



runAsManager
runAsmanager提供了动态替换ContextHolder中Ahthentication对象的功能.

    <class="tags" href="/tags/BEAN.html" title=bean>bean id="runAsManager" class="org.class="tags" href="/tags/ACEGI.html" title=acegi>acegisecurity.runas.RunAsManagerImpl">
    <property name="key">
    <value>my_run_as_password</value>
    </property>
    </class="tags" href="/tags/BEAN.html" title=bean>bean>


http://www.niftyadmin.cn/n/1050147.html

相关文章

java 判断字符串是否相等 (转)

http://blog.csdn.net/chtnj/article/details/7909720 判断字符串相等我们经常习惯性的写上if(str1str2)&#xff0c;这种写法在java中可能会带来问题。 java中判断字符串是否相等有两种方法&#xff1a; 1、用“”运算符&#xff0c;该运算符表示指向字符串的引用是否相同&…

对于jboss EJB容器管理事务的问题

学习一下 J2EE 中的两阶段提交事务&#xff0c;并且使用这种方式&#xff0c;而不是开放您自己的事务管理。容器在事务优化方面几乎总是比较好的。 使用容器管理的事务&#xff08;CMT&#xff09;提供了两个关键的优势&#xff08;如果没有容器支持这几乎是不可能的&#xf…

jQuery 入门教程(14): 添加HTML元素

2019独角兽企业重金招聘Python工程师标准>>> 使用jQuery可以方便的添加新的HTML元素。 下面的方法用于添加HTML元素&#xff1a; append() – 在指定的元素的尾部添加一个新内容。 prepend() -在指定的元素里前部添加新内容。 after() – 在指定元素后添加新内容…

grequests----golang的requests库

github.com/levigross/grequests&#xff1a; A Go "clone" of the great and famous Requests library 特点&#xff1a; 响应可以序列化为JSON和XML轻松上传文件轻松下载文件支持以下HTTP请求方式&#xff1a;GET&#xff0c;HEAD&#xff0c;POST&#xff0c;PUT&…

Mastering Oracle SQL学习:连接 (转载)

Oracle SQL JOIN 1&#xff0e;JOIN的基本概念&#xff1a; A join is a SQL query that extracts information from two or more tables or views. When you specify multiple tables or views in the FROM clause of a query, Oracle performs a join, linking rows from mu…

phpcms 服务器安全认证错误

本人将图片的js、images、css路径转移到CDN上了&#xff0c;上传附件的时候就出现了 “服务器安全认证错误”的提示。找到文件 D:\wamp\www\phpcms\phpcms\modules\attachment\functions\global.func.php 其中的initupload函数有以下几行&#xff1a;swfu new SWFUpload({fla…

机器学习工程师 - Udacity AWS GPU 实例

1. 创建 AWS 帐号 访问 aws.amazon.com 并点击“创建 AWS 帐号 (Create an AWS Account)”按钮。 如果你已经拥有 AWS 帐号&#xff0c;则直接登录。 如果你没有 AWS 帐号&#xff0c;请注册一个。 注册时&#xff0c;你需要提供信用卡。但是别担心&#xff0c;暂时系统不会扣除…

基于Spring和hibernate的灵活的异常处理办法

Spring exeception 在spring&#xff0c;hibernate中异常的处理都交给了spring框架&#xff0c;在hibernate只需要写很少的代码就可以实现异常的控制。 在单元测试代码中&#xff1a; public final void testFindFunctionById() { logger.debug("testFindFunctionBy…