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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项