SpringSecurity授权流程(自己做笔记用的)

目录

一、RABC表的设计

二、查询权限并添加Security中

三、通过注解进行授权

四、授权进行前端访问


一、RABC表的设计

基本概念就是五个表:

用户表:users

角色表:role

权限表:permission

还需要两种关系表,才能通过users知道他的权限

用户_角色表

角色_权限表

用户对应角色,角色对应着权限

二、查询权限并添加Security中

基本的创建mapper,自定义方法(通过用户名来查询权限)

<?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.springsecuritydemo1.mapper.UsersMapper"><select id="findByUsername" resultType="com.gq.springsecuritydemo1.pojo.users" parameterType="string">select * from users where username=#{username}</select><select id="FindPermissionByUsername" parameterType="string" resultType="com.gq.springsecuritydemo1.pojo.permission">select distinct permission.pid,permission.permission,permission.url from users left joinusers_role on users.uid=users_role.uid left joinrole on users_role.rid=role.rid left joinrole_permission on role.rid=role_permission.rid left joinpermission on permission.pid=role_permission.pidwhere username=#{username}</select>
</mapper>

查询到权限后,接着在UserDetails中将自定义的权限集合转换为Security中的权限集合

//自定义认证服务
@Service
public class MyUserDetailsService implements UserDetailsService {@Autowiredprivate UsersMapper usersMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {users s=usersMapper.findByUsername(username);//查询用户的权限if(s==null){return null;}List<permission> permissionList=usersMapper.FindPermissionByUsername(username);//将自定义的权限集合转换为Security的权限类型集合List<GrantedAuthority> grantedAuthorities=new ArrayList<>();//开始遍历添加权限for(permission permission:permissionList){grantedAuthorities.add(new SimpleGrantedAuthority(permission.getUrl()));}//封装为UserDetailsService对象UserDetails userDetailsService= User.withUsername(s.getUsername()).password(s.getPassword()).authorities(grantedAuthorities).build();return userDetailsService;}
}

这里的权限你可以写url路径来进行认证,也可以自己随便写点别的,反正作为标识即可。

三、通过注解进行授权

在控制器中使用注解来进行鉴权前,我们需要再启动类中添加注解

@EnableMethodSecurity

接着通过@PreAuthorize注解进行鉴权

 //测试权限的方法@PreAuthorize("hasAnyAuthority('/search')")@RequestMapping("/search")public String s1(){return "查询权限";}@PreAuthorize("hasAnyAuthority('/update')")@RequestMapping("/update")public String u1(){return "修改权限";}

四、授权进行前端访问

在进行前端访问前,我们还需要引入thymeleaf和security的整合包,这里我直接把大致需要的所有依赖都写了(毕竟有时候版本出现问题是真烦)

<dependencies>
<!--        thymeleaf和security的整合包--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency>
<!--        springboot起步--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version><scope>runtime</scope></dependency>
<!--        lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
<!--        junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>
<!--        mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.0</version></dependency>
<!--        thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<!--        springsecurity--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

在thymeleaf中前端鉴权时,别忘了写约束

<!DOCTYPE html>
<!-- 约束-->
<html lang="en" xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3 sec:authorize="hasAnyAuthority('/search')">查询</h3>
<h3 sec:authorize="hasAnyAuthority('/update')">修改</h3>
<h3 sec:authorize="hasAnyAuthority('/delete')">删除</h3>
<h3 sec:authorize="hasAnyAuthority('/insert')">添加</h3>
</body>
</html>

 

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

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

相关文章

LDA主题模型

在文本挖掘领域&#xff0c;大量的数据都是非结构化的&#xff0c;很难从信息中直接获取相关和期望的信息&#xff0c;一种文本挖掘的方法&#xff1a;主题模型&#xff08;Topic Model&#xff09;能够识别在文档里的主题&#xff0c;并且挖掘语料里隐藏信息&#xff0c;并且在…

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

Java基础知识(一)

1. Java语言跨平台原理 1.1 Java语言的特点 完全面向对象&#xff1a; Java语言支持封装、继承、多态&#xff0c;面向对象编程&#xff0c;让程序更好达到高内聚&#xff0c;低耦合的标准。支持分布式&#xff1a; Java语言支持Internet应用的开发&#xff0c;在基本的Java应…

实现ALV页眉页脚

1、文档介绍 在ALV中&#xff0c;可以通过增加页眉和页脚&#xff0c;丰富ALV的展示。除了基本的页眉和页脚&#xff0c;还可以通过插入HTML代码的方式展示更加丰富的页眉和页脚&#xff0c;本篇文章将介绍ALV和OOALV中页眉页脚的使用。 2、ALV页眉页脚 效果如下 2.1、显示内…

贝叶斯网络(概念、应用、实例)

目录 一、贝叶斯网络基本概念 1.1主要组成 1.2概率模型 1.3应用场景 1.4推理方法 1.5学习 二、贝叶斯网络在机器学习中的应用 三、应用实例 3.1分类 3.2推荐系统 3.3自然语言处理 一、贝叶斯网络基本概念 贝叶斯网络&#xff0c;也称为信念网络或有向无环图模型&am…

JMeter压测

1.创建线程组 2.创建http请求 填写接口基本信息。&#xff08;我这里用的是我自己的一个demo项目&#xff0c;大家也可以换成自己的试一试&#xff09; 填写完毕之后我们点击绿色箭头运行。由于没有配置请求头信息&#xff0c;所以显示认证失败。 3.创建信息头管理器 3.1为什么…

基于激光雷达的作物表型研究论文汇总

文章目录 2018How Universal Is the Relationship between Remotely Sensed Vegetation Indices and Crop Leaf Area Index? A Global Assessment[J] 2021结合移动式激光雷达和 CropQuant-3D 对不同氮素处理小麦的大规模田间表型分析[M] 2023基于地基激光雷达和 RGB 相机对小麦…

MySQL多版本并发控制mvcc原理浅析

文章目录 1.mvcc简介1.1mvcc定义1.2mvcc解决的问题1.3当前读与快照读 2.mvcc原理2.1隐藏字段2.2版本链2.3ReadView2.4读视图生成原则 3.rc和rr隔离级别下mvcc的不同 1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control)&#xff0c;多版本并发控制&#xff0c;是…

买婴儿洗衣机怎么选择?推荐四大表现突出的宝藏婴儿洗衣机

现在还有人把宝宝衣服跟大人的混洗吗&#xff1f;或者把婴儿衣物跟其他衣物混洗吗&#xff1f;赶紧停止吧&#xff01;这样会带来非常严重的细菌交叉的感染&#xff0c;有小孩的家庭&#xff0c;或者说打算生小孩的家庭&#xff0c;一定要入手一台小型婴儿洗衣机&#xff0c;宝…

jmeter之跨线程关联

1&#xff09;_setproperty函数&#xff1a;将值保存成jmeter属性 2&#xff09;_property函数&#xff1a;在其他线程组中使用property函数读取属性 一、跨线程接口引用变量 1. 法一&#xff1a;jmeter自带函数_setProperty和_property 1. 1线程组 01 创建登录的【HTTP请求】…

学python的第二十天

多线程 以下内容来源于《看漫画学Python》这本书&#xff0c;前面十几天好多内容参考过本书内容&#xff0c;写的挺好。 1 线程相关知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立的一块内存空间&#xff0c;一组系统资源。在进程概念中&…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…