1.Filter 组件
HttpSessionContextIntegrationFilter
该Filter负责每次请求前从HttpSession中获取Authentication对象,然后把Authentication存于一个新的 ContextHolder对象(其实质上只是一个ThreadLocal对象)中,则让该次请求过程中的任何Filter都可以通过 ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦。在请 求完后把Authentication对象保存到HttpSession中供下次请求使用, 最后把刚才生成的ContextHolder对象销毁。这样就达到了让Authentication对象跨越多个请求的目的。
注意此filter须在调用其他Acegi filter前使用:
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">
bean>
AuthenticationProcessingFilter
该Filter负责处理登陆身份验证。当接受到与filterProcessesUrl所定义相同的请求时,它会首先通过 AuthenticationManager来验证用户身份。如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面。如果验证 失败,则再从rememberMeServices中获取用户身份,若再获取失败,则重定向到authenticationFailureUrl所定义登 陆失败页面。
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager"><ref bean="authenticationManager"/>property>
<property name="authenticationFailureUrl"><value>/acegilogin.jsp?login_error=1value>property>
<property name="defaultTargetUrl"><value>/value>property>
<property name="filterProcessesUrl"><value>/j_acegi_security_checkvalue>property>
<property name="rememberMeServices"><ref local="rememberMeServices"/>property>
bean>
LogoutFilter
该Filter负责处理退出登录后所需要的清理工作。它会把session销毁,把ContextHolder清空, 把rememberMeServices从cookies中清除掉,然后重定向到指定的退出登陆页面。
<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/index.jsp"/> <!---->-- URL redirected to after logout ->
<constructor-arg>
<list>
<ref bean="rememberMeServices"/>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
list>
constructor-arg>
bean>
FilterInvocationInterceptor
该过滤器会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面。认证成功,则并从 Authentication中获取用户的权限。然后从objectDefinitionSource属性获取各种URL资源所对应的权限。最后调用 AccessDecisionManager来判断用户所拥有的权限与当前受保华的URL资源所对应的权限是否相匹配。如果匹配失败,则返回403错误 (禁止访问)给用户。匹配成功则用户可以访问受保护的URL资源。
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager"><ref bean="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_acegi_switch_user=ROLE_SUPERVISOR
/acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER
/**=ROLE_USER
value>
property>
bean>
SecurityContextHolderAwareRequestFilter
该Filter负责通过Decorate Model(装饰模式),装饰的HttpServletRequest对象。其Wapper是ServletRequest包装类 HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或 SecurityContextHolderAwareRequestWrapper),附上获取用户权限信息,request参数,headers, Date headers 和 cookies 的方法。
<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />
BasicProcessingFilter
该Filter负责处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE, Navigator的HTTP头中获取用户信息,将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成功,会将 一个Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过 authenticationEntryPoint属性装配)
<bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
<property name="authenticationManager"><ref local="authenticationManager"/>property>
<property name="authenticationEntryPoint"><ref local="basicProcessingFilterEntryPoint"/>property>
bean>
<bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
<property name="realmName"><value>Contacts Realmvalue>property>
bean>
RememberMeProcessingFilter
该Filter负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆。检查AuthenticationManager 中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中 获取Authentication对象
<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="rememberMeServices" ref="rememberMeServices" />
bean>
AnonymousProcessingFilter
该Filter负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限
<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
<property name="key" value="changeThis" />
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />
bean>
ExceptionTranslationFilter
该过滤器负责处理各种异常,然后重定向到相应的页面中。
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/login.jsp" />
<property name="forceHttps" value="false" />
bean>
property>
<property name="accessDeniedHandler">
<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/accessDenied.jsp" />
bean>
property>
bean>
2. 拦截器组件
MethodSecurityInterceptor
该拦截器实现了org.aopalliance.intercept.MethodInterceptor接口。在方法被调用之前,拦截器会先调用 AuthenticationManager判断用户身份是否已验证,然后从objectDefinitionSource中获取方法所对应的权限,再调 用AccessDecisionManager来匹配用户权限和方法对应的权限。如果用户没有足够权限调用当前方法,则抛出 AccessDeniedException使方法不能被调用。调用runAsManager,使在调用方法前动态改变Authentication中获 取用户权限。
<bean id="securityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="validateConfigAttributes">
<value>falsevalue>
property>
<property name="authenticationManager">
<ref local="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>
bean>
BeanNameAutoProxyCreator
设置AOP代理的最简单方法就是用Spring的BeanNameAutoProxyCreator。在BeanNameAutoProxyCreator中选出你所需要的interceptor, 和列出你所需要保护的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="beanNames">
<list>
<idref bean="userManager"/>
<idref bean="roleManager"/>
<idref bean="rescManager"/>
list>
property>
bean>
3. 其它组件
AccessDecisionManager
AccessDecisionManager接口有decide()和support()方法。decide()方法是进行决策是否批准通过,如果 没抛出AccessDeniedException则为允许访问资源,否则拒绝访问。support()方法是根据配置属性和受保护资源的类来判断是否需 要对该资源作出决策判断。
AccessDecisionManager的 decisionVoters属性需要一个或多个Voter(投票者),Voter必须实现AccessDecisionVoter 接口。Voter的工作是去匹配用户已拥有的权限和受保护的资源要求的权限,在该资源有相应权限的情况下,如果匹配则投允许票,否则投反对票。 allowIfAllAbstainDecisions属性表示是否允许所有都弃权时就通过。Voter的实现类RoleVoter在当受保护资源的名字 由ROLE_开始时才参与投票。
AccessDecisionManager有三个实现类,功能各不相同:
AffirmativeBased: 当至少有一个Voter投允许票时才通过
UnanimousBased: 没有Voter投反对票时才通过
ConsensusBased: 当所有Voter都投允许票时才通过
<bean id="accessDecisionManager" class="org.acegisecurity.vote.UnanimousBased">
<property name="allowIfAllAbstainDecisions">
<value>falsevalue>
property>
<property name="decisionVoters">
<list>
<ref local="roleVoter" />
list>
property>
bean>
<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter" />
AuthenticationManager
AuthenticationManager的其中一个实现是ProviderManager,它负责把身份验证的工作委托给一个或多个Provider(认证提供者)。
Provider都是实现AuthenticationProvider接口,该接口有两个方法authenticate()和support ()。authenticate()方法会尝试验证用户身份,若验证成功则返回一个Authentication对象,否则抛出一个 AuthenticationException。
support()方法会评估当前Authentication对象是否适合这Provider来进行进一步的处理,而不是指已经通过。
Provir有多个实现, 例如daoAuthenticationProvider,anonymousAuthenticationProvider,rememberMeAuthenticationProvider。
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
<ref local="anonymousAuthenticationProvider"/>
<ref local="rememberMeAuthenticationProvider"/>
list>
property>
bean>
daoAuthenticationProvider负责提供用户信息,包括用户名和密码。其中取用户名密码的工作就交给 userDetailsService来做。通过userCache来缓存用户信息,减少查询数据库次数。用passwordEncoder来使用加密密 码。userDetailsService的接口实现有jdbcDaoImpl和inMemoryDaoImpl。jdbcDaoImpl通过数据库获取 用户名和密码,而inMemoryDaoImpl则只是通过xml定义的方式来获取。
userCache的接口实现有EhCacheBasedUserCache和NullUserCache。NullUserCache实际上就是不进行缓存。EhCacheBasedUserCache是基于ehcache的开源缓存项目来实现的。
passwordEncoder是使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:
PlaintextPasswordEncoder---默认,不加密,返回明文.
ShaPasswordEncoder---哈希算法(SHA)加密
d5PasswordEncoder---消息摘要(MD5)加密
<bean id="daoAuthenticationProvider" class="org.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>
bean>
<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/>property>
bean>
<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
<property name="cache"><ref local="userCacheBackend"/>property>
bean>
<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>
<bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<ref local="cacheManager"/>
property>
<property name="cacheName">
<value>userCachevalue>
property>
bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
anonymousAuthenticationProvider负责匿名用户的AnonymousAuthenticationToken的进一步处理
<bean id="anonymousAuthenticationProvider" class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key"><value>foobarvalue>property>
bean>
rememberMeAuthenticationProvider负责Cookies记忆用户RememberMeAuthenticationToken的进一步处理
<bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key"><value>springRocksvalue>property>
bean>
RememberMeServices
rememberMeServices负责通过以cookie的形式保存先前的用户登录信息。在Authentication对象不存在时, rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookie中 获取用户登录信息,如果存在则并返回Authentication对象。在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后, 则会调用loginSuccess()方法记录用户信息在cookie中,否则调用loginFail()方法清除cookie。
<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService" />
<property name="key" value="changeThis" />
bean>
runAsManager
runAsManager提供了动态替换 ContextHolder中Authentication对象的功能。
<bean id="runAsManager" class="org.acegisecurity.runas.RunAsManagerImpl">
<property name="key">
<value>my_run_as_passwordvalue>
property>
bean>
相关推荐
G729系列包括了多个变种,如G729A、G729B、G729C和G729D等,每个变种在特定场景下有不同的优化和特性。 1. **G729简介**: G729的主要目标是提供高质量的语音编码,同时保持低带宽需求,以便在有限的网络带宽下...
(c) 选择合适的重力场模型(如EGM2008);(d) 执行计算,获取重力值;(e) 可视化或进一步分析结果。 综上所述,EGM2008计算是一个基于高精度重力场模型的科学过程,涉及到数据采集、数学建模、软件应用等多个环节,...
一个良好的G729A库应提供清晰的API接口,使得其他应用程序可以方便地调用编码和解码功能。这些API通常包括输入和输出缓冲区处理、错误检查以及状态管理等。 5. **性能优化**: 为了在有限的硬件资源下实现高效...
1. 高电流输出能力:在连续工作条件下,CEG8205-VB的漏电流(ID)可以达到6.6A,而在脉冲工作状态下,其脉冲漏电流(IDM)甚至可以高达30A。这为驱动大功率负载提供了坚实的基础。 2. 低电阻值:CEG8205-VB的导通...
F L U O R E S C E N T D I S P L A Y ) 是一种低 压、直流驱动的平板电真空器件。由于V F D 具有高亮度、高对比度显示特性, 同时具有 很高的环境适应性与可靠性, 如抗紫外线、 抗振动、宽工作温度范围、使用长...
2. **连续漏源电流ID**:在25°C和150°C时的最大连续电流分别为0.7A和0.6A,脉冲条件下可达6A(脉宽300μs,占空比2%)。 3. **热特性**:在25°C时的最大结到外壳热阻RthJA为250°C/W,最大结到脚热阻RthJF为225...
- **QAE22.5A**:配备黄铜(Ms63)保护套和螺纹套管G½A,浸入长度更长,适合特殊的应用场景。 #### 三、应用场景 温度传感器QAE22_CN广泛应用于楼宇自动化系统中,特别是用于以下几种情况: - **控制或限制供水温度*...
根据给定的“CREA-PE视觉识别手册”的文件内容,我们可以提炼出一系列与视觉识别系统(Visual Identity System, VIS)相关的专业知识点。这些知识点涵盖了手册的目的、品牌标识的使用规则、颜色规范、不同版本的品牌...
2. **结合律**:对于任意\(a, b, c \in G\),有\((a * b) * c = a * (b * c)\)。 3. **单位元**:存在元素\(e \in G\),对于所有\(a \in G\),有\(a * e = e * a = a\)。 4. **逆元**:对于每个\(a \in G\),存在\(b...
### TM6968EGC-VB:一款SOP8封装双通道N-Channel场效应MOS管 #### 概述 TM6968EGC-VB是一款采用SOP8封装的双通道N-Channel场效应晶体管(MOSFET),由VBsemi制造。该器件具有两个独立的N-Channel沟道,每个沟道的...
- **事件分解**:在题目描述的第9题中,事件\(F\)可以被分解为两个互斥的事件\(E\)和\(FE^c\),其中\(E^c\)表示事件\(E\)的补集。因此,有 \[ P(F) = P(E) + P(FE^c) \] ### 3. 条件概率与独立性 - **条件概率...
为规范 IEC 61850 变电站通信网络和系统国际标准的继电保护应用,实现各制造厂商设备的互操作性,提高 IEC ...本标准的附录 A、附录 B、附录 C、附录 D、附录 E、附录 F 为规范性附录,附录 G、附录 H 为资料性附录
18. **范式转换**:关系R(A,B,C,D,E,F,G),FD={A→B,A→C,C→D,C→E,A→F,F→G},要规范化到更高一级范式,可能拆分为3个关系,以消除部分依赖或传递依赖。 **是非题部分**: - 19题正确,关系数据模型中的直接联系...
- 开关及熔断器标注格式:a-b/c/i/d/e/f/g,a代表设备编号,b代表设备型号,c代表额定电流,i代表整定电流,d代表导线型号,e代表导线根数,f代表导线截面,g代表导线敷设方式及部位。 #### 四、识读电气施工图 ...
_c" 提到了几个关键概念,这包括G.728编码标准、C++编程语言以及与软件开发相关的元素。这个标题暗示我们这是一个关于使用C++实现G.728音频编码标准的软件项目,可能是一个压缩包,包含了源代码、文档或者编译好的可...
2. **加密**:消息\(m\)加密后的密文为\(c = (c_1, c_2)\),其中\(c_1 = g^k \mod p\),\(c_2 = my^k \mod p\),\(k\)为随机选取的小于\(p-1\)的整数。 3. **解密**:密文\(c = (c_1, c_2)\)解密后的明文\(m\)为\(m...
条件期望不仅需要满足\(C\)-可测性(即条件期望\(E(X|C)\)必须是对\(C\)可测的函数),还必须满足对于任意\(A \in C\)都有\(\int_A X dP = \int_A E(X|C) dP\)。 - **应用**:条件期望的概念在现代概率理论和统计...
- (E) 正确,假设H是图G的子图,则\(\sigma(H) \leq \sigma(G)\)。 8. **关于平面图的说法** - (A) 正确,任何平面图都只有一个外部面; - (B) 正确,简单平面图中一定有度数不超过5的顶点; - (C) 错误,平面...