SpringSecurity授权

目录

一、RABC的介绍

二、权限表设计

三、编写权限控制方法

(1)mapper接口

(2)映射文件

(3)修改认证逻辑

四、配置类访问资源

五、自定义访问控制逻辑

(1)自定义

(2)配置类

六、注解设置访问控制

(1)@Secured

 (1)在配置了中开启注解使用

(2)在控制器方法上添加注解

(2)@PreAuthorize

(1)在启动类中开启注解使用

(2)在控制器方法上添加注解


一、RABC的介绍

授权即认证通过后,系统给用户赋予一定的权限,用户只能根据权限访问系统中的某些资源。RBAC是业界普遍采用的授权方式,它有两种解释:

(1)Role-Based Access Control

基于角色的访问控制,即按角色进行授权。比如在企业管理系统中,主体角色为总经理可以查询企业运营报表。逻辑为:

if(主体.hasRole("总经理角色")){

      查询运营报表

}

如果查询企业运营报表的角色变化为总经理和股东,此时就需要修改判断逻辑代码:

if(主体.hasRole("总经理角色") || 主体.hasRole("股东角色")){

     查询运营报表

}

此时我们可以发现,当需要修改角色的权限时就需要修改授权的相关代码,系统可扩展性差。

(2)Resource-Based Access Control

基于资源的访问控制,即按资源(或权限)进行授权。比如在企业管理系统中,用户必须 具有查询报表权限才可以查询企业运营报表。逻辑为:

if(主体.hasPermission("查询报表权限")){

      查询运营报表

}

这样在系统设计时就已经定义好查询报表的权限标识,即使查询报表所需要的角色变化为总经理和股东也不需要修改授权代码,系统可扩展性强。该授权方式更加常用。

二、权限表设计

用户和权限的关系为多对多,即用户拥有多个权限,权限也属于多个用户,所以建表方式如下:

image-20220329105021419

这种方式需要指定用户有哪些权限,如:张三有查询工资的权限,即在用户权限中间表中添加一条数据,分别记录张三和查询工资权限ID。但在系统中权限数量可能非常庞大,如果一条一条添加维护数据较为繁琐。所以我们通常的做法是再加一张角色表:

image-20220329105509797

用户角色,角色权限都是多对多关系,即一个用户拥有多个角色,一个角色属于多个用户;一个角色拥有多个权限,一个权限属于多个角色。这种方式需要指定用户有哪些角色,而角色又有哪些权限。

如:张三拥有总经理的角色,而总经理拥有查询工资、查询报表的权限,这样张三就拥有了查询工资、查询报表的权限。这样管理用户时只需管理少量角色,而管理角色时也只需要管理少量权限即可。(所以我用的五张表分别为users,users_role,role,role_permission,permission)

三、编写权限控制方法

(1)mapper接口


public interface UsersMapper extends BaseMapper<users> {//根据用户名查询权限List<permission> findPermissionByUsername(String username);
}

(2)映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.gq.security.mapper.UsersMapper"><select id="findPermissionByUsername" parameterType="string" resultType="com.gq.security.pojo.permission">SELECT DISTINCT permission.pid,permission.permissionName,permission.url FROMusersLEFT JOIN users_role on users.uid = users_role.uidLEFT JOIN role on users_role.rid = role.ridLEFT JOIN role_permission on role.rid = role_permission.ridLEFT JOIN permission on role_permission.pid = permission.pid</select>
</mapper>

(3)修改认证逻辑

public class MyUserDetailsService implements UserDetailsService {@Autowiredprivate UsersMapper usersMapper;// 自定义认证逻辑@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 1.构造查询条件QueryWrapper<users> wrapper = new QueryWrapper<users>().eq("username", username);// 2.查询用户users users = usersMapper.selectOne(wrapper);if(users==null){return null;}//查询用户权限List<permission> permissions=usersMapper.findPermissionByUsername(username);//将自定义权限集合转为Security的权限类型集合List<GrantedAuthority> grantedAuthorities=new ArrayList<>();for(permission permission:permissions){grantedAuthorities.add(new SimpleGrantedAuthority(permission.getUrl()));}// 3.封装为UserDetails对象UserDetails userDetails = User.withUsername(users.getUsername()).password(users.getPassword()).authorities(grantedAuthorities).build();// 4.返回封装好的UserDetails对象return userDetails;}
}

四、配置类访问资源

