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://www.rhkb.cn/news/324886.html

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

相关文章

LOTO示波器动作编程功能(命令批处理)

动作编程功能是为了方便客户根据自己的应用场景&#xff0c;做到一个按键就连续做多个示波器操作&#xff0c;从而降低了对操作人员的技术要求&#xff0c;做到傻瓜式操作。之前LOTO有个类似的功能&#xff0c;是把示波器的基础设置根据不同的测试场景存成不同的设置文件&#…

新建的springBoot WEB项目无法自动返回html模版(gradle+kotlin版本)

最近研究了springBoot创建web项目&#xff0c; 第一步服务端返回字符串没有问题&#xff0c;第二步返回html时&#xff0c;还是返回的字符串。 文章目录 一、参考方案二、新建springBoot web项目三、启动项目的三种方式 一、参考方案 将控制器类的 RestController 改为 Contro…

基于CCS5.5的双音多频(DTMF)信号检测仿真实验(①检测型音频文件②输入生成音频并检测)

DTMF的优点 我们知道,DTMF根本上仍然是频谱分析,基础还是DFT,但DFT通常需要对一整段数据做变换,而DTMF不同,每输入一个采样点就计算一次,更有利于硬件实现。 基于CCS的双音多频(DTMF)信号检测原理 公式详细推导 详细的公式推导在下面这篇博客中已经进行了详细的描述,…

AI图书推荐:给自媒体创作者的ChatGPT使用指南

你是否厌倦了花费数小时盯着空白屏幕&#xff0c;努力为你的内容想出新鲜点子&#xff1f;想要将你的写作提升到下一个水平&#xff1f;有了ChatGPT&#xff0c;你可以告别写作障碍、无休止的修订和浪费的时间。 在这本全面的指南中&#xff0c;你将学到关于ChatGPT你需要知道…

vue3使用el-autocomplete请求远程数据

服务器端 RestController RequestMapping("/teacher") public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping({"/v1/getTop10TeacherByName/","/v1/getTop10TeacherByName/{name}"})public ResultBean&l…

工业机器人应用实践之玻璃涂胶(篇二)

工业机器人 接上篇文章&#xff0c;浅谈一下实践应用&#xff0c;具体以玻璃涂胶为例&#xff1a; 了解工业机器人在玻璃涂胶领域的应用认识工具坐标系的标定方法掌握计时指令的应用掌握人机交互指令的应用掌握等待类指令用法&#xff08;WaitDI、WaitUnitl 等&#xff09;认…

【gpedit.msc】组策略编辑器的安装,针对windows家庭版,没有此功能

创建一个记事本文件然后放入以下内容 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-…

进程间通信

文章目录 1.进程间通信2.进程间通信方式2.1 管道---匿名管道2.2 使用管道---管道测试接口(代码实现) 3.进程池3.1 进程池的原理图3.2 进程池的代码实现 4.命名管道4.1 有名管道通信4.2 有名管道通信的代码实现 5.共享内存5.1 共享内存原理5.2 共享内存的代码实现 6.共享内存7.代…

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…

MongoDB安装及接入springboot

环境&#xff1a;windows、jdk8、springboot2 1.MongoDB概述 MongoDB是一个开源、高性能、无模式&#xff08;模式自由&#xff09;的文档&#xff08;Bson&#xff09;型数据库&#xff1b;其特点如下&#xff1a; 模式自由 ---- 不需要提前创建表 直接放数据就可以 支持高并…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 04 (完结)

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 04: Deep Neural NetworksLearning Objectives Deep L-layer…

AppBuilder低代码体验:构建雅思大作文组件

AppBuilder低代码体验&#xff1a;构建雅思大作文组件 ​ 在4月14日&#xff0c;AppBuilder赢来了一次大更新&#xff0c;具体更新内容见&#xff1a;AppBuilder 2024.04.14发版上线公告 。本次更新最大的亮点就是**新增了工作流&#xff0c;低代码制作组件。**具体包括&#x…

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示&#xff1a;敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

Seaborn : 超好用的Python可视化工具

1. 引言 说到数据可视化&#xff0c;Seaborn就像一颗隐藏的宝石&#xff01;在进行探索性数据分析时&#xff0c;我们通常从Matplotlib 开始&#xff0c;而对 Seaborn 的探索相对较少&#xff01;但是&#xff0c;只要你了解 Seaborn 的全部潜力&#xff0c;你就会惊奇地发现&…

如何通过前端表格控件在10分钟内完成一张分组报表?

前言&#xff1a; 当今时代&#xff0c;报表作为信息化系统的重要组成部分&#xff0c;在日常的使用中发挥着关键作用。借助报表工具使得数据录入、分析和传递的过程被数字化和智能化&#xff0c;大大提高了数据的准确性及利用的高效性。而在此过程中&#xff0c;信息化系统能…

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 &#xff1e;什么是研究生入学考试&#xff1f; 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后&#xff0c;也可称研究生&#xff0c;含义为研究生学历的人。在中国大陆地区&#xff0c;普通民众一般也将硕士毕业生称…

【软考高项】四十二、八大绩效域知识点

一、干系人绩效域 预期目标 建立高效的工作关系 检查&#xff1a;干系人参与的连续性 干系人认同项目目标 检查&#xff1a; 变更频率 支持项目的干系人提高了满意度&#xff0c;从中受益 检查&#xff1a;干系人行为、干系人满意度、干系人相…

2024年5月10日有感复盘

2024年5月10日有感复盘 时间 今天是一个很美好的一天&#xff0c;原因是很平凡&#xff0c;读书很平凡&#xff0c;玩游戏很平凡&#xff0c;然后生活很平凡&#xff0c;未来可期&#xff0c;听歌很舒服&#xff0c;很喜欢一个人呆在图书馆的感觉&#xff0c;很喜欢发呆&…

初识java--javaSE(3)--方法,递归,数组,

文章目录 一 方法的使用1.1 什么是方法&#xff1f;main方法注意事项 1.2 方法的调用嵌套调用在方法调用时形参与实参的关系&#xff1a; 1.3 方法的重载方法重载的意义&#xff1f;总结方法重载&#xff1a;方法签名&#xff1a; 二 递归什么是递归&#xff1f;递归的精髓&…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法&#xff0c;每个key都可以寻址到对应的服务器&#xff0c;比如&#xff0c;查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A&#xff0c;如图所示。 但如果服务器数量发生变化&#x…