spring-security(十二)鉴权方式概述

前言:
本文主要讲述在spring security鉴权的实现方式,目前spring security 支持基于 spring aop、filter、aspectj三种认证方式,分别提供对方法调用、web请求、业务对象的访问控制。在spring security中健全主要是由AccessDecisionManager这个类完成的,这个类有一个decide方法,接受一个代表认证者信息的Authentication对象,一个安全对象(security object),以及一个和这个对象相关联的安全属性列表(例如代表所需权限的角色列表)


1. AOP通知
在spring aop中有四种通知类型:before、after、throws和around。其中around通知可以选择是否执行方法调用,是否修改返回结果,是否抛出异常。spring security就是利用around对方法调用进行保护,利用filter对web请求进行保护。
在大多数应用中,我们只需要利用spring aop对service层的方法调用进行保护就可以了,因为这里是我们主要的业务实现的地方。倘若我们还需要直接对业务对象进行保护,那就需要考虑使用AspectJ来完成,另外AspectJ也可以实现对方法调用的保护。在实际应哟个中,我们可以根据需求选择,也可以选择两种、三种组合使用。当前的主流做法是利用filter来做web请求认证,结合着spring aop对service层的方法进行认证保护。
2.安全对象和AbstractSecurityInterceptor
在spring security中安全对象指的是需要有安全措施的对象,最常见的例子就是方法调用和web请求。
每一种安全对象类型都有其对应的继承了AbstractSecurityInterceptor的拦截器类。最重要的是,在AbstractSecurityInterceptor被调用的时候,如果用户已经认证过,SecurityContextHolder中肯定会包含一个有效的Authentication对象。
AbstractSecurityInterceptor拦截器一般的执行流程如下:
[list]
[*]a.查找和当前请求相关的配置属性-configuration attributes(如权限列表)
[*]b.传递Authentication对象、安全对象和配置属性给AccessDecisionManager的decide方法
[*]c.选择性的改变传入的Authentication对象
[*]d.放行对安全对象的调用(假设当前用户具有访问权限)
[*]e.如果配置了AfterInvocationManager,当decide方法结束时继续调用AfterInvocationManager,如果在decide方法内部抛出异常就不在调用
[/list]
3.配置属性:Configuration Attributes
配置属性可以简单的认为是对AbstractSecurityInterceptor有特殊含义的字符串,在spring security中用ConfigAttribute类来表示。根据AccessDecisionManager的具体实现,这个属性即可以是一个简单角色名称,也可以包含特定意义。在AbstractSecurityInterceptor中有一个securityMetadataSource属性,用来查找当前被访问对象对应的配置属性,AbstractSecurityInterceptor的具体实现类的SecurityMetadataSource属性也不相同,FilterSecurityInterceptor中用FilterInvocationSecurityMetadataSource来表示这些安全属性,MethodSecurityInterceptor用MethodSecurityMetadataSource来表示,对应的设置方式也不相同,FilterInvocationSecurityMetadataSource通过uris来设置,MethodSecurityMetadataSource通过方法上的注解来设置

antMatchers("/admin/**").hasRole("ADMIN")

代表着url: /admin/**对应的配置属性为ADMIN,在实际运行时,这代表着任何用户拥有ADMIN角色的权限就可以访问/admin/**这个url。因此严格来说,配置属性仅仅是一些普通的属性,具体这些属性如何解析是取决于AccessDecisionManager的实现类的,在后续章节中我们会继续探讨AccessDecisionManager是如何实现的。

你可能感兴趣的:(spring,security)