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

news2024/10/7 6:51:12

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

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

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 {
  // 关闭csrf
  httpSecurity.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 ;

  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
    // 这里为了简单起见,就直接固定了
    return Arrays.asList(
          new SimpleGrantedAuthority("ROLE_MGR"),
          new SimpleGrantedAuthority("ROLE_NORMAL")
        );
  }
  @Override
  public String getPassword() {
    return this.password ;
  }
  @Override
  public String getUsername() {
    return this.username ;
  }
  // 下面几个方法你,也应该根据你实际系统用户的状态设置
  @Override
  public boolean isAccountNonExpired() {
    return true ;
  }
  @Override
  public boolean isAccountNonLocked() {
    return true ;
  }
  @Override
  public boolean isCredentialsNonExpired() {
    return true;
  }
  @Override
  public boolean isEnabled() {
    return true ;
  }
  // getter, setter
}

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

@Bean
UserDetailsService packUserDetailsService(UserRepository userRepository) {
  return new UserDetailsService() {
    @Override
    public 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.coloradmin.cn/o/1649116.html

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

相关文章

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

5000A信号发生器使用方法

背景 gnss工作需要使用的5000A&#xff0c;所以做成文档&#xff0c;用于其他员工学习。 下载星历数据 https://cddis.nasa.gov/archive/gnss/data/daily/2024/brdc/ 修改daily中的年份&#xff0c;就可以获取相关截至时间的星历数据 brcd数据格式 第一行记录了卫星的PRN号&a…

软考中级-软件设计师(十)网络与信息安全基础知识

一、网络概述 1.1计算机网络的概念 计算机网络的发展&#xff1a;具有通信功能的单机系统->具有通信功能的多机系统->以共享资源为目的的计算机网络->以局域网及因特网为支撑环境的分布式计算机系统 计算机网络的功能&#xff1a;数据通信、资源共享、负载均衡、高…

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…

Linux磁盘IO、网络IO、零拷贝详解

一、什么是I/O&#xff1f; 在计算机操作系统中&#xff0c;所谓的I/O就是输入&#xff08;input&#xff09;和输出&#xff08;output&#xff09;,也可以理解为读&#xff08;read&#xff09;和写&#xff08;write&#xff09;,针对不同的对象&#xff0c;I/O模式可以划分…

探索5个独特AI工具:它们是否值得独立存在?

在这个“地下AI”系列的最新一集中&#xff0c;我们深入挖掘了一些鲜为人知的AI工具。这些工具并非出自OpenAI、微软或谷歌等科技巨头之手&#xff0c;而是独立创造者和小型团队的智慧结晶。我们的目标是发现利用最新AI技术的独特工具。但这次有个新玩法&#xff1a;我们玩一个…

新能源汽车动力电池热管理-液冷方案应用原理与应用前景简介

前言 动力电池是新能源汽车的核心部件之一&#xff0c;其性能和寿命直接影响着车辆的续航里程和使用成本。液冷方案作为一种常见的动力电池温控解决方案&#xff0c;被广泛应用于新能源汽车领域。本文将详细介绍液冷方案的原理、发展方向以及市场前景。 一、液冷方案的原理 …

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

01.本地工作目录、暂存区、本地仓库三者的工作关系

1.持续集成 1.持续集成CI 让产品可以快速迭代&#xff0c;同时还能保持高质量。 简化工作 2.持续交付 交付 3.持续部署 部署 4.持续集成实现的思路 gitjenkins 5.版本控制系统 1.版本控制系统概述2.Git基本概述3.Git基本命令 2.本地工作目录、暂存区、本地仓库三者的工作关系…

python abs函数怎么用

abs()函数是Python的数字函数&#xff0c;用以返回数字的绝对值。 语法 以下是 abs() 方法的语法&#xff1a; abs( x ) 参数 x -- 数值表达式&#xff0c;可以是整数&#xff0c;浮点数&#xff0c;复数。 返回值 函数返回 x&#xff08;数字&#xff09;的绝对值&#x…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next()&#xff1a;此方法遇见第一个有效字符…

通过 Java 操作 redis -- 基本通用命令

目录 使用 String 类型的 get 和 set 方法 使用通用命令 exists &#xff0c;del 使用通用命令 keys 使用通用命令 expire,ttl 使用通用命令 type 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 关…

裸辞、裁员、老板跑路、被迫失业,未来是「超级个体」的时代

本期我们邀请的程序员是张立强&#xff0c;裸辞、裁员、老板跑路、被迫失业&#xff0c;管理层利益争夺&#xff0c;职业转型&#xff0c;工作五年&#xff0c;攒出了十年经验。程序员如何寻找自己的第二曲线&#xff0c;不妨听听立强的看法。 裸辞失业 大家好&#xff0c;我…

redis 使用记录

redis 使用记录 下载运行配置文件启动 参考 下载 github: Redis for Windows 或者从百度网盘下载 Redis version 3.2.100 链接: https://pan.baidu.com/s/1kxNOuZFunvVhVy1cfQzCDA?pwdpibh 运行 双击运行 运行效果 如果出错&#xff1a;查看是否项目路径是否包含中文 配…

计算机视觉——OpenCV Otsu阈值法原理及实现

算法简介 Otsu阈值法&#xff0c;也被称为大津算法&#xff0c;是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出&#xff0c;旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…

京东淘宝1688商品采集商品数据抓取API

item_get-获得淘宝商品详情 item_search 关键字搜索商品 公共参数 请求地址: taobao/item_search 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&a…

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

c++匿名比较函数参数顺序逻辑

在使用lower_bound和upper_bound时&#xff0c;想自定义比较函数&#xff0c;在这个过程中出现了参数定义顺序导致的错误问题&#xff0c;于是查找学习了下自定义比较函数需要符合的规则。 目录 1 lower_bound和upper_bound函数 1.1 lower_bound 1.2 upper_bound 2 问题产…

服务器关机前未退出xampp导出MySQL无法启动

背景解决 五一放假&#xff0c;服务器关机了&#xff0c;但是关机前没有正常关闭数据库服务&#xff0c;导致数据库无法启动&#xff01; 查看错误日志如下 从报错信息可以看出是MySQL这个服务相关文件出现问题了&#xff0c;解决思路&#xff1a;重新安装xampp 重新安装xam…

OpenHarmony实战开发-管理位置权限

Web组件提供位置权限管理能力。开发者可以通过onGeolocationShow()接口对某个网站进行位置权限管理。Web组件根据接口响应结果&#xff0c;决定是否赋予前端页面权限。获取设备位置&#xff0c;需要开发者配置ohos.permission.LOCATION&#xff0c;ohos.permission.APPROXIMATE…