Spring Security基础教程:从入门到实战

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。

 推荐订阅精彩专栏 👇🏻 避免错过下次更新

Springboot项目精选实战案例

更多项目:CSDN主页YAML墨韵

学如逆水行舟,不进则退。学习如赶路,不能慢一步。

目录

1. 简介

1.1 身份认证

1.2 授权

2. 实战案例

2.1 依赖管理

2.2 自定义用户

2.3 自定义授权规则

2.4 自定义用户查询

2.5 自定义登录页面


1. 简介

Spring Security 是一个提供身份验证、授权和防护常见攻击的框架。它为确保命令式和反应式应用程序的安全提供一流的支持,是确保基于 Spring 的应用程序安全的事实标准。

1.1 身份认证

身份验证是我们验证试图访问特定资源者身份的方式。验证用户身份的常用方法是要求用户输入用户名和密码。一旦进行了身份验证,我们就知道了用户的身份,并可以执行授权。Spring Security 提供对用户身份验证的内置支持。以下是Spring Security支持的认证机制:

  • 用户名 & 密码

  • OpenID Connect 的 OAuth 2.0 登录和非标准 OAuth 2.0 登录

  • SAML 2.0 登录

  • 中央认证服务器 (CAS)

  • 如何在会话过期后记住用户

  •  JAAS 身份验证

  • OpenID 身份验证(不要与 OpenID Connect 混淆)

  • SiteMinder 或 Java EE 安全性等外部机制进行身份验证

  • X509 认证

我们工作中用的最多的也就是"用户名 & 密码" 与 "OAuth2";所以,本篇文章就以用户名&密码讲解。

1.2 授权

无论你选择以何种方式进行身份验证--是使用 Spring Security 提供的机制和提供商,还是与容器或其他非 Spring Security 身份验证机构集成--你都会发现授权服务可以以一致而简单的方式在你的应用程序中使用。

2. 实战案例

2.1 依赖管理

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

当环境中引入上面的依赖后,默认情况会对所有的请求都进行拦截,同时启动服务时会输出随机密码,而用户则默认是"user"。

2.2 自定义用户

在配置文件中配置用户名密码等信息。

spring:  security:    user:      name: pack      password: 123456

当你在配置文件中做了如上配置后,控制台将不会输出随机生成的密码。

2.3 自定义授权规则

在上面的示例中,默认情况Spring Security对所有的请求进行拦截,有些时候我们希望只对某些请求进行拦截、静态资源自动放行,这时候就需要我们自定义授权规则。在Spring Security中是通过配置SecurityFilterChain Bean对象进行授权规则的配置。

@Bean
public SecurityFilterChain apiSecurity(HttpSecurity httpSecurity) throws Exception {// 关闭csrfhttpSecurity.csrf(csrf -> csrf.disable()) ;// 拦截所有以/api/开头的请求httpSecurity.authorizeHttpRequests().antMatchers("/api/**").authenticated() ;// 放行所有的静态资源(其实,如果你这里就配置了一个/api/**,那么下面的都不用配置,因为只会拦截/api/)httpSecurity.authorizeHttpRequests().antMatchers("*.js", "*.css", "*.html").permitAll() ;// 而这配置,则会通过表单形式进行用户名&密码的登录授权操作。默认提供了简单的登录界面httpSecurity.formLogin(withDefaults()) ;return httpSecurity.build() ;
}

默认登录页

针对不同的请求配置不同的权限(角色)。

// 访问/api/前缀的请求用户必须具备MGR角色
httpSecurity.authorizeHttpRequests().antMatchers("/api/**").hasAnyRole("MGR") ;
// /admin/前缀的请求必须具备SUPER角色
httpSecurity.authorizeHttpRequests().antMatchers("/admin/**").hasAnyRole("SUPER") ;

配置文件中配置角色

spring:security:user:roles:- SUPER

当你不具备对应的角色,你将看到如下错误

2.4 自定义用户查询

在上面的示例中,都是基于配置文件进行用户的配置角色的设置,都是静态的信息,而实际工作中,都是需要从数据库中进行查询的。关于数据库的操作,我这里使用的spring data jpa。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

