spring security访问控制决策管理器

在这里插入图片描述
我们先来看下类图。顶层接口为 AccessDecisionManager,仅有一个抽象实现,三个具体实现类继承自抽象类。

  • AffirmativeBased 一票通过制
  • ConsensusBased 半数以上通过制
  • UnanimousBased 全数通过制
    见名知意,不用我多解释了。
    在这几个决策器中调用投票器AccessDecisionVoter,进行投票。
    RoleVoter投票器的逻辑如下:
public int vote(Authentication authentication, Object object,
			Collection<ConfigAttribute> attributes) {
		//先判断是否认证,未认证直接投拒绝票
		if (authentication == null) {
			return ACCESS_DENIED;
		}

		int result = ACCESS_ABSTAIN;
		//从认证信息中获取用户拥有得权限信息
		Collection<? extends GrantedAuthority> authorities = extractAuthorities(authentication);
		//遍历访问需要得权限信息
		for (ConfigAttribute attribute : attributes) {
		//判断是否以ROLE_开头(根据不同的业务不同)
			if (this.supports(attribute)) {
				result = ACCESS_DENIED;
				//遍历用户拥有得权限信息与访问所需得信息进行匹配
				// Attempt to find a matching granted authority
				for (GrantedAuthority authority : authorities) {
					if (attribute.getAttribute().equals(authority.getAuthority())) {
						return ACCESS_GRANTED;
					}
				}
			}
		}
		return result;
	}

投票器的三个常量

  • ACCESS_ABSTAIN 0 弃权
  • ACCESS_DENIED -1反对票
  • ACCESS_GRANTED 1通过票

一次只能使用一个决策器,可以使用多个投票器。
来看决策器的源码
AffirmativeBased.java

public void decide(Authentication authentication, Object object,
			Collection<ConfigAttribute> configAttributes) throws AccessDeniedException {
		int deny = 0;
		//循环配置的所有投票器
		for (AccessDecisionVoter voter : getDecisionVoters()) {
			int result = voter.vote(authentication, object, configAttributes);

			if (logger.isDebugEnabled()) {
				logger.debug("Voter: " + voter + ", returned: " + result);
			}
			//此处逻辑可以看出,只要有一票通过则通过
			switch (result) {
			case AccessDecisionVoter.ACCESS_GRANTED:
				return;

			case AccessDecisionVoter.ACCESS_DENIED:
				deny++;

				break;

			default:
				break;
			}
		}

		if (deny > 0) {
			throw new AccessDeniedException(messages.getMessage(
					"AbstractAccessDecisionManager.accessDenied", "Access is denied"));
		}
		//如果所有都弃权了怎么办?在父类里面有个属性allowIfAllAbstainDecisions 配置为true 则算通过,如果为false 则不通过抛出拒绝访问异常。默认false
		// To get this far, every AccessDecisionVoter abstained
		checkAllowIfAllAbstainDecisions();
	}

同理其它的决策器也是如此不多介绍。

那么如果不用默认配置,我们应该如何配置它呢?你只需要自定义AccessDecisionManager的实例化过程即可。如下配置了默认RoleVoter以及自定义Voter。然后将accessDecisionManager 配置给 http即可。

    @Bean
    public AccessDecisionManager accessDecisionManager(){
        //此处无需用linkList 本身与顺序无关。
        List<AccessDecisionVoter<? extends Object>> decisionVoters=new ArrayList<>();
        AccessDecisionVoter roleVoter=new RoleVoter();
        decisionVoters.add(roleVoter);
        decisionVoters.add(customVoter);
        return new AffirmativeBased(decisionVoters);
    }
//代码片段其它内容自己加
public void configure(HttpSecurity http){
		 http.authorizeRequests().accessDecisionManager(accessDecisionManager());
}

也就是说,如果我们需要扩展,直接实现一个voter,然后将之注册到AccessDecisionManager中即可。

AbstractInterceptUrlConfigurer.getAccessDecisionManager中可以看到,security默认配置的就是AffirmativeBased 决策器

