现在我们来讨论如何在 Spring 配置文件中配置 Acegi 安全性。 如上文所述,我们已经配置了业务逻辑 Bean,使其方法调用被 securityInterceptor Bean 拦截以执行安全性检查。 让我们来看看这个 Bean 是如何配置的。 下面展示了 securityInterceptor Bean 的 Spring 配置文件片段。 securityInterceptor Bean 是由一个称为 securityInterceptor 的 Acegi 类提供的。 正如其名字的含意一样,该类用于加强方法调用的安全性(方法是拦截方法调用,检查调用者是否被授权)。
<beans> . . . <bean id="securityInterceptor" class="org.acegisecurity.intercept.method. aopalliance.MethodSecurityInterceptor"> <property name="authenticationManager"> <bean class="org.acegisecurity. providers.ProviderManager"> <property name="providers"> <list> <bean class="org.acegisecurity. providers.anonymous. AnonymousAuthenticationProvider"> <property name="key" value="changeThis"/> </bean> </list> </property> </bean> </property> <property name="accessDecisionManager"> <bean class="org.acegisecurity.vote. UnanimousBased"> <property name="decisionVoters"> <list> <bean class="org.acegisecurity. vote.RoleVoter"/> </list> </property> </bean> </property> <property name="objectDefinitionSource"> <value> com.mybank.bizlogic.AccountMgr. transferFunds=ROLE_MANAGER </value> </property> </bean> . . . </beans>我们需要使用 authenticationManager 属性来配置 securityInterceptor Bean 以指示使用哪种授权方式。 由于设计上依靠 Axis 事务处理程序执行授权,我们在此处不需要进行授权,只需使用 AnonymousAuthenticationProvider 进行配置。 另外,在 Axis 事务处理程序中创建授权标识的方式,将会使 Acegi 知道已经进行了授权,因此不会再次授权。 我们将在讨论 Axis 事务处理程序的时候详加讨论。
接下来,需要使用 accessDecisionManager 属性配置该 Bean 以指定它如何决定某人是否有对方法调用进行访问的权限。 Acegi 有三个具体的访问决定管理器实现:AffirmativeBased、ConsensusBased 和 UnanimousBased。 Acegi 作出访问决定的方式是:依靠投票者投票,决定是否授予某人访问权限来执行具体操作。 它通过计算票数来决定是否授予访问权限。 我们选择了 UnanimousBased 访问决定管理器,该管理器要求所有投票者通过投票来授予客户端执行特定操作的权限。 阅读 Acegi 文档可以深入了解其工作原理。 接下来,我们要使用一个投票者名单来配置 accessDecisionManager。 本示例中,只有一个投票者,称为 RoleVoter。 它是 Acegi 的一个类,根据基于角色的访问控制,该类对授予权限与否进行投票。 同样,阅读 Acegi 文档可以深入了解 RoleVoter 如何工作。
最后一个需要配置的属性是 objectDefinitionSource。 这是授予权限的方式,即,对于各种受到安全保护的对象,对象上的方法调用需要授予何种访问权限。 此处,只需要保证 transferFunds() 方法的安全,并且只将权限授予 Manager 角色。 为达到此目的,我们需要列出类的全限定名称和方法的名称以及访问该方法的角色:
com.mybank.bizlogic.AccountMgr.transferFunds= ROLE_MANAGER第 1, 2, 3, 4 页
下一页