文章目录

  • 一、数据准备
    • 1.1 创建permission 表
    • 1.2 创建 entity、Mapper、Service
    • 1.3 修改接口
  • 二、PermissionEvaluator

一、数据准备

1.1 创建permission 表

创建一张permission表

CREATE TABLE `permission` (`id` int(11) NOT NULL AUTO_INCREMENT,`url` varchar(255) DEFAULT NULL,`role_id` int(11) DEFAULT NULL,`permission` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

初始化两条数据

INSERT INTO chapter03.permission(id, url, role_id, permission) VALUES (1, ‘/admin’, 1, ‘c,r,u,d’);
INSERT INTO chapter03.permission(id, url, role_id, permission) VALUES (2, ‘/admin’, 2, ‘r’);

1.2 创建 entity、Mapper、Service

(1)、创建permission实体

package com.sl.entity;import java.io.Serializable;
import java.util.Arrays;
import java.util.List;/*** @author shuliangzhao* @Title: Permission* @ProjectName spring-boot-learn* @Description: TODO* @date 2019/8/6 19:22*/
public class Permission implements Serializable {private Integer id;private String url;private Integer roleId;private String permission;private List<String> permissions;public List<String> getPermissions() {return Arrays.asList(this.permission.trim().split(","));}public void setPermissions(List<String> permissions) {this.permissions = permissions;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Integer getRoleId() {return roleId;}public void setRoleId(Integer roleId) {this.roleId = roleId;}public String getPermission() {return permission;}public void setPermission(String permission) {this.permission = permission;}
}

这里需要注意的时相比于数据库,多了一个 permissions 属性,该字段将 permission 按逗号分割为了 list。
(2)、创建permissionMapper

@Mapper
public interface PermissionMapper {@Select("SELECT * FROM permission where role_id = #{id}")List<Permission> selectListById(Integer id);
}

(3)、创建permissionService

@Service
public class PermissionService {@Autowiredprivate PermissionMapper permissionMapper;public List<Permission> selectListById(Integer id) {return permissionMapper.selectListById(id);}
}

1.3 修改接口

@Controller
public class LoginController {...@RequestMapping("/admin")@ResponseBody@PreAuthorize("hasPermission('/admin','r')")public String printAdminR() {return "如果你看见这句话,说明你访问/admin路径具有r权限";}@RequestMapping("/admin/c")@ResponseBody@PreAuthorize("hasPermission('/admin','c')")public String printAdminC() {return "如果你看见这句话,说明你访问/admin路径具有c权限";}
}
让我们修改下我们要访问的接口,@PreAuthorize("hasPermission('/admin','r')")是关键,参数1指明了访问该接口需要的url,参数2指明了访问该接口需要的权限。

二、PermissionEvaluator

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {@Autowiredprivate PermissionService permissionService;@Autowiredprivate RoleService roleService;@Autowiredprivate UserService userService;@Overridepublic boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) {// 获得loadUserByUsername()方法的结果/*String userName = (String) authentication.getPrincipal();User user = userService.selectByName(userName);*/// 获得loadUserByUsername()中注入的角色Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();// 遍历用户所有角色for (GrantedAuthority authority:authorities) {String roleName = authority.getAuthority();Integer rId = roleService.selectByName(roleName).getId();// 得到角色所有的权限List<Permission> permissions = permissionService.selectListById(rId);// permissionsfor (Permission per:permissions) {//获取权限集List<String> permissions1 = per.getPermissions();if (targetUrl.equals(per.getUrl()) && permissions1.contains(permission)) {return true;}}}return false;}@Overridepublic boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {return false;}
}

在 hasPermission() 方法中,参数 1 代表用户的权限身份,参数 2 参数 3 分别和 @PreAuthorize(“hasPermission(’/admin’,‘r’)”) 中的参数对应,即访问 url 和权限。

思路如下:

  1. 通过 Authentication 取出登录用户的所有 Role
  2. 遍历每一个 Role,获取到每个Role的所有 Permission
  3. 遍历每一个 Permission,只要有一个 Permission 的 url 和传入的url相同,且该 Permission 中包含传入的权限,返回 true
  4. 如果遍历都结束,还没有找到,返回false

下面就是在 WebSecurityConfig 中注册 CustomPermissionEvaluator

@Bean
public DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setPermissionEvaluator(customPermissionEvaluator);
return defaultWebSecurityExpressionHandler;
}

springboo整合security——权限设置相关推荐

  1. springboot security 权限不足_springBoot整合springSecurity(零一)

    整体结构===>>> 1,springboot2.0整合springSecurity5.1.1 2,mysql--->>InnoDB 3,持久层我用的是用Mybatiys ...

  2. springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理

    介绍 本系统为springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理.页面为极简模式,没有任何渲染. 源码:https://gite ...

  3. Jsp Spring Security 权限管理系统

    Jsp Spring Security 权限管理系统 权限管理搭建要的问题: 1.区分Authentication(验证)与 Authorization(授权) 验证 这个用户是谁? 用户身份可靠吗? ...

  4. Samba服务器原理及实验搭建(匿名共享,用户认证,权限设置,IP限制,目录挂载,桌面运维)

    本文目录 Samba服务器概念与原理 一.引子 二.samba原理及基本概念 三.samba共享实验搭建(匿名共享,用户认证,权限设置,IP限制,目录挂载,桌面运维) Samba服务器概念与原理 一. ...

  5. springboot 2.x 整合 shiro 权限框架

    序 在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务.比如,普通用户只能浏览:会员可以浏览和评论:超级会员可以浏览.评论和看视频课等:实际应用场景很多.毫不夸张 ...

  6. SpringBoot2.x 整合 shiro 权限框架

    每天早上七点三十,准时推送干货 在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务.比如,普通用户只能浏览:会员可以浏览和评论:超级会员可以浏览.评论和看视频课等 ...

  7. asp.net权限设置可能导致应用程序无法正常运行(转)

    asp.net权限设置可能导致应用程序无法正常运行   有些时候我们写的asp.net应用程序是运行在虚拟主机上.有一些虚拟主机可能是由于安全的考虑,对asp.net做了权限设置,会导致我们的应用程序 ...

  8. Hadoop Kerberos 认证下 Sentry 安装 + Sentry 权限设置使用

    目录 一.安装Sentry 1.MariaDB中创建sentry数据库 2.CDH中添加sentry 服务 3.hive配置 启动Sentry 4.Impala配置 启动Sentry 5.Hue配置 ...

  9. android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...

最新文章

  1. [self Introduce]MY job pic
  2. HDU 1257 最少拦截系统(贪心)
  3. php 获取一年的月份_php 根据日期获取星座
  4. 在内存中动态生成缩略图
  5. C++/Qt 序列化操作
  6. STM32F107 资料
  7. 别老盯着5G,这些物联网应用用4G LTE技术足够了
  8. 【THREE源码解析篇】THREE.Sprite详解
  9. HC小区管理系统mysql如何修改密码
  10. 红帽认证工程师(RHCE)的发展前景
  11. 自建游戏加速器教程(国内玩家联机)
  12. 决策树(ID3、C4.5、CART、随机森林)
  13. 笨方法学python3怎么样_笨办法学Python3
  14. 投资理财之基金一、初识基金
  15. 生成linux命令,详解Linux下随机生成密码的命令总结
  16. [青少年CTF]弱口令实验室招新赛部分WriteUp
  17. 密歇根大学计算机专业怎么样,密歇根大学安娜堡分校UMich计算机科学Computer Science专业排名第26位(2021年THE世界大学商科排名)...
  18. Linux vi种 wq 、wq!、x、q、q!区别
  19. 【Chrome】Chrome主页被毒霸篡改,重新设置主页也没作用解决办法
  20. java-php-python-ssm研究生推免系统计算机毕业设计

热门文章

  1. 简述微型计算机的工作原理,高教自学考试微机原理及应用模拟试题
  2. shell指令可以直接在终端输入吗_简化shell终端命令输入的脚本式快捷键工具
  3. php的工厂设计模式,PHP中的工厂设计模式是什么?
  4. python源码精要(2)-C代码规范
  5. 【Python】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单
  6. 【Python】扫盲帖:关于在Windows、Linux和Mac上安装设置Python的问题
  7. 开心一刻,你和导师之间有什么有趣的事情?
  8. 【论文解读】DeepFM论文总结
  9. 【数学基础】正态分布为什么如此常见?
  10. 盘一盘推荐系统里值得一读的那些论文