// 权限拦截配置
http.authorizeRequests().antMatchers("/login.html").permitAll() // 表示任何权限都可以访问.antMatchers("/reportform/find").hasAnyAuthority("/reportform/find") // 给资源配置需要的权限.antMatchers("/salary/find").hasAnyAuthority("/salary/find").antMatchers("/staff/find").hasAnyAuthority("/staff/find").anyRequest().authenticated(); //表示任何请求都需要认证后才能访问

五、自定义访问控制逻辑

(1)自定义

@Service
public class MyAuthorizationService {// 自定义访问控制逻辑,返回值为是否可以访问资源public boolean hasPermission(HttpServletRequest request, Authentication authentication){// 获取会话中的登录用户Object principal = authentication.getPrincipal();if (principal instanceof UserDetails){// 获取登录用户的权限Collection<? extends GrantedAuthority> authorities = ((UserDetails) principal).getAuthorities();// 获取请求的URL路径String uri = request.getRequestURI();// 将URL路径封装为权限对象SimpleGrantedAuthority authority = new SimpleGrantedAuthority(uri);// 判断用户的权限集合是否包含请求的URL权限对象return authorities.contains(authority);}return false;}
}

(2)配置类

  // 权限拦截配置http.authorizeRequests().antMatchers("/login.html").permitAll() // 表示任何权限都可以访问// 任何请求都使用自定义访问控制逻辑.anyRequest().access("@myAuthorizationService.hasPermission(request,authentication)");

六、注解设置访问控制

SpringSecurity中提供了一些访问控制的注解,但是这些注解默认是不可用的,想要使用必须在启动类中开启。

(1)@Secured

该注解是基于角色的权限控制,要求UserDetails中的权限名必须是以ROLE_开头的

 (1)在配置了中开启注解使用

@SpringBootApplication
@MapperScan("com.gq.security.mapper")
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityApplication {public static void main(String[] args) {SpringApplication.run(SecurityApplication.class, args);}}

(2)在控制器方法上添加注解

@RestController
public class controller1 {@Secured("ROLE_report")@GetMapping("/report")public String t1(){}
}

(2)@PreAuthorize

(1)在启动类中开启注解使用


@SpringBootApplication
@MapperScan("com.gq.security.mapper")
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityApplication {public static void main(String[] args) {SpringApplication.run(SecurityApplication.class, args);}}

(2)在控制器方法上添加注解


