spring-security--基础--4.4--案例:资源权限访问

2023-10-29

spring-security–基础–4.4–案例:资源权限访问


代码位置

https://gitee.com/DanShenGuiZu/learnDemo/tree/master/spring-security-learn

1、授权

1.1、调用accessDecisionManager进行授权决策

在这里插入图片描述

1.2、方式

  1. web授权

    1. 通过url拦截进行授权
    2. 拦截器为FilterSecurityInterceptor
  2. 方法授权

    1. 通过方法拦截进行授权
    2. 拦截器为MethodSecurityInterceptor
  3. 同时通过web授权和方法授权

    1. 先执行web授权,再执行方法授权,最后决策通过则允许访问资源,否则将禁止访问

2、查询数据库用户权限完成授权

2.1、代码结构

在这里插入图片描述

2.2、数据库

SET FOREIGN_KEY_CHECKS=0;


DROP TABLE IF EXISTS user;
CREATE TABLE user(
  id bigint(12)NOT NULL AUTO_INCREMENT COMMENT '主键id',
  user_name varchar(250)DEFAULT NULL COMMENT '名称',
  password varchar(250)DEFAULT NULL COMMENT '密码',
  PRIMARY KEY(id)
)ENGINE=InnoDB AUTO_INCREMENT=512794071417499657 DEFAULT CHARSET=utf8 COMMENT='文章表';

INSERT INTO user VALUES('1', 'user', '$2a$10$82imG0H/aJzplJsDlOsjheLRN60AGS.hH7E4kNRB/cQmgbbvD6ig6');
INSERT INTO user VALUES('6', 'admin', '$2a$10$R3sj4vOOa11CApJmGwTm7u5AhGFUToRYL3jhhW1hkmLqPts43hdhS');




DROP TABLE IF EXISTS user_authorize;
CREATE TABLE user_authorize(
  id bigint(12)NOT NULL AUTO_INCREMENT COMMENT '主键id',
  user_id bigint(250)DEFAULT NULL COMMENT '用户id',
  authorize_code varchar(250)DEFAULT NULL COMMENT '权限吗',
  PRIMARY KEY(id)
)ENGINE=InnoDB AUTO_INCREMENT=512794071417499659 DEFAULT CHARSET=utf8 COMMENT='用户权限表';

INSERT INTO user_authorize VALUES('1', '1', 'p2');
INSERT INTO user_authorize VALUES('2', '6', 'p1');

2.3、核心代码

在这里插入图片描述

UserAuthorizeBean

@Data
public class UserAuthorizeBean {
	private Long id;
	private Long userId;
	private String authorizeCode;

}

UserDao


@Repository
public class UserDao {
	@Autowired
	JdbcTemplate jdbcTemplate;

	// 根据账号查询用户信息
	public UserBean getUserByUsername(String username){
		String sql = "select * from user where user_name = ?";
		// 连接数据库查询用户
		List<UserBean> list = jdbcTemplate.query(sql, new Object[] { username },
				new BeanPropertyRowMapper<>(UserBean.class));
		if(list != null && list.size()== 1){
			return list.get(0);
		}
		return null;
	}

	// 根据用户id查询用户权限
	public List<String> getAuthorize(Long userId){
		String sql = "SELECT * FROM user_authorize WHERE user_id =?";
		List<UserAuthorizeBean> list = jdbcTemplate.query(sql, new Object[] { userId },
				new BeanPropertyRowMapper<>(UserAuthorizeBean.class));
		List<String> authorizes = new ArrayList<>();
		list.forEach(c -> authorizes.add(c.getAuthorizeCode()));
		return authorizes;
	}

}

SpringDataUserDetailsService

@Service
public class SpringDataUserDetailsService implements UserDetailsService {

	@Autowired
	UserDao userDao;

	// 根据账号查询用户信息,
	// 通过@Service将SpringDataUserDetailsService注入容器,通过UserDetailsService接口表明该类的类型是UserDetailsService
	@Override
	public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {

		// 将来连接数据库根据账号查询用户信息
		UserBean bean = userDao.getUserByUsername(username);
		if(bean == null){
			// 如果用户查不到,返回null,由provider来抛出异常
			return null;
		}

		//查询当前数据库的用户资源权限
		List<String> authorize = userDao.getAuthorize(bean.getId());
		String[] authorizeArr = new String[authorize.size()];
		authorize.toArray(authorizeArr);

		//添加权限
		UserDetails userDetails = User.withUsername(bean.getUserName()).password(bean.getPassword())
				.authorities(authorizeArr).build();
		return userDetails;
	}
}

3、web授权

  1. 就是对WebSecurityConfigurerAdapter的configure方法进行配置
  2. 是对url的拦截

在这里插入图片描述

4、方法授权

  1. @PreAuthorize:方法调用前进行权限检查
  2. @PostAuthorize:方法调用后进行权限检查
  3. @Secured:权限控制
  4. @EnableGlobalMethodSecurity:启用基于注解的安全性。

4.1、案例

4.1.1、代码结构

在这里插入图片描述

4.1.2、核心注解

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-security--基础--4.4--案例:资源权限访问 的相关文章

