springboo整合security——权限设置

2024-04-21 23:08

本文主要是介绍springboo整合security——权限设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、数据准备
      • 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——权限设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924268

相关文章

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot