系列七、Spring Security中基于Jdbc的用户认证 授权

一、Spring Security中基于Jdbc的用户认证 & 授权

1.1、概述

        前面的系列文章介绍了基于内存定义用户的方式,其实Spring Security中还提供了基于Jdbc的用户认证 & 授权,再说基于Jdbc的用户认证 & 授权之前,不得不说一下Spring Security中一个非常重要的类UserDetailService,关于UserDetailService,请参考【系列二、Spring Security中的核心类】,这里不再赘述。

1.2、JdbcUserDetailsManager

        JdbcUserDetailsManager实现了UserDetailsManager接口,UserDetailsManager继承于UserDetailsService接口,继承结构如下:

通过这个类可以使用Spring Security内置的Jdbc操作数据库。

1.2.1、sql脚本的位置 

org/springframework/security/core/userdetails/jdbc/users.ddl

1.2.2、我整理好的 

DROP TABLE IF EXISTS `users`;
create table users(username varchar(50) not null primary key COMMENT '用户名',password varchar(100) not null COMMENT '密码',enabled int not null COMMENT '账户是否启用(1:启用、0:禁用)'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;DROP TABLE IF EXISTS `authorities`;
create table authorities (username varchar(50) not null COMMENT '用户名',authority varchar(50) not null COMMENT '权限',constraint fk_authorities_users foreign key(username) references users(username)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限表' ROW_FORMAT = DYNAMIC;create unique index ix_auth_username on authorities (username,authority);

1.3、资源类

/*** @Author : 一叶浮萍归大海* @Date: 2024/1/11 20:58* @Description: 测试资源*/
@RestController
public class HelloController7004 {/*** 任何人都可以访问* @return*/@GetMapping("/helloWorld")public R helloWorld() {return R.ok().data("Hello World");}/*** 登录后才能访问* @return*/@GetMapping("/sayHi")public R sayHi() {return R.ok().data("嗨!");}/*** 需要具有dba角色的人才能访问* @return*/@GetMapping("/dba/helloWorld")public R dba() {return R.ok().data("dba Hello World");}/*** 需要具有admin角色的人才能访问* @return*/@GetMapping("/admin/helloWorld")public R admin() {return R.ok().data("admin Hello World");}}

1.4、配置类

/*** @Author : 一叶浮萍归大海* @Date: 2024/1/11 21:50* @Description: Spring Security配置类*/
@Configuration
public class MyWebSecurityConfigurerAdapter7004 extends WebSecurityConfigurerAdapter {@Resourceprivate MyAuthenticationSuccessHandler7004 successHandler;@Resourceprivate MyAuthenticationFailureHandler7004 failureHandler;@Resourceprivate MyLogoutSuccessHandler7004 logoutSuccessHandler;@Resourceprivate MyAuthenticationEntryPoint7004 authenticationEntryPoint;@Resourceprivate MyAccessDeniedHandler7004 accessDeniedHandler;@Resourceprivate DataSource dataSource;/*** 密码加密器* @return*/@BeanPasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}/*** 根据UserDetailsService定义基于Jdbc的用户* 调用 userExists 方法判断用户是否存在,如果不存在,就创建一个新的用户出来(因为每次项目启动时这段代码都会执行,所以加一个判断,避免重复创建用户)* @return*/@Beanprotected UserDetailsService userDetailsService() {JdbcUserDetailsManager manager = new JdbcUserDetailsManager();manager.setDataSource(dataSource);if (!manager.userExists("admin")) {manager.createUser(User.withUsername("admin").password("123456").roles("admin").build());}if (!manager.userExists("dba")) {manager.createUser(User.withUsername("dba").password("123456").roles("dba").build());}return manager;}/*** 角色继承* @return*/@Beanprotected RoleHierarchy roleHierarchy() {RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();roleHierarchy.setHierarchy("ROLE_admin > ROLE_dba");return roleHierarchy;}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/dba/**").hasRole("dba").antMatchers("/admin/**").hasRole("admin").antMatchers("/helloWorld").permitAll().anyRequest().authenticated().and()/*** 登录成功 & 登录失败回调*/.formLogin().loginPage("/login").successHandler(successHandler).failureHandler(failureHandler).and()/*** 注销登录回调*/.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler).permitAll().and().csrf().disable()/*** 未认证 & 权限不足回调*/.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler);}}

1.5、启动服务会往表中插入数据,如下

1.6、测试

        测试流程同【系列六、Spring Security中的认证 & 授权 & 角色继承​​​​​​​】,这里不再赘述。

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

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

相关文章

DM数据库安装注意事项

数据库安装注意事项 一、安装前 一些参数需要在数据库创建实例前找用户确认。 参数名参数掩码参数值备注数据页大小PAGE_SIZE32数据文件使用的页大小(缺省使用8K,建议默认:32),可以为 4K、8K、16K 或 32K 之一,选择的页大小越大…

1.5矩阵元素的引用

通过下标来引用矩阵的元素 A(3, 2)表示A矩阵第3行第2列的元素。 >> arr [1,2,3;4,5,6]; >> arr(4, 5) 10arr 1 2 3 0 04 5 6 0 00 0 0 0 00 0 0 0 10>> 如果引用元素超过矩阵的大小将自…

