Spring Security 中的高级授权能力是其流行性的最令人信服的原因之一。不管你选择如何认证 —— 无论是使用 Spring Security 提供的机制和提供程序,还是与容器或其他非 Spring Security 认证机构集成 —— 你将发现授权服务可以在应用程序中一致地以及简单的方式使用。
在本部分中,我们将探讨第一部分中介绍的不同
正如我们在技术概述中看到的,所有
String getAuthority();
此方法允许
复杂的
Spring Security 包括一个具体的
正如我们在技术概览章节中看到的,Spring Security 提供了拦截器,用于控制对安全对象(如方法调用或 web 请求)的访问。允许调用继续进行的预调用决策是由
void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException; boolean supports(ConfigAttribute attribute); boolean supports(Class clazz);
虽然用户可以实现自己的
使用这种方法,在授权决策中轮询一系列
int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attrs); boolean supports(ConfigAttribute attribute); boolean supports(Class clazz);
具体实现返回一个
有三个 Spring Security 提供的具体
可以实现以不同方式投票的自定义
Spring Security 提供的最常用的
如果任何
我们隐式看到的另一个投票者是
当我们使用
显然,你还可以实现自定义
在进行安全对象调用之前,
图 25.2, “调用后实现” 说明了 Spring Security 的
与 Spring Security 的许多其他部分一样,
请注意,如果使用 在应用程序中的特定角色应该自动包含其他角色是常见的要求。例如,在具有 "admin" 和 "user" 角色概念的应用程序中,你可能希望管理员能够完成普通用户能做的所有事情。为了实现这一点,你可以确保所有管理员用户也被分配了 "user" 角色。或者,你可以修改每一个访问约束,它要求 "user" 角色也包含 "admin" 角色。如果在应用程序中有很多不同的角色,这会变得相当复杂。
角色层次结构的使用允许你配置哪些角色(或权限)应该包括其他角色。Spring Security 的 RoleVoter 的扩展版本, <bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter"> <constructor-arg ref="roleHierarchy" /> </bean> <bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl"> <property name="hierarchy"> <value> ROLE_ADMIN > ROLE_STAFF ROLE_STAFF > ROLE_USER ROLE_USER > ROLE_GUEST </value> </property> </bean>
这里,我们在层次结构 角色层次结构提供了简化应用程序的访问控制配置数据和/或减少需要分配给用户的权限数量的方便方法。对于更复杂的需求,你可能希望定义应用程序所需的特定访问权限与分配给用户的角色之间的逻辑映射,在加载用户信息时,在两者之间进行转换。 |