Spring Security Reference
4.0.1
Part VI. Authorization
The advanced authorization capabilities within Spring Security represent one of the most compelling reasons for its popularity. Irrespective of how you choose to authenticate - whether using a Spring Security-provided mechanism and provider, or integrating with a container or other non-Spring Security authentication authority - you will find the authorization services can be used within your application in a consistent and simple way.
In this part wersquo;ll explore the different AbstractSecurityInterceptor implementations, which were introduced in Part I. We then move on to explore how to fine-tune authorization through use of domain access control lists.
21. Authorization Architecture
21.1 Authorities
As we saw in the technical overview, all Authentication implementations store a list of GrantedAuthority objects. These represent the authorities that have been granted to the principal. the GrantedAuthority objects are inserted into the Authentication object by the AuthenticationManager and are later read byAccessDecisionManager s when making authorization decisions.
GrantedAuthority is an interface with only one method:
String getAuthority();
This method allows AccessDecisionManager s to obtain a precise String representation of the GrantedAuthority. By returning a representation as a String, aGrantedAuthority can be easily 'read' by most AccessDecisionManager s. If a GrantedAuthority cannot be precisely represented as a String, theGrantedAuthority is considered 'complex' and getAuthority() must return null.
An example of a 'complex' GrantedAuthority would be an implementation that stores a list of operations and authority thresholds that apply to different customer account numbers. Representing this complex GrantedAuthority as a String would be quite difficult, and as a result the getAuthority() method should returnnull. This will indicate to any AccessDecisionManager that it will need to specifically support the GrantedAuthority implementation in order to understand its contents.
Spring Security includes one concrete GrantedAuthority implementation, GrantedAuthorityImpl. This allows any user-specified String to be converted into aGrantedAuthority. All AuthenticationProvider s included with the security architecture use GrantedAuthorityImpl to populate the Authentication object.
21.2 Pre-Invocation Handling
As wersquo;ve also seen in the Technical Overview chapter, Spring Security provides interceptors which control access to secure objects such as method invocations or web requests. A pre-invocation decision on whether the invocation is allowed to proceed is made by the AccessDecisionManager.
21.2.1 The AccessDecisionManager
The AccessDecisionManager is called by the AbstractSecurityInterceptor and is responsible for making final access control decisions. theAccessDecisionManager interface contains three methods:
void decide(Authentication authentication, Object secureObject,
Collectionlt;ConfigAttributegt; attrs) throws AccessDeniedException;
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
The AccessDecisionManagerrsquo;s `decide method is passed all the relevant information it needs in order to make an authorization decision. In particular, passing the secure Object enables those arguments contained in the actual secure object invocation to be inspected. For example, letrsquo;s assume the secure object was a`MethodInvocation`. It would be easy to query the MethodInvocation for any Customer argument, and then implement some sort of security logic in theAccessDecisionManager to ensure the principal is permitted to operate on that customer. Implementations are expected to throw an AccessDeniedException if access is denied.
The supports(ConfigAttribute) method is called by the AbstractSecurityInterceptor at startup time to determine if the AccessDecisionManager can process the passed ConfigAttribute. The supports(Class) method is called by a security interceptor implementation to ensure the configuredAccessDecisionManager supports the type of secure object that the security interceptor will present.
21.2.2 Voting-Based AccessDecisionManager Implementations
Whilst users can implement their own AccessDecisionManager to control all aspects of authorization, Spring Security includes several AccessDecisionManagerimplementations that are based on voting. Figure 21.1, “Voting Decision Manager” illustrates the relevant classes.
Figure 21.1. Voting Decision Manager
Using this approach, a series of AccessDecisionVoter implementations are polled on an authorization decision. The AccessDecisionManager then decides whether or not to throw an AccessDeniedException based on its assessment of the votes.
The AccessDecisionVoter interface has three methods:
int vote(Authentication authentication, Object object, Collectionlt;ConfigAttributegt; attrs);
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
Concrete implementations return an int, with possible values being reflected in the AccessDecisionVoter static fields ACCESS_ABSTAIN, ACCESS_DENIED an
剩余内容已隐藏,支付完成后下载完整资料
第六部分 、授权
Spring Security 中的高级授权能力代表了最有说服力的原因,其受欢迎的。不管你选择如何认证 - 是否使用Spring Security的提供机制和供应商,或与容器或其他非Spring Security认证机构,合并 - 你会发现授权服务可以在应用程序中以一致和简单的使用办法。
在这一部分,我们将探索不同的是AbstractSecurityInterceptor实现,这是在第一部分介绍了然后,我们继续前进,探索如何通过使用域名访问控制列表的微调授权。
21.授权体系结构
21.1当局
正如我们在技术概述看到,所有的认证实现存储GrantedAuthority对象的列表。这些代表已被授予本金当局。该GrantedAuthority对象插入到AuthenticationManager的认证对象,并作出授权决策时稍后阅读byAccessDecisionManager秒。
GrantedAuthority是一个只有一个方法接口:
串getAuthority();
这种方法允许的AccessDecisionManager获得的GrantedAuthority的一个精确的String表示。通过返回的String,aGrantedAuthority可以很容易地被大多数的AccessDecisionManager“读取”。如果GrantedAuthority不能精确地表示为一个字符串,theGrantedAuthority被认为是“复杂的”,然后()必须返回null。
一个“复杂”的GrantedAuthority的一个例子是,其存储了适用于不同的客户帐号的操作和权威的阈值的列表的实现。表示这种复杂的GrantedAuthority作为字符串将是非常困难的,其结果是getAuthority()方法应该return null。这将指示,它需要特别支持,以了解其内容的GrantedAuthority实现任何的AccessDecisionManager。
春季安全包含一个具体的GrantedAuthority实施的GrantedAuthorityImpl。这允许任何用户指定的字符串转换成aGrantedAuthority。所有好的AuthenticationProvider包含在安全架构使用的GrantedAuthorityImpl填充Authentication对象。
21.2预调用处理
正如我们也是在技术概述一章看到的那样,Spring Security提供用于控制访问安全对象,例如方法调用或web请求拦截器。在调用是否允许进行一个调用预先决定由AccessDecisionManager实现。
21.2.1这个AccessDecisionManager
这个AccessDecisionManager被AbstractSecurityInterceptor调用,它用来作最终访问控制的决定。 theAccessDecisionManager接口包含三个方法:
void decide(Authentication authentication, Object secureObject,
Collectionlt;ConfigAttributegt; attrs) throws AccessDeniedException;
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
这个AccessDecisionManager的`决定方法通过了所有它为了使授权决策所需要的相关信息。特别是,通过安全对象可以使包含在实际的安全对象调用这些参数来进行检查。例如,假设安全对象是a`MethodInvocation`。这将是很容易查询任何Customer参数的MethodInvocation,然后实现某种在theAccessDecisionManager安全逻辑,以确保本金允许在客户操作。实现预期如果访问被拒绝抛出一个AccessDeniedException。
支撑(的ConfigAttribute)方法是通过在启动时AbstractSecurityInterceptor调用,以确定AccessDecisionManager是否可以处理所传递的ConfigAttribute。支撑(Class)方法被安全拦截器实现调用,确保configuredAccessDecisionManager支持安全对象的安全拦截器将呈现类型。
基于投票
21.2.2 AccessDecisionManager实现
虽然用户可以实现自己的AccessDecisionManager来控制所有授权的方面,Spring Security的包括很多基于投票的AccessDecisionManagerimplementations。图21.1,“投票决议管理器”显示有关的类。
使用这种方法,一系列的AccessDecisionVoter实现轮询在一个授权决定。这个AccessDecisionManager然后决定是否基于它的投票评估抛出一个AccessDeniedException。
该接口的AccessDecisionVoter有三种方法:
int vote(Authentication authentication, Object object, Collectionlt;ConfigAttributegt; attrs);
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
具体实现返回一个int,与所反映的AccessDecisionVoter静态属性ACCESS_ABSTAIN,ACCESS_DENIED andACCESS_GRANTED可能值。具有投票权的实现将返回ACCESS_ABSTAIN,如果它有一个授权决定没有意见。如果确实有意见,它必须返回eitherACCESS_DENIED或ACCESS_GRANTED。
有三个具体的AccessDecisionManager Spring Security提供可以进行投票。该ConsensusBased实现将根据非弃权票的共识授予或拒绝访问。提供属性在票数相等的情况下,或者如果所有投票都是弃权控制行为。如果收到一个或多个ACCESS_GRANTED票TheAffirmativeBased实现会授予访问权限(即一个拒绝票将被忽略,如果这里至少有一个赞成票)。像ConsensusBased实现,还有如果所有投票都弃权控制行为的参数。该UnanimousBased商预计一致ACCESS_GRANTED票,以允许访问,忽略弃权票。如果有任何一个ACCESS_DENIED投票,它会拒绝访问。像其他的实现,还有如果所有投票都弃权控制行为的参数。
它可以实现不同的投票统计自定义的AccessDecisionManager。例如,一个特定的AccessDecisionVoter票可能会获得额外的权重,这样一个从一个特定的选民拒绝票可能有否决权的效果。
的RoleVoter
Spring Security提供的最常用的AccessDecisionVoter是简单的RoleVoter,它把配置属性为简单的角色名称和表决,如果用户被分配了角色授予访问权限。
如果有任何一个配置以前缀ROLE_就可以进行投票。它会投票,如果有它返回一个字符串内容(通过getAuthority()方法)一个GrantedAuthority恰好等于开始前缀ROLE_一个或多个ConfigAttributes授予访问权限。如果有anyConfigAttribute的开始ROLE_没有精确匹配,RoleVoter就会拒绝访问。如果没有的ConfigAttribute以ROLE_开始,选民会投弃权票。
AuthenticatedVoter使用
我们已经看到隐含另一个选民是AuthenticatedVoter使用,它可以用来匿名区分,充分验证的,记住,我验证的用户。许多网站允许记得,我的身份验证在一定的机会有限,但需要用户通过登录完全访问确认他们的身份。
当我们使用属性IS_AUTHENTICATED_ANONYMOUSLY授予匿名访问,此属性正在由AuthenticatedVoter使用处理。看到这个类的Javadoc获取更多信息。
自定义选民
很明显,你也可以实现自定义的AccessDecisionVoter你可以把刚才你在它想要的任何访问控制逻辑。这可能是特定于应用程序(业务逻辑相关的),也可能实现一些安全管理逻辑。例如,你会发现SpringSource的网站,其中介绍了如何使用投票人否认实时获得用户的帐户已被暂停了博客文章。
21.3调用操作后
虽然AccessDecisionManager被AbstractSecurityInterceptor在执行安全方法调用之前调用,一些应用程序需要修改安全对象调用实际返回的对象的方式。虽然你可以很容易地实现自己的AOP涉及实现,Spring Security提供有它的ACL功能集成许多具体实现方便的钩子。
图21.2,“调用执行后”说明了Spring Security的AfterInvocationManager及其具体实现。
图21.2。调用后实施
像Spring Security的其他很多地方,AfterInvocationManager有一个单独的具体实现,AfterInvocationProviderManager有其投票名单ofAfterInvocationProvider秒。每个被的AfterInvocationProvider允许修改返回对象,或抛出AccessDeniedException异常。确实多个提供可以修改对象,如先前提供的结果被传递到列表中的下一个。
请注意,如果你使用AfterInvocationManager,你仍然需要配置属性,让theMethodSecurityInterceptor的AccessDecisionManager允许一个操作。如果你使用典型的Spring Security包含AccessDecisionManagerimplementations,有特定的安全方法调用定义会导致各的AccessDecisionVoter弃权没有配置属性。反过来,AccessDecisionManager是否财产“allowIfAllAbstainDecisions”是假的,一个AccessDeniedException会被抛出。您可能会避免是(i)设定为“allowIfAllAbstainDecisions”为真(虽然这是一般不推荐使用)或(ii)只是确保至少有一个配置属性,它一个AccessDecisionVoter会投赞成票授予访问这个潜在的问题。后者(推荐)方法通常是通过一个ROLE_USER orROLE_AUTHENTICATED配置属性来实现的。
21.4分层角色
这是一个常见的需求,在应用程序中的特定角色应自动“包含”其他角色。例如,其中有一个“管理员”和“用户”角色概念的应用程序,你可能需要一个管理员能够做的一切正常的用户都可以。要做到这一点,你可以确保所有的管理员用户也被分配了“用户”的角色。或者,你可以修改它要求“用户”角色还包括“管理员”角色每次访问限制。如果您在应用程序有很多不同的角色,这样可以得到相当复杂。
使用一个角色的层次,您可以配置哪些角色(或主管机关)应包括其他人。 Spring Security的的RoleVoter,RoleHierarchyVoter的扩展版本,配置了一个RoleHierarchy,从中获得该用户分配所有“可达当局”。典型的配置可能是这样的:
lt;bean id='roleVoter' class='org.springframework.security.access.vote.RoleHierarchyVoter'gt;
lt;constructor-arg ref='roleHierarchy' /gt;
lt;/beangt;
lt;bean id='roleHierarchy'
class='org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl'gt;
lt;property name='hierarchy'gt;
lt;valuegt;
ROLE_ADMIN gt; ROLE_STAFF
ROLE_STAFF gt; ROLE_USER
ROLE_USER gt; ROLE_GUEST
lt;/valuegt;
lt;/propertygt;
lt;/beangt;
在这里,我们有一个层次ROLE_ADMINrArr;ROLE_STAFFrArr;ROLE_USERrArr;ROLE_GUEST四个角色。谁进行验证ROLE_ADMIN的用户,就会认为他们有四个角色时的安全性约束上是针对上述RoleHierarchyVoter cconf
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[148011],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、开题报告、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 饮用水微生物群:一个全面的时空研究,以监测巴黎供水系统的水质外文翻译资料
- 步进电机控制和摩擦模型对复杂机械系统精确定位的影响外文翻译资料
- 具有温湿度控制的开式阴极PEM燃料电池性能的提升外文翻译资料
- 警报定时系统对驾驶员行为的影响:调查驾驶员信任的差异以及根据警报定时对警报的响应外文翻译资料
- 门禁系统的零知识认证解决方案外文翻译资料
- 车辆废气及室外环境中悬浮微粒中有机磷的含量—-个案研究外文翻译资料
- ZigBee协议对城市风力涡轮机的无线监控: 支持应用软件和传感器模块外文翻译资料
- ZigBee系统在医疗保健中提供位置信息和传感器数据传输的方案外文翻译资料
- 基于PLC的模糊控制器在污水处理系统中的应用外文翻译资料
- 光伏并联最大功率点跟踪系统独立应用程序外文翻译资料