实体User定义

@Entity
@Table(name = "p_user")
public class User implements UserDetails {private static final long serialVersionUID = 1L ;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id ;private String username ;private String password ;private String email ;private String address ;private Integer age ;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {// 这里为了简单起见,就直接固定了return Arrays.asList(new SimpleGrantedAuthority("ROLE_MGR"),new SimpleGrantedAuthority("ROLE_NORMAL"));}@Overridepublic String getPassword() {return this.password ;}@Overridepublic String getUsername() {return this.username ;}// 下面几个方法你,也应该根据你实际系统用户的状态设置@Overridepublic boolean isAccountNonExpired() {return true ;}@Overridepublic boolean isAccountNonLocked() {return true ;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true ;}// getter, setter
}

Spring Security中如果你需要基于数据库的验证,那么你还需要提供如下的配置Bean

@Bean
UserDetailsService packUserDetailsService(UserRepository userRepository) {return new UserDetailsService() {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username) ;return user ;}} ;
}@Bean
PasswordEncoder packPasswordEncoder() {// 生产环境中你不应该使用该种PasswordEncoder。return NoOpPasswordEncoder.getInstance() ;
}

UserRepository接口

public interface UserRepository extends JpaRepository<User, Long> {// 我这是由于有很多的重复数据,所以。。。@Query(value = "select * from p_user u where u.username = ?1 limit 1", nativeQuery = true)User findByUsername(String username) ;}

通过以上的配置就完成了与数据库的结合登录验证。

2.5 自定义登录页面

默认情况下的,登录页面你肯定不会应用到生产环境中,都会自定义登录页面。在如下目录新增自定义的登录页面

图片

配置

@Bean
SecurityFilterChain apiSecurity(HttpSecurity httpSecurity) throws Exception {// ...httpSecurity.formLogin(login -> login.loginPage("/login.html").loginProcessingUrl("/login")) ;return httpSecurity.build() ;
}

以上是本篇文章的全部内容,如对你有帮助就请作者吃个棒棒糖🍭。

完毕!!!

推荐文章

使用RabbitMQ消息队列和Redis缓存优化Spring Boot秒杀功能

Spring Boot + 支付宝支付:一站式集成指南

​​​​​​​Spring Boot整合Elasticsearch

Spring Boot与RabbitMQ整合:实现高可用消息队列服务

Spring Boot携手OAuth2.0,轻松实现微信扫码登录!

快速上手Spring Boot与Mybatis Plus集成

《布隆过滤器:原理、应用与使用方法深度解析》

《深度解析:Redis缓存穿透、击穿与雪崩的区别及应对策略》

Spring框架九大核心功能全面揭秘(一)

权威解析Spring框架九大核心功能(续篇):专业深度,不容错过

Spring框架九大核心功能全面解读(三):探寻功能之巅

揭秘Spring Boot中@Transactional注解失效的七大坑点与修复之道

RabbitMQ Spring Boot 配置与使用指南

Spring Boot集成RabbitMQ实现消息队列生产者与消费者

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

S型曲线的几种设计(图像对比度调节)

一般来讲&#xff0c;图像调色模块都会提供“曲线”工具&#xff0c;这是一个极其灵活的功能&#xff0c;绝大部分的调色都可以通过该工具实现&#xff0c;但是曲线功能的交互相对而言比较复杂。出于简便性和效率方面的考量&#xff0c;调色模块往往还会提供一些具有很强的功能…

初识C语言——第十四天

指针 总结&#xff1a;指针变量是用来干啥的呢&#xff0c;一是用来存放别人的地址的&#xff0c;指针是有类型的&#xff0c;这个类型是如何写的&#xff1b;二是当我有一天通过*(解引用符&#xff09;找到我所要找的对象&#xff0c;来操作所指向的对象。 #define _CRT_SECUR…

Three.js的几何形状

在创建物体的时候&#xff0c;需要传入两个参数&#xff0c;一个是几何形状【Geometry】&#xff0c;一个是材质【Material】 几何形状主要是存储一个物体的顶点信息&#xff0c;在Three中可以通过指定一些特征来创建几何形状&#xff0c;比如使用半径来创建一个球体。 立方体…

VS2022快捷键修改

VS2022快捷键修改 VS2022快捷键修改 VS2022快捷键修改

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…

2022 年全国职业院校技能大赛高职组云计算赛项试卷(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

docker部署常用工具

1.创建mysql docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/mysql.conf.d -v /home/mysql/log:/var/log/ -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD2022qwer -d mysql:5.7 而后再执行升级&#xff1a; docker update --restar…

React中的高阶组件的封装,高阶函数,HOC的含义及用法:

含义及作用: 高阶函数代码案例: 调用高阶组价:

CP AUTOSAR之CANXL Driver详细说明(正在更新中)

本文遵循autosar标准&#xff1a;R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

算法提高之玉米田

算法提高之玉米田 核心思想&#xff1a;状态压缩dp 将图存入g数组 存的时候01交换一下方便后面判断即g数组中0为可以放的地方 state中1为放的地方 这样只要state为1 g为0就可以判断不合法 #include <iostream>#include <cstring>#include <algorithm>#includ…

Read timed out. (python 安装第三方库超时)

不少人在安装python第三方库的时候经常发生下面情况 解决方法就是往上找 我这里就是 jupyterlab-4.1.8-py3-none-any.whl安装时间过长&#xff0c;失败 那就去国内镜像网站下载下来离线安装 https://pypi.tuna.tsinghua.edu.cn/simple/xxx&#xff08;xxx就是你的包名&#…

Linux内核之获取文件系统超级块:sget用法实例(六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Linux 命令操作】如何在 Linux 中使用多行注释呢?

文章目录 1. 给代码进行多行注释2. 给代码取消多行注释 1. 给代码进行多行注释 &#x1f427;① 首先用 vim 打开代码&#xff0c;按 Esc进入命令模式(Normal mode)&#xff1b; &#x1f427;② 然后按住 ctrl v 进入列模式&#xff1b; &#x1f427;③ 再通过按 h(左)、j(…

PHP 匿名函数和闭包在数据结构中的应用

匿名函数和闭包在数据结构处理中的应用php 中的匿名函数和闭包可用于处理数组、链表和队列等数据结构。针对数组&#xff0c;匿名函数可用于过滤元素&#xff1b;针对链表&#xff0c;闭包可用于创建节点&#xff1b;针对队列&#xff0c;匿名函数和闭包可实现 fifo 队列操作。…

数仓分层——ODS、DW、ADS

一、什么是数仓分层 数据仓库分层是一种组织和管理数据仓库的结构化方法&#xff0c;它将数据仓库划分为不同的层次或级别&#xff0c;每个层次具有特定的功能和目的。这种分层方法有助于管理数据仓库中的数据流程、数据处理和数据访问&#xff0c;并提供一种清晰的结构来支持…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考&#xff1a;https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错&#xff0c;nvcc正常 1&#xff09;查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2&#xff09;…

【大模型】LLaMA-1 模型介绍

文章目录 一、背景介绍二、模型介绍2.1 模型结构2.2 模型超参数2.3 SwiGLU 三、代码分析3.1 模型结构代码3.2 FairScale库介绍 四、LLaMA家族模型4.1 Alpaca4.2 Vicuna4.3 Koala(考拉)4.4 Baize (白泽)4.5 Luotuo (骆驼&#xff0c;Chinese)4.6 其他 参考资料 LLaMA&#xff08…

自动化运维管理工具----------Ansible模块详细解读

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

【算法】数字接龙 走迷宫问题的一般处理思路

前言 其实走迷宫就是一个普普通通的深搜回溯嘛&#xff0c;但是我之前做的很多题都是在一个二维的地图上&#xff0c;只能上下左右四个方向走迷宫&#xff0c;在做数字接龙这道题的时候&#xff0c;相当于可以往8个方向走&#xff0c;虽然逻辑上不变&#xff0c;但按照我之前的…

Spring Boot集成RabbitMQ-之6大模式总结

A.集成 一&#xff1a;添加依赖 在pom.xml文件中添加spring-boot-starter-amqp依赖&#xff0c;以便使用Spring Boot提供的RabbitMQ支持&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp&…