@RestController
public class controller1 {@PreAuthorize("hasAnyAuthority('/report')")@GetMapping("/report")public String t1(){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeakCanary 源码详解(3)

上一篇&#xff1a;LeakCanary源码详解&#xff08;2&#xff09; 如果你是直接刷到这篇的&#xff0c;建议还是从1开始看&#xff0c;然后2&#xff0c;然后是这篇3&#xff0c;如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣&#xff0c;可以试试直接读这篇&#xff…

23种设计模式

目录 一、设计模式学前导读 1、代码质量好坏如何评价 ? 2、编程方法论 二、设计模式概述 设计模式的产生 UML图 三、六大设计原则 1、单一职责原则&#xff08;Single Responsibitity Principle&#xff09; 2、开放封闭原则&#xff08;Open Close Principle&#x…

利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…

win10系统 C++环境 安装编译GRPC

第一步 下载源码、更新、cmake编译&#xff1a; 为了依赖的成功安装&#xff0c;采用gitee进行下载与更新。记得需要安装git软件。 安装命令&#xff1a; 在自己指定的目录下&#xff0c;鼠标右键&#xff0c;选择 git Bash Here 打开命令行 git clone -b v1.34.0 https://gi…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

Flutter实现PS钢笔工具,实现高精度抠图的效果。

演示&#xff1a; 代码&#xff1a; import dart:ui;import package:flutter/material.dart hide Image; import package:flutter/services.dart; import package:flutter_screenutil/flutter_screenutil.dart; import package:kq_flutter_widgets/widgets/animate/stack.dart…

【Vue】快速入门和生命周期

目录 前言 一、vue的介绍 1. Vue.js是什么&#xff1f; 2. 库和框架的区别 3.基本概念和用法&#xff1a; 二、MVVM的介绍 1. 什么是MVVM&#xff1f; 2. MVVM的组成部分 3. MVVM的工作流程 4. MVVM的优势 5. MVVM的应用场景 三、vue实例 1.模板语法&#xff1a; …

智慧公厕是提升公共厕所管理服务能力的创新举措

在城市化进程加速的今天&#xff0c;公共厕所的管理问题成为让人头疼的难题。随着智慧科技的发展&#xff0c;智慧公厕应运而生&#xff0c;为提升公共厕所综合管理服务能力提供了新思路和解决方案。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量精品案例项目…

卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-4

目录 前言数学理论推导1. 直观理解与二维实例2. EKF3. 补充知识-线性化结语参考 前言 最近项目需求涉及到目标跟踪部分&#xff0c;准备从 DeepSORT 多目标跟踪算法入手。DeepSORT 中涉及的内容有点多&#xff0c;以前也就对其进行了简单的了解&#xff0c;但是真正去做发现总是…

搞定ESD(一):静电放电测试标准解析

文章目录 一、基本术语与定义1.1 基本定义1.2 重要基本术语 二、静电放电发生器介绍2.1 静电放电发生器的特性&#xff1a;通用规范【GB/T17626.2-2018 标准】2.2 ESD 放电发生器电极规格要求&#xff1a;通用规范【GB/T17626.2-2018 标准】2.3 放电回路电缆的要求&#xff1a;…

黑马JVM总结(十四)

&#xff08;1&#xff09;分代回收_1 Java虚拟机都是结合前面几种算法&#xff0c;让他们协同工作&#xff0c;具体实现是虚拟机里面一个叫做分代的垃圾回收机制&#xff0c;把我们堆内存大的区域划分为两块新生代、老年代 新生代有划分为伊甸园、幸存区Form、幸存区To 为什…

进程同步与互斥

目录 进程同步与互斥&#xff08;1&#xff09; 第一节、进程间相互作用 一、相关进程和无关进程 二、与时间有关的错误 第二节、进程同步与互斥 一、进程的同步 二、进程的互斥 三、临界区 进程同步与互斥&#xff08;2&#xff09; 三、信号量与P、V操作的物理含义…

防泄密软件推荐(数据防泄漏软件好用榜前五名)

在当今的数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。企业需要依赖数据来驱动业务决策、提高运营效率和创新产品。然而&#xff0c;随着数据量的不断增长&#xff0c;数据安全问题也日益凸显。企业需要采取有效的措施来保护敏感数据&#xff0c;防止信息泄露给竞…

算法通关村第16关【青铜】| 滑动窗口思想

1. 滑动窗口的基本思想 一句话概括就是两个快慢指针维护的一个会移动的区间 固定大小窗口&#xff1a;求哪个窗口元素最大、最小、平均值、和最大、和最小 可变大小窗口&#xff1a;求一个序列里最大、最小窗口是什么 2. 两个入门题 &#xff08;1&#xff09;子数组最大平…

使用FastChat部署Baichuan2

1. 引言 近来&#xff0c;大型语言模型的市场需求呈现出蓬勃发展的态势。然而&#xff0c;仅仅掌握模型的数据准备和训练是不够的&#xff0c;模型的部署方法也变得至关重要。在这篇文章中&#xff0c;我们将以Baichuan2为例&#xff0c;利用FastChat进行模型部署的实战操作。…

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着 Android 应用程序和游戏变得越来越丰富&#xff0c;其中有些甚至比 PC 上的软件更易于使用和娱乐&#xff0c;因此许多人希望能够在云上运行 Android 游戏或应用程序&#xff0c;而在 EC2 实例上运行 Android 的解决方案可以让开发人员更轻松地测试和运行 Android 应用程序…

MySQL 笔试——多表连接查询

一、&#xff08;左、右和全&#xff09;连接概念 内连接&#xff1a; 假设A和B表进行连接&#xff0c;使用内连接的话&#xff0c;凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分&#xff0c;两张表是平等的。 关键字&#xff1a;inner join on 语句&#xf…

Spring之依赖注入源码解析

基于Autowired的依赖注入底层原理 基于Resource注解底层工作流程图&#xff1a; 1 Spring中到底有几种依赖注入的方式&#xff1f; 首先分两种&#xff1a; 手动注入 自动注入 1.1 手动注入 在XML中定义Bean时&#xff0c;就是手动注入&#xff0c;因为是程序员手动给某…

MySQL高级语句 Part2(视图表 +存储过程+条件语句+循环语句)

这里写目录标题 一、视图表 create view1.1 视图表概述1.2 视图表能否修改&#xff1f;&#xff08;面试题&#xff09;1.3 基本语法1.3.1 创建1.3.2 查看1.3.3 删除 1.4 通过视图表求无交集值 二、case语句三、空值(null) 和 无值( ) 的区别四、正则表达式4.1 基本语法和匹配模…

css,环形

思路&#xff1a; 1.先利用conic-gradient属性画一个圆&#xff0c;然后再叠加 效果图 <template><div class"ring"><div class"content"><slot></slot></div></div> </template> <script> import …