Spring Security(15)——权限鉴定结构

本文详细介绍了Spring Security的权限鉴定结构,包括权限、调用前处理、AccessDecisionManager及其基于投票的实现,如RoleVoter和AuthenticatedVoter。重点讨论了如何实现角色继承以简化权限管理,并提供了相关配置示例。


 

1.1    权限

       所有的Authentication实现类都保存了一个GrantedAuthority列表,其表示用户所具有的权限。GrantedAuthority是通过AuthenticationManager设置到Authentication对象中的,然后AccessDecisionManager将从Authentication中获取用户所具有的GrantedAuthority来鉴定用户是否具有访问对应资源的权限。

       GrantedAuthority是一个接口,其中只定义了一个getAuthority()方法,其返回值为String类型。该方法允许AccessDecisionManager获取一个能够精确代表该权限的字符串。通过返回一个字符串,一个GrantedAuthority能够很轻易的被大部分AccessDecisionManager读取。如果一个GrantedAuthority不能够精确的使用一个String来表示,那么其对应的getAuthority()方法调用应当返回一个null,这表示AccessDecisionManager必须对该GrantedAuthority的实现有特定的支持,从而可以获取该GrantedAuthority所代表的权限信息。

       Spring Security内置了一个GrantedAuthority的实现,SimpleGrantedAuthority。它直接接收一个表示权限信息的字符串,然后getAuthority()方法直接返回该字符串。Spring Security内置的所有AuthenticationProvider都是使用它来封装Authentication对象的。

 

1.2     调用前的处理

       Spring Security是通过拦截器来控制受保护对象的访问的,如方法调用和Web请求。在正式访问受保护对象之前,Spring Security将使用AccessDecisionManager来鉴定当前用户是否有访问对应受保护对象的权限。

 

1.2.1AccessDecisionManager

       AccessDecisionManager是由AbstractSecurityInterceptor调用的,它负责鉴定用户是否有访问对应资源(方法或URL)的权限。AccessDecisionManager是一个接口,其中只定义了三个方法,其定义如下。

public interface AccessDecisionManager {

 

    /**

     * 通过传递的参数来决定用户是否有访问对应受保护对象的权限

     *

     * @param authentication 当前正在请求受包含对象的Authentication

     * @param object 受保护对象,其可以是一个MethodInvocationJoinPointFilterInvocation

     * @param configAttributes 与正在请求的受保护对象相关联的配置属性

     *

     */

    void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)

        throws AccessDeniedException, InsufficientAuthenticationException;

 

    /**

     * 表示当前AccessDecisionManager是否支持对应的ConfigAttribute

     */

    boolean supports(ConfigAttribute attribute);

 

    /**

     * 表示当前AccessDecisionManager是否支持对应的受保护对象类型

     */

    boolean sup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值