/**
	 * Creates the default {@code AccessDecisionManager}
	 * @return the default {@code AccessDecisionManager}
	 */
	private AccessDecisionManager createDefaultAccessDecisionManager(H http) {
		AffirmativeBased result = new AffirmativeBased(getDecisionVoters(http));
		return postProcess(result);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最新SSM项目教材管理系统Vue.zip是一个为教育机构和学校设计的在线教材管理平台。该项目以Spring Spring MVC MyBatis作为后端技术架构,并结合前端Vue.js技术,旨在为教师、学生以及教育管理者提供一个高效、便捷的教材管理和分发系统。 以下是对该系统的主要功能和特点的介绍: 1. **教材信息管理**:系统允许管理员添加、编辑和删除教材信息,包括教材名称、作者、出版社、ISBN号等详细资料。 2. **教材库存管理**:系统支持对教材库存数量的实时监控和管理,便于及时补充库存。 3. **需求与供应匹配**:系统能够自动匹配教师和学生的教材需求与当前库存情况,优化教材分配。 4. **在线订购**:学生和教师可以通过系统直接订购所需的教材,简化了传统的教材采购流程。 5. **配送跟踪**:系统提供教材配送跟踪功能,确保教材能够及时准确地送达用户手中。 6. **报表统计**:系统提供教材销售、库存变动等各类报表,辅助管理人员进行数据分析和决策。 7. **安全性设计**:后端采用Spring Security进行安全控制,确保了用户认证和授权的安全性,保护教育数据不被未授权访问。 8. **界面友好性**:前端使用Vue.js构建,提供了清晰的导航、合理的布局和响应式设计,使得操作界面直观易用。 9. **技术文档**:项目提供完善的技术文档,包括系统架构、代码结构、API接口说明等,方便开发者快速上手和维护。 10. **数据库设计**:使用MySQL数据库存储教材信息、用户信息、交易记录等数据,MyBatis作为ORM工具,简化了数据库操作,提高了开发效率。 11. **前后端分离**:采用前后端分离的架构,使得前端Vue.js视图和后端Java服务可以独立开发和部署,提高了开发效率和系统的可维护性。 综上所述,这个资源包适合计算机科学与技术专业的学生、Web开发人员、项目经理以及对教材管理系统感兴趣的人士使用。通过这些资料,用户可以了解到如何构建一个高效、现代化的教材管理系统,并且可以作为一个实用的案例来学习Vue.js和SSM框架在实际应用中的使用。
最新SSM项目旅社客房收费管理系统Vue.zip是一个为酒店和旅社量身定做的客房管理和计费系统。该项目以Spring Spring MVC MyBatis作为后端技术架构,并结合前端Vue.js技术,旨在帮助旅社高效管理客房状态、客户信息以及财务收费等核心业务。 以下是对该系统的主要功能和特点的介绍: 1. **房间管理**:系统支持对各类房间的管理,包括房间号、类型、价格、状态(空闲/占用/维修)等信息。 2. **客户管理**:系统能够记录客户的基本信息,包括姓名、联系方式、身份证号等,并与客户入住的房间相关联。 3. **预订与入住**:系统提供房间预订功能,并可处理实际入住时的房间分配和客户登记。 4. **收费结算**:系统自动计算客户的住宿费用,支持多种支付方式,并提供发票打印等财务结算服务。 5. **报表统计**:系统提供收入统计、房间使用率、客户来源分析等报表,辅助经营决策。 6. **权限控制**:系统可能设定了前台接待、财务管理员、系统管理员等不同角色,每个角色都有其专属的功能和权限。 7. **安全性设计**:后端采用Spring Security进行安全控制,确保了用户认证和授权的安全性,保护旅社数据不被未授权访问。 8. **界面友好性**:前端使用Vue.js构建,提供了清晰的导航、合理的布局和响应式设计,使得操作界面直观易用。 9. **技术文档**:项目提供完善的技术文档,包括系统架构、代码结构、API接口说明等,方便开发者快速上手和维护。 10. **数据库设计**:使用MySQL数据库存储房间信息、客户信息、交易记录等,MyBatis作为ORM工具,简化了数据库操作,提高了开发效率。 11. **前后端分离**:采用前后端分离的架构,使得前端Vue.js视图和后端Java服务可以独立开发和部署,提高了开发效率和系统的可维护性。 综上所述,这个资源包适合计算机科学与技术专业的学生、Web开发人员、项目经理以及对旅社客房收费管理系统感兴趣的人士使用。通过这些资料,用户可以了解到如何构建一个高效、现代化的旅社客房收费管理系统,并且可以作为一个实用的案例来学习Vue.js和SSM框架在实际应用中的使用。
最新SSM项目物流信息管理系统JSP.zip是一个面向物流行业的信息管理平台。该项目以Spring Spring MVC MyBatis作为后端技术架构,并使用JSP作为前端展示层,旨在为物流公司提供一个全面的信息管理和处理解决方案。 以下是对该系统的主要功能和特点的介绍: 1. **用户角色定义**:系统可能设定了仓库管理员、物流调度员、运输司机、客服人员等不同角色,每个角色都有其专属的功能和界面。 2. **货物追踪管理**:提供货物从入库到出库的全程追踪,包括存储位置、运输状态和交付情况。 3. **库存控制**:实现库存量的实时监控和自动报警,优化库存水平,减少积压。 4. **运输调度**:根据货物类型、目的地和客户需求,智能安排运输计划和路线。 5. **客户服务**:提供客户查询货物状态的接口,增强客户满意度和透明度。 6. **报表统计**:生成各种运营报表,如库存报表、运输效率报表、客户反馈报表等,帮助管理层做出决策。 7. **安全性设计**:后端采用Spring Security进行安全控制,确保了用户认证和授权的安全性,保护敏感商业数据不被未授权访问。 8. **前后端整合**:虽然前端使用JSP,但通过与后端SSM框架整合,可实现动态内容展示和交互式操作。 9. **技术文档**:项目提供完善的技术文档,包括系统架构、代码结构、API接口说明等,方便开发者理解和维护。 10. **数据库设计**:使用MySQL进行数据存储,并通过MyBatis实现高效的数据库操作和映射,确保数据一致性和快速访问。 11. **模块化开发**:系统采用模块化的设计,易于未来的扩展和维护,同时也便于团队协作和并行开发。 综上所述,这个资源包适合计算机科学与技术专业的学生、Web开发人员、项目经理以及对物流信息管理感兴趣的人士使用。通过这些资料,用户可以了解到如何构建一个高效、现代化的物流信息管理系统,并且可以作为一个实用的案例来学习SSM框架和JSP在实际应用中的使用。
采用SpringSecurity框架,用户登录采用拦截器实现,WebSecurityConfig实现WebSecurityConfigurerAdapter接口对拦截信息进行配置,包含设置登录页和允许访问的接口,自定义登录失败、登录成功返回对象,配置自定义密码验证拦截器对用户名和密码进行校验,判断是否为空,LoginValidateAuthenticationProvider实现AuthenticationProvider接口,获取用户名和密码,调用userService中loadUserByUsername方法,查询用户是否存在,校验用户密码是否正确,并查出用户对应的角色信息,并返回SecurityUser对象,用户身份已认证。项目启动时,执行定时任务,缓存权限数据,将需要通过认证的菜单及对应的角色信息和不需要认证的菜单分别存入reids,,用户登录后访问后台接口,拦截器调用getAttributes方法,获取redis中缓存的所有需要权限认证的url和不需要权限认证的url,获取当前访问的url信息,判断是当前访问的url是否需要认证,若为公共权限,不需要认证,直接返回null,若不是,返回该url对应的角色信息。返回后鉴权决策管理器AccessDecisionManagerImpl(实现AccessDecisionManager接口)中调用decide方法,判断configAttributes(该集合存角色信息)集合如果为空,直接通过,如果不为空,判断缓存中该url对应的角色列表是否包含当前用户角色信息,不包含抛出异常,包含则该url通过。项目中包含sql文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值