React项目实战--------极客园项目PC端

项目介绍:主要将学习到的项目内容进行总结(有需要项目源码的可以私信我) 关于我的项目的配置如下,请注意下载的每个版本不一样,写的api也不一样 一、项目介绍 1.资料 1)短信接收&M端演示&#xff1a…

SpringFramework实战指南(二)

SpringFramework实战指南(二) 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 2.1 Spring 和 SpringFramework概念 Spring-ioc 广义的 Spring:Spring 技术栈(全家桶&#xff0…

学会编写自定义configure脚本,轻松实现定制化配置

学会编写自定义configure脚本,轻松实现定制化配置 一、configure脚本的作用和重要性二、configure脚本的基本结构和语法三、编写自定义configure脚本的步骤四、示例五、常见的问题总结 一、configure脚本的作用和重要性 configure脚本是用于自动配置软件源代码的脚…

周赛379(排序、分类讨论、记忆化搜索(动态规划))

文章目录 周赛379[3000. 对角线最长的矩形的面积](https://leetcode.cn/problems/maximum-area-of-longest-diagonal-rectangle/)排序 [3001. 捕获黑皇后需要的最少移动次数](https://leetcode.cn/problems/minimum-moves-to-capture-the-queen/)分类讨论 [3002. 移除后集合的最…

监控平台zabbix介绍与部署

1. 完整的项目 业务架构:客户端 -> 防火墙 -> 负载均衡(四层、七层)-> Web缓存/应用 -> 业务逻辑(动态应用)-> 数据缓存 -> 数据持久 运维架构:运维客户端 -> 堡垒机/跳板机&#x…

Docker详解

文章目录 Docker1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker架构1.2.1.镜像和容器1.2.2.DockerHub1.2.3.Docker架构1.2.4.小结 1.3CentOS安装Docker1.3.1.卸载(可选&…

【Python机器学习】SVM——预处理数据

为了解决特征特征数量级差异过大,导致的模型过拟合问题,有一种方法就是对每个特征进行缩放,使其大致处于同一范围。核SVM常用的缩放方法是将所有的特征缩放到0和1之间。 “人工”处理方法: import matplotlib.pyplot as plt from…

【Linux】线程池实现

📗线程池实现(单例模式) 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节🔸类成员函数参数列表中隐含的this指针🔸单例模式🔸一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…

【Vue3】2-11 : 生命周期钩子函数及原理分析

本书目录:点击进入 一、组件生命周期概述 1.1 官方生命周期 1.2 钩子函数(回调函数) ▶ 生命周期可划分为三个部分(- >表示执行循序): 二、实战:测试生命周期流程 > 代码 > 效果 一…

4_【Linux版】重装数据库问题处理记录

1、卸载已安装的oracle数据库。 2、知识点补充: 3、调整/dev/shm/的大小 【linux下修改/dev/shm tmpfs文件系统大小 - saratearing - 博客园 (cnblogs.com)】 mount -o remount,size100g /dev/shm 4、重装oracle后没有orainstRoot.sh 【重装oracle后没有orains…

余弦相似度的计算以及公式

公式: 思想:余弦相似度的思想是通过计算两个向量之间的余弦值来衡量它们的相似程度。如果两个向量之间的夹角越小,它们的余弦值就越接近1,也就意味着它们越相似。而如果它们的夹角越大,余弦值就越接近0,也就…

高级分布式系统-第9讲 实时调度--静态调度与动态调度

静态调度 在静态调度中,任务组的调度表是通过离线计算得出的。在调度表的生成过程中,必须把所有任务的资源、优先级和同步要求考虑进去,并且确保所有的截止时间要求。这个调度表指明了各个任务的运行起始时间 ,一旦生成就不再变化…

UE5 C++(十三)— 创建Character,添加增强输入

文章目录 创建Character第三人称模板添加增强输入引用在脚本中实现移动、旋转 创建Character第三人称模板 创建MyCharacter C类 添加增强输入引用 在DEMO.Build.cs 脚本中添加增强输入模块 有个容易出错的点,这里的设置一定要正确 然后添加引用到C头文件中 …

Python读取log文件报错“UnicodeDecodeError”

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 问题描述: 写了一个读取log文件的Python脚本: # -*- coding:utf-8 -*- import os import numpy as np …

Java基本数据类型boolean占用几个字节?

我们知道Java中的基本数据类型有以下几种 char占用2个字节 boolean占用1个字节或者4个字节(稍后解释) byte占用1个字节 short占用2个字节 int占用4个字节 long占用8个字节 float占用4个字节 double占用8个字节 char a a; boolean b false; int c 1; ......当我们在对这些基…

vue2配置教程

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目,运行项目

虚拟机配置网络

1开启网络 右击打开属性配置ipv4 配置vm 配置系统 配置liunx网卡信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开电脑任务管理器

5、C语言:结构

结构 结构的基本知识结构与函数传递结构 结构数组、指向结构的指针自引用结构(二叉树)表查找类型定义(typedef)联合位字段 结构也是一种数据类型。类似于int、char、double、float等。 结构是一个或多个变量的集合,这些…