随机推荐

  • es6中let var const 的特点及区别

    首先 var是定义一个变量常用的方法 与其相似的还有let和const 以下介绍他们三个的特点及不同 一 var var的用法很多 没有什么局限 可以对变量进行声明 例如 注意 var let const 是js的关键词 需要写在scrip
  • CSDN笔记

    拉普拉斯变换的收敛域 ROC 与逆变换 ILT 1 是否可积即是否收敛 如果可收敛 面积 拉氏值即为收敛域 1 收敛的条件 e jwt 积分为振荡函数 2 常系数线性微分方程对应线性时不变系统 其分析步骤有三 3 拉氏逆变换 ILT 的方法
  • Linux僵尸进程怎么处理,Linux 僵尸进程如何处理

    Linux 允许进程查询内核以获得其父进程的 PID 或者其任何子进程的执行状态 例如 进程可以创建一个子进程来执行特定的任务 然后调用诸如 wait 这样的一些库函数检查子进程是否终止 如果子进程已经终止 那么 它的终止代号将告诉父进程这
  • js求时间差

    js求时间差 var date1 new Date 开始时间 alert aa var date2 new Date 结束时间 var date3 date2 getTime date1 getTime 时间差的毫秒数 计算出相差天数 va
  • 基于SpringBoot的购票系统的设计与实现

    博主介绍 在职Java研发工程师 专注于程序设计 源码分享 技术交流 专注于Java技术领域和毕业设计 温馨提示 文末有 CSDN 平台官方提供的老师 Wechat QQ 名片 项目名称 基于SpringBoot的购票系统的设计与实现 演示
  • 十五分钟带你学会 Electron

    文章目录 什么是 Electron 为什么要选择 Electron 安装 Electron 桌面CSDN实战 Electron 基础配置 Electron 进程 主进程 渲染进程 主进程与渲染进程的区别 主进程与渲染进程的通信 Electr
  • 孔乙己:new的五种写法

    孔乙己 new的五种写法 这个是目标类 INT 拥有一个字面常量构造函数 和一个平凡析构函数 可以从int构造 也可以隐式转换为int 也可以和int比较大小 class INT private int value public const
  • 【CNC——第6篇】PMAC上位机编程基础篇(上位机和下位机如何通信)

    拓展链接 PAMC官网 DELTA TAU 官网手册 手册大全 PMAC官网 PCOMM32PRO用户手册 PMAC 的内部变量 内部变量分为四种 I 变量为电机等常用基本控制变量 P 变量为全局用户常量 Q 变量为坐标系变量 M 变量为地
  • 华为OD机试 C++ 打卡统计

    题目 任务 你的工作是帮我们找出打卡次数最多的前五名员工 有些小细节需要注意 如果两位员工打卡次数一样多 那么先打卡的员工排名更靠前 如果他们开始打卡的时间也一样 那就按照员工id的大小排序 id小的员工排在前面 输入 第一行是员工的数量N
  • osgFBO(十)多pass-3,pass3,shader将背景从绿色变为蓝色

    pass3和pass2类似 只是再熟悉下 这个Pass设定为最后一步 可以不再输出纹理 即 1 pass3摄像机输入tex2 osg ref ptr
  • matplotlib之饼状图

    import matplotlib pyplot as plt labels A B C D fracs 35 20 45 10 plt pie x fracs labels labels plt show 圆形饼图 import matp
  • 数据结构顺序表与链表(查找,插入,删除)

    目录 顺序表 链表 顺序表 顺序表是在计算机内存中以数组的形式保存的线性表 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中 即通过数据元素物理存储的相
  • JVM调优实战

    1 当项目运行一段时间以后 产生了OOM的问题 我们该如何排查问题呢 用top命令 看看是哪个进程CPU占用率高 获取它的进程ID 再根据具体的进程id 执行 top HP 进程id号 命令 看看哪个线程的CPU占用率高 如果是业务线程出现
  • WIN7打开方式列表无法添加某个程序

    win7打开方式不能添加程序 你问我答网 原因 程序移动了位置 解决 开始 运行 regedit 在 HKEY CLASSES ROOT Applications 中找到无法添加的程序 例如 ColorStorm exe 看一下它的 she
  • STM32CubeMX之RTC电子钟

    STM32CubeMX之RTC电子钟 1 简介 实时时钟是一个独立的定时器 RTC模块拥有一组连续计数的计数器 在相应软件配置下 可提供时钟日历的功能 修改计数器的值可以重新设置系统当前的时间和日期 2 特性 可编程的预分频系数 分频系数最
  • 《消息队列高手课》如何实现高性能的异步网络传输?

    我们开发的绝大多数业务系统 它都是 IO 密集型系统 跟 IO 密集型系统相对的另一种系统叫计算密集型系统 通过这两种系统的名字 估计你也能大概猜出来 IO 密集型系统是什么意思 IO 密集型系统大部分时间都在执行 IO 操作 这个 IO
  • mysql 查找表中某个字段相同的数据_怎么查看数据库表中某个字段的值有哪些重复记录...

    展开全部 下面以 sqlserver数据库为例进行说明 select from TableA where b in select b from TableA group by b having count b gt 1 这样就列举出了b字段
  • Kryo 使用指南

    1 Kryo 的简介 Kryo 是一个快速序列化 反序列化工具 其使用了字节码生成机制 底层依赖了 ASM 库 因此具有比较好的运行速度 Kryo 序列化出来的结果 是其自定义的 独有的一种格式 不再是 JSON 或者其他现有的通用格式 而
  • 【OSG】OSG环境部署 OSG3.6.5+vs2017+win10_x64(超详细)

    最近开始了OSG的学习 开始搭建OSG开发环境 期间遇到了很多问题 也查阅了很多资料 最终搭建成功 OSG本来就是开源的 不应该敝帚自珍 应该多交流多分享 所以在此记录一下环境搭建的过程 方便以后查阅和交流 1 下载文件 1 1 OSG源码
  • spring-security--基础--4.4--案例:资源权限访问

    spring security 基础 4 4 案例 资源权限访问 代码位置 https gitee com DanShenGuiZu learnDemo tree master spring security learn 1 授权 1 1