web应用的认证过程会稍微复杂一些,同样经过简化可以表述如下:
用户访问某个受保护的url
AbstractSecurityInterceptor拦截这个请求,并抛出没有权限
ExceptionTranslationFilter捕获这个异常
如果检测到用户没有认证,于是通过AuthenticationEntryPoint重定向用户到一个登录页面;
如果发现已经认证但是权限不足,通常返回HTTP 403.
接下来的认证过程和上面是类似的。
鉴权决策的核心接口是AccessDecisionManager,他的核心方法是void decide(Authentication authentication, Object object,Collection<ConfigAttribute> configAttributes):第一个参数我们已经知道是认证信息,第二个参数代表要访问的受保护对象,第三个参数是这个资源的权限属性集。
6.可以获取ioc容器中的各个bean,过滤器不行,在里注入一个service可以调用业务逻辑。 3、保护权限或私有权限的派生类,在类外使用基类定义对象来调用,与使用派生类来定义对象来调用编译结果是不同的。
查找当前受保护对象的权限属性;
将受保护对象(secure object),权限属性(configuration attributes),当前的认证信息(authentication),提交给AccessDecisionManager;
如果鉴权通过,继续执行正常的访问;
权限属性(configuration attribute)是受保护对象关联的,用户权限鉴定的数据,一般就是普通的字符串。web.xml中的filter对这个属性的解释取决于AccessDecisionManager的实现。通过为AbstractSecurityInterceptor配置SecurityMetadataSource来实现权限属性的查找。比如,在xml配置里面看到<intercept-url pattern='/secure/**' access='ROLE_A,ROLE_B'/>,那么配置属性“ROLE_A”和“ROLE_B”暗示角色A和B能访问这个pattern的url;当然实际是否如此还要看AccessDecisionManager的配置。这里再强调一下,"ROLE_"这个前缀是Spring Security内的一种约定,用于基于角色的鉴权机制。
AuthenticationManager仅仅是一个接口,具体的实现取决于认证的方式。Spring Security的默认实现叫做ProviderManager,它把认证功能委托给一个AuthenticationProvider列表。每个AuthenticationProvider可以返回一个完全填充(fully populated)的Authentication对象(认证成功),或抛出一个异常;可见,ProviderManager可以组合多种认证方式,一个ProviderManager bean的配置类似如下:
<bean id="authenticationManager"
class="org.springframework.security.authentication.ProviderManager">
<constructor-arg>
<list>
<ref local="daoAuthenticationProvider"/>
<ref local="anonymousAuthenticationProvider"/>
<ref local="ldapAuthenticationProvider"/>
</list>
</constructor-arg>
</bean>
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-93148-3.html
少讲话
家里米
懂吗