在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截。那么在spring security中应该怎么配置呢。
大致步骤如下:
1、用户登录成功后我们需要拿到用户所拥有的权限,并保存到当前的认证对象中。
|- SecurityUserDetailServiceImpl#loadUserByUsername(String) 在根据用户名获取到用户后,一起查询出用户拥有的权限
2、当用户访问某一个url时,我们需要判断当前访问的url所需要的权限当前认证的用户是否拥有。
|- 系统加载时需要加载出 所有的资源(url)与之对应的权限
|- 用户访问url时,如果是有权限判断的url,取出url所需要的权限和用户当前的权限进行一个比对
> 成功 放行
> 无权 拒绝
3、修改spring security的配置文件,增加我们自己的权限判断
那么我们怎么知道我们拥有哪些权限呢?我们可以基于一个简单的rbac的权限模型来进行实现。系统中存在 用户(sys_user),角色(sys_role),资源(sys_resources),用于和角色多对多关系(sys_user_role),角色和资源也是多对多关系(sys_role_resource)。
在资源这张表中记录着url和url所需要的权限。
基于上一篇 "认识 spring security" 我们来做一个简单的修改,实现url权限的拦截。
一、修改SecurityUserDetailServiceImpl这个类,在用户登录成功时,加入用户所拥有的权限
注:在上图中可以看到用户拥有 admin、01、0102这三个权限
二、编写一个方法实现系统中的url权限判断
/** * 系统中的安全资源决策 * * @描述 * @作者 huan * @时间 2017年11月4日 - 下午12:32:11 */ @Slf4j @Component("securityResourceDecisionHandler") public class SecurityResourceDecisionHandler { /** * 保存的是url以及url所需要的权限 */ private static final Map<String, List<GrantedAuthority>> URL_AUTHS = new ConcurrentHashMap<>(); static { URL_AUTHS.put("/xx", Arrays.asList(new SimpleGrantedAuthority("01"))); URL_AUTHS.put("/xx/x", Arrays.asList(new SimpleGrantedAuthority("01"))); URL_AUTHS.put("/yy", Arrays.asList(new SimpleGrantedAuthority("0102"))); URL_AUTHS.put("/zz/**", Arrays.asList(new SimpleGrantedAuthority("010201"))); } AntPathMatcher pathMatcher = new AntPathMatcher(); /** * 自定义决策 * * @param authentication * 认证对象 * @param request * 请求的request对象 * @return true:有权限访问 false:无权限访问 */ public boolean auth(Authentication authentication, HttpServletRequest request) { String uri = request.getRequestURI().replace(request.getContextPath(), ""); for (Entry<String, List<GrantedAuthority>> entry : URL_AUTHS.entrySet()) { if (pathMatcher.match(entry.getKey(), uri)) { Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); for (GrantedAuthority grantedAuthority : authorities) { if (entry.getValue().contains(grantedAuthority)) { return true; } } log.warn("当前访问的uri:{},需要的权限是:{},当前用户无此权限.", uri, entry.getValue()); return false; } } // 访问的是没有配置权限的功能,必须要登录用户才可以进行访问 if (authentication.isAuthenticated() && !Objects.equals("anonymousUser", authentication.getPrincipal())) { return true; } // 没有登录,直接返回false return false; } }
注: 注意一下 /zz/** 这个url所需要的权限是010201,而这个权限当前登录用户是没有的
三、修改spring security的配置文件
四、查看结果(/zz/**这个url需要的权限为010201,而我们只有01,0102,这2个权限,所有就报了无权访问这个。)
到此,一个基于简单的url拦截的实现就完成了。
相关推荐
本项目基于Spring,整合Spring的security模块,实现用户管理和权限控制,是一套较为通用的权限控制功能,主要内容如下: 1.登录,包括“记住我”的功能; 2.加密,存储的密码不采用明文,初始密码1234; 3.拦截器...
一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中,已经实现过,并经过验证; 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证。 三...
SpringMvc 拦截器 原理清楚,代码简单,值得学习!
springsecuritytest自定义权限成功实例.rar 每个类都有相应的详细的介绍,看懂不难,当前前提还是需要对Springsecurity有些了解,自定义权限拦截器;认证管理器;用户详细信息;资源访问管理;用户信息查询等类;
转载他人 https://blog.csdn.net/u012702547/article/details/79010010 https://blog.csdn.net/u012702547/article/details/79019510
3)过滤器拦截(MySecurityFilter:doFilter) 4)取得请求资源所需权限(MySecurityMetadataSource:getAttributes) 5)匹配用户拥有权限和请求权限(MyAccessDecisionManager:decide),如果用户没有相应的权限, ...
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...
1.本项目为SpringCloud ...2.由于Gateway采用的是纯Webflux方式,所以原有的Spring基于传统拦截器、过滤器的方式无法正常使用SpringSecurity。 3.因此,本项目根据WebFlux的方式,进行了整合,实现了登录和权限验证。
SpringSecurity 全套开发,设计源码解读,整个拦截器链分析,QQ登录,微信登录,短信验证,短信登录,在security基础上学习写一个自定义验证授权设计模式,整套视频讲解的分享细致认真,非常值得学习。不管小白还是...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...
Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
springMVC+springSecurity3+Mybaits3的权限系统 包括用户管理 角色管理 资源管理 服务器配置管理 登陆信息管理 操作日志管理 服务器监控配置 fusioncharts报表插件显示 EMALL发送(支持html语言) springQuartz...
Springboot前后端分离,JWT+Security+Redis实现登录拦截及权限认证,包含全局异常处理以及统一返回风格
打成了jar包,这个是Springboot+Spring Security整合的例子可以了解他们之间对角色的认证还有对权限的分配和拦截
根据1,2实现对访问路径的权限拦截 使用 spring security 学习总结总结是逐步进行重建的,逐步版本我都使用了git tag来管理。例如,最开始的tag是step1 ,那么可以使用 git checkout step1 来获得这一版本。版本历史...
最近看了spring security 4的开发文档,登录权限拦截封装的相当好!!! 附件为简单的多点登录demo,给开发前后台的朋友们做参考,其中authentication-provider为框架自带的user-service,后续会在整个自定义user-...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. ...
主要技术:springMVC springSecurity3.x Mybaits3.x mysql log4j md5 主要功能有: 用户管理 角色管理 资源管理 服务器配置管理 登陆信息管理 操作日志管理 查询用户 角色列表 资源列表 预警设置 用户登录记录 ...
1、通过spring security实现的RBAC权限的模型基础上实现权限、角色、资源的管理,实现根据数据库动态分配权限的功能,对未登录及未授权的操作进行拦截。在用户管理中心,管理员可添加用户代替了自行注册方式。 2、...
项目基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前后端分离的后台管理系统。使用最新技术栈,社区资源丰富。高效率开发,代码生成器可一键生成前后端代码。支持数据字典,可方便地对一些状态...