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

news/2024/9/23 3:18:53/

目录

一、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.ppmy.cn/news/1445698.html

相关文章

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

移动应用安全

移动应用安全 移动应用安全主要关注Android、iOS、Windows Phone等平台上移动应用软件安全状态。它涉及应用程序在其设计运行的平台上下文中的安全问题、它们使用的框架以及预期的用户集。所有主流的移动平台都提供大量可选的安全控制&#xff0c;旨在帮助软件开发人员构建安全…

GIT入门到实战

文章目录 版本控制常见的版本控制工具版本控制分类Git与SVN的主要区别 Git基本理论&#xff08;重要&#xff09;三个区域工作流程 GIT文件操作文件的四种状态查看文件状态忽略文件 GIT 常见问题 版本控制 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程…

Spring - 3 ( 12000 字 Spring 入门级教程 )

一&#xff1a;Spring Web MVC入门 1.1 响应 在我们前⾯的代码例子中&#xff0c;都已经设置了响应数据, Http 响应结果可以是数据, 也可以是静态页面&#xff0c;也可以针对响应设置状态码, Header 信息等. 1.2 返回静态页面 创建前端页面 index.html(注意路径) html代码 …

蓝桥杯国赛算法复习

复习内容 1.spfa 2.背包问题 3.动态规划其他常考问题 4.dfs 5.bfs 6.并查集 一、基础题回顾 1.spfa 问题描述 蒜头君准备去参加骑车比赛&#xff0c;比赛在 n 个城市间进行&#xff0c;编号从 1 到 n。选手们都从城市 1 出发&#xff0c;终点在城市 n。 已知城市间有 m 条道…

docker打包容器为镜像

要使用Docker将容器打包成镜像&#xff0c;你需要执行以下步骤&#xff1a; 创建一个Dockerfile&#xff0c;定义如何构建你的镜像。 使用docker build命令来创建镜像。 以下是一个简单的示例&#xff1a; 首先&#xff0c;创建一个名为Dockerfile的文件&#xff0c;内容如…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲&#xff1a;docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

nginx负载均衡策略

1、轮询&#xff08;Round Robin&#xff09;-默认 依次转发&#xff0c;适用于多台服务器性能相近 2、加权轮询&#xff08;Weighted Round Robin&#xff09; weight高的优先分配&#xff0c;适用于多台服务器性能相差较大 3、IP hash 基于客户端 IP 地址的负载均衡策略&a…