Spring Security(15)——权限鉴定结构
权限鉴定结构
目录
1.1 权限
1.2 调用前的处理
1.2.1 AccessDecisager
1.2.2 基于投票的Acceager实现
1.3 调用后的处理
1.4 角色的继承
1.1 权限
1.2 调用前的处理
1.2.1AccessDecisionManager
public interface AccessDecisionManager {
* @param authentication 当前正在请求受包含对象的Authentication
* @param object 受保护对象,其可以是一个MethodInvocation、JoinPoint或FilterInvocation。
* @param configAttributes 与正在请求的受保护对象相关联的配置属性
throws AccessDeniedException, InsufficientAuthenticationException;
* 表示当前AccessDecisionManager是否支持对应的ConfigAttribute
boolean supports(ConfigAttribute attribute);
* 表示当前AccessDecisionManager是否支持对应的受保护对象类型
boolean supports(Class<?> clazz);
伦理片 http://www.dotdy.com/
decide()方法用于决定authentication是否符合受保护对象要求的configAttributes。supports(ConfigAttribute attribute)方法是用来判断AccessDecisionManager是否能够处理对应的ConfigAttribute的。supports(Class<?> clazz)方法用于判断配置的AccessDecisionManager是否支持对应的受保护对象类型。
1.2.2基于投票的AccessDecisionManager实现
public interface AccessDecisionVoter<S> {
boolean supports(ConfigAttribute attribute);
boolean supports(Class<?> clazz);
int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes);
(1)只要有AccessDecisionVoter的投票为ACCESS_GRANTED则同意用户进行访问;
(3)如果没有一个人投赞成票,但是有人投反对票,则将抛出AccessDeniedException。
(2)反过来,如果反对票多于赞成票则将抛出AccessDeniedException。
(1)如果受保护对象配置的某一个ConfigAttribute被任意的AccessDecisionVoter反对了,则将抛出AccessDeniedException。
(3)如果全部弃权了,则将视参数allowIfAllAbstainDecisions的值而定,true则通过,false则抛出AccessDeniedException。
1.2.2.1RoleVoter
1.2.2.2AuthenticatedVoter
1.2.2.3自定义Voter
1.3 调用后的处理
public interface AfterInvocationManager {
Object decide(Authentication authentication, Object object, Collection<ConfigAttribute> attributes,
Object returnedObject) throws AccessDeniedException;
boolean supports(ConfigAttribute attribute);
boolean supports(Class<?> clazz);
以下是Spring Security官方文档提供的一个AfterInvocationManager构造实现的图。
需要注意的是AfterInvocationManager需要在受保护对象成功被访问后才能执行。
1.4 角色的继承
对于角色继承这种需求也是经常有的,比如要求ROLE_ADMIN将拥有所有的ROLE_USER所具有的权限。当然我们可以给拥有ROLE_ADMIN角色的用户同时授予ROLE_USER角色来达到这一效果或者修改需要ROLE_USER进行访问的资源使用ROLE_ADMIN也可以访问。Spring Security为我们提供了一种更为简便的办法,那就是角色的继承,它允许我们的ROLE_ADMIN直接继承ROLE_USER,这样所有ROLE_USER可以访问的资源ROLE_ADMIN也可以访问。定义角色的继承我们需要在ApplicationContext中定义一个RoleHierarchy,然后再把它赋予给一个RoleHierarchyVoter,之后再把该RoleHierarchyVoter加入到我们基于Voter的AccessDecisionManager中,并指定当前使用的AccessDecisionManager为我们自己定义的那个。以下是一个定义角色继承的完整示例。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<!-- 通过access-decision-manager-ref指定将要使用的AccessDecisionManager -->
<security:http access-decision-manager-ref="accessDecisionManager">
<security:form-login/>
<security:intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider
user-service-ref="userDetailsService"/>
</security:authentication-manager>
<bean id="userDetailsService"
class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 自己定义AccessDecisionManager对应的bean -->
<bean id="accessDecisionManager"class="org.springframework.security.access.vote.AffirmativeBased">
<property name="decisionVoters">
<list>
<ref local="roleVoter"/>
</list>
</property>
</bean>
<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_USER
</value>
</property>
</bean>
</beans>
在上述配置中我们就定义好了ROLE_ADMIN是继承自ROLE_USER的,这样ROLE_ADMIN将能够访问所有ROLE_USER可以访问的资源。通过RoleHierarchyImpl的hierarchy属性我们可以定义多个角色之间的继承关系,如:
<bean id="roleHierarchy"
class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy"><!-- 角色继承关系 -->
<value>
ROLE_ADMIN > ROLE_USER
ROLE_A > ROLE_B
ROLE_B > ROLE_C
ROLE_C > ROLE_D
</value>
</property>
</bean>
在上述配置我们同时定义了ROLE_ADMIN继承了ROLE_USER,ROLE_A继承了ROLE_B,ROLE_B又继承了ROLE_C,ROLE_C又继承了ROLE_D,这样ROLE_A将能访问ROLE_B、ROLE_C和ROLE_D所能访问的所有资源。
Spring Security(15)——权限鉴定结构相关推荐
- 基于Spring Security实现权限管理系统
基于Spring Security实现权限管理系统 稍微复杂一点的后台系统都会涉及到用户权限管理.何谓用户权限?我的理解就是,权限就是对数据(系统的实体类)和数据可进行的操作(增删查改)的集中管理.要 ...
- SpringSecurity系列(四) Spring Security 实现权限树形菜单
SpringSecurity系列(一) 初识 Spring Security SpringSecurity系列(二) Spring Security入门 SpringSecurity系列(三) Spr ...
- Spring security开发权限管理系统(一)
从今天起,我将使用SpringBoot+SpringBoot+Mybatis+Vue从到一开发一个系统. 今天将说明Spring Security+SpringBoot+Mybatis的结合 引入PO ...
- Spring Security进行权限控制
一.SpringSecurity介绍 简介 SpringSecurity是一个专注于java应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求 特征 – 对身份的认证和 ...
- spring之使用Spring Security实现权限管理
转载:http://hanqunfeng.iteye.com/blog/1155226 目录 SpringSecurity3.X--一个简单实现 SpringSecurity3.X--前台与后台登录认 ...
- springsecurity拦截ajax,Spring Security Ajax 被拦截
背景是项目中使用Spring Security 进行安全控制 再使用Ajax的时候会报 403(ajax get 方式是没问题的 post 的时候会报) Spring Security 原本是 防止 ...
- 爆破专栏丨Spring Security系列教程之Spring Security的四种权限控制方式
原创:一一哥 前言: 在前面的章节中,一一哥 已经给大家介绍了Spring Security的很多功能,在这些众多功能中,我们知道其核心功能其实就是认证+授权. 在前面我们分别基于内存模型.基于默认的 ...
- Springboot + Spring Security 实现前后端分离登录认证及权限控制
Spring Security简介 Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展 ...
- Spring Security——基于读写锁的动态权限配置FilterInvocationSecurityMetadataSource实现类
问题描述 每次都加载资源,效率低下. 解决方案 /*** @author ShenTuZhiGang* @version 1.2.0* @date 2020-03-07 21:57*/ @Slf4j ...
最新文章
- bochs调试linux内核学习4 - bochs配置文件的$BXSHARE变量、bochs的System BIOS must end at 0xfffff错误、运行内核0.00版本
- 方案接口服务器问题记录
- InvokeWebServiceActivity
- 5行代码满分——L1-060 心理阴影面积 (5分)
- linux服务器cc防御,Linux下简单的防止CC攻击
- 第九周项目6-穷举法之年龄几何
- Vue 实现 Open Graph 分享预览
- Zend Framework实例教程三
- 理发店收银系统php,【毕业论文】基于php+mysql美发店收银系统设计与实现.doc
- 第三章EF的基本使用 综合案例(练习)
- C#语言中的修饰符汇总
- 实现财务自由 之 不可不知的常用财务网站或应用软件
- 5+API实现微信分享功能
- 电商挖角潮起:工作两年百万年薪
- 《TPM原理及应用指南》学习 —— TPM历史1
- 华为鸿蒙第一期公测,华为鸿蒙开启第二轮公测,新增7款机型,有你的吗?
- 关系与关系模式的区别——易懂
- springmvc后台获取图片,到jsp页面显示
- 性能调优 - JVM
- 总结 : 论文--Financial Distress Prediction