后端进阶之路——综述Spring Security认证,授权(一)

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
前端炫酷代码分享
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★
★后端进阶之路★

请添加图片描述

文章目录

  • 前言
  • ✍1. 引言
    • ✌ 背景介绍:网络安全的重要性
    • ✌ Spring Security简介:什么是Spring Security,它的作用和优势
  • ✍2. Spring Security基本概念
      • ✌认证(Authentication):验证用户身份
          • 代码演示
        • 1. 创建一个自定义的 `UserDetailsService` 实现来加载用户信息:
        • 2. 配置 Spring Security 来使用上述的 `UserDetailsService` 实现:
        • 3. 在控制器中处理登录请求:
      • ✌授权(Authorization):授予用户访问权限
          • 代码演示
        • 1. 基于角色(Role)的授权:
        • 2. 基于权限(Permission)的授权:
      • ✌安全上下文(Security Context):保存已认证的用户信息
          • 代码演示
        • 一旦你在认证过程中验证了用户的凭据,你可以创建 `CustomUserDetails` 实例,并将其放入安全上下文中:
      • ✌过滤器链(Filter Chain):处理请求的过程
  • ✍小结

以下是在每个标题前添加#符号后的文本:

✍1. 引言

✌ 背景介绍:网络安全的重要性

网络安全的重要性无法被低估。随着我们越来越依赖互联网和数字技术,网络安全问题变得愈发严峻。以下是网络安全的几个重要方面:

  1. 防止数据泄露:网络安全确保我们的个人信息、敏感数据和商业机密不会落入未授权的人手中。这包括银行账户信息、社交媒体账号、医疗记录等。

  2. 防范黑客攻击:黑客可以通过各种方式入侵网络系统,窃取信息、破坏系统或勒索金钱。网络安全措施有助于防止这些攻击,并保护我们的计算机、移动设备和网络连接。

  3. 维护企业安全:对于企业而言,网络安全至关重要。保护公司的数据和机密信息,防止竞争对手或恶意行为者获取敏感信息,确保业务的连续性和声誉。

  4. 保护个人隐私:在数字时代,我们的个人隐私面临威胁。网络安全可以帮助我们保护个人身份和隐私,避免成为身份盗窃、网络欺诈或网络骚扰的受害者。

  5. 防止网络犯罪:网络安全对于打击网络犯罪至关重要。网络犯罪包括电信诈骗、网络钓鱼、恶意软件传播等。通过加强网络安全,可以降低这些犯罪行为的发生率,并维护社会的安全和秩序。

✌ Spring Security简介:什么是Spring Security,它的作用和优势

Spring Security是一个用于在Java应用程序中实现身份验证和授权的框架。它对应用程序进行保护,以防止未经授权的访问,并确保只有经过身份验证的用户可以执行特定操作。

Spring Security的主要作用是提供全面的安全性解决方案,包括用户认证、授权、会话管理和密码加密等功能。它可以轻松集成到Spring应用程序中,并通过配置和自定义来满足各种安全需求。

以下是Spring Security的几个优点:

  1. 统一的安全管控:Spring Security提供了一套完善的安全管理框架,使得开发者可以方便地集中管理应用程序的安全性,而无需重复编写安全相关的代码。

  2. 灵活的身份验证和授权机制:Spring Security支持多种身份验证方式,如基于表单的身份验证、HTTP Basic和Digest身份验证、LDAP身份验证等。它还提供了细粒度的授权机制,可以通过注解或配置的方式定义权限规则。

  3. 安全性扩展性:Spring Security具有良好的扩展性,可以与其他框架和技术无缝集成,例如Spring框架、OAuth、OpenID等。这使得开发人员可以根据项目需求选择合适的安全性解决方案。

  4. 内置防护措施:Spring Security提供了对常见安全威胁的内置防护机制,如跨站点请求伪造(CSRF)保护、点击劫持保护、会话管理等。这些功能可以有效地提高应用程序的安全性。

在这里插入图片描述

✍2. Spring Security基本概念

Spring Security是一个基于Java的身份验证和访问控制框架,用于保护Web应用程序和服务。它提供了一套功能强大的安全性特性,帮助开发人员在应用程序中实现各种身份验证和授权方案。

在这里插入图片描述

✌认证(Authentication):验证用户身份

认证是确认用户身份的过程。当用户尝试登录系统时,Spring Security会验证用户提供的凭据是否有效,并根据验证结果构建一个代表用户身份的对象,称为Authentication对象。

代码演示

当使用Spring Security进行身份验证时,可以通过以下代码片段来理解认证过程:

1. 创建一个自定义的 UserDetailsService 实现来加载用户信息:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found with username: " + username);}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),getAuthorities(user.getRoles()));}private Collection<? extends GrantedAuthority> getAuthorities(Set<Role> roles) {return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());}
}

2. 配置 Spring Security 来使用上述的 UserDetailsService 实现:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}// 密码加密器@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}
}

3. 在控制器中处理登录请求:

@Controller
public class LoginController {@GetMapping("/login")public String login() {return "login";}@GetMapping("/")public String home() {return "home";}
}

在这里插入图片描述

以上代码演示了一个基本的Spring
Security身份验证过程。当用户尝试访问受保护的资源时,会被重定向到登录页面(/login)。用户输入用户名和密码后,Spring
Security将通过 UserDetailsService 加载用户信息,并使用提供的凭据进行验证。如果验证成功,将创建一个
Authentication 对象表示用户身份,并允许用户访问受保护的资源。

✌授权(Authorization):授予用户访问权限

授权是确定用户是否有权限执行某个操作或访问某个资源的过程。Spring Security提供了丰富的授权机制,包括基于角色(Role)和权限(Permission)的授权方式。

代码演示

当涉及到授权时,Spring Security提供了几种常见的授权方式。下面是一些代码片段来帮助理解这些授权机制。

1. 基于角色(Role)的授权:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin();}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}password").roles("ADMIN");}
}

在上面的示例中,我们使用了基于角色的授权方式。通过hasRole()hasAnyRole()方法,我们可以指定哪些角色有访问权限。在configureGlobal()方法中,我们使用了一个简单的内存身份验证,其中包含了具有不同角色的两个用户。

2. 基于权限(Permission)的授权:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasAuthority("ADMIN").antMatchers("/user/**").hasAnyAuthority("USER", "ADMIN").anyRequest().authenticated().and().formLogin();}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").authorities("USER").and().withUser("admin").password("{noop}password").authorities("ADMIN");}
}

在上面的示例中,我们使用了基于权限的授权方式。通过hasAuthority()hasAnyAuthority()方法,我们可以指定哪些权限有访问权限。在configureGlobal()方法中,我们使用了相同的内存身份验证,但是这次我们分配了不同的权限。

✌安全上下文(Security Context):保存已认证的用户信息

用户详情(User Details):用户详情是Spring Security中表示用户信息的接口,通常由开发人员实现以提供自定义用户信息。它包含用户的用户名、密码、角色等属性。

代码演示

以下是自定义用户详情(User Details)并在安全上下文(Security Context)中保存已认证的用户信息。

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Collection;public class CustomUserDetails implements UserDetails {private String username;private String password;private Collection<? extends GrantedAuthority> authorities;public CustomUserDetails(String username, String password, Collection<? extends GrantedAuthority> authorities) {this.username = username;this.password = password;this.authorities = authorities;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return authorities;}@Overridepublic String getPassword() {return password;}@Overridepublic String getUsername() {return username;}// 下面的方法可以根据实际需求进行实现@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

在上述代码中,CustomUserDetails 类实现了 UserDetails
接口,并提供了必要的方法来获取用户名、密码和用户角色等属性。这个类是开发人员自定义的用户详情实现。

一旦你在认证过程中验证了用户的凭据,你可以创建 CustomUserDetails 实例,并将其放入安全上下文中:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;public class AuthenticationService {public void authenticateUser(String username, String password) {// 通过验证用户名和密码// 创建用户详情UserDetails userDetails = new CustomUserDetails(username, password, authorities);// 创建认证对象Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, password, authorities);// 将认证对象放入安全上下文SecurityContextHolder.getContext().setAuthentication(authentication);}
}

在上述代码中,authenticateUser 方法创建了一个 CustomUserDetails 实例,并使用该实例创建了一个
UsernamePasswordAuthenticationToken
对象。然后,它将认证对象放入安全上下文中,以便后续可以访问已认证的用户信息。

✌过滤器链(Filter Chain):处理请求的过程

过滤器链(Filter Chain):过滤器链是Spring Security的核心组件之一,负责处理请求的安全性。它由多个过滤器组成,每个过滤器负责执行特定的安全操作,例如身份验证、授权检查等。

下面是一个基本的Spring Security过滤器链配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().and().logout();}
}

在上面的示例中,SecurityConfig类继承了WebSecurityConfigurerAdapter,这是一个方便的基类,用于配置Spring
Security。

configure()方法用于配置HttpSecurity对象,它定义了过滤器链的行为。在该示例中,过滤器链执行以下操作:

  1. authorizeRequests():配置请求授权规则。
  2. .antMatchers("/public/**").permitAll():允许所有用户访问以/public/开头的URL。
  3. .anyRequest().authenticated():对于其他所有请求,要求用户进行身份验证。
  4. .formLogin():启用基于表单的身份验证。
  5. .logout():启用退出功能。

✍小结

Spring Security是一个功能强大的Java框架,用于在应用程序中实现认证(Authentication)和授权(Authorization)功能。它提供了一套细粒度的安全性控制机制,帮助保护应用程序免受恶意攻击和未经授权的访问。
在这里插入图片描述
下一篇我们会详细讲述Spring Security配置问题

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

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

相关文章

【数据结构篇】手写双向链表、单向链表(超详细)

文章目录 链表1、基本介绍2、单向链表2.1 带头节点的单向链表测试类&#xff1a;链表实现类&#xff1a; 2.2 不带头节点的单向链表2.3 练习测试类&#xff1a;链表实现类&#xff1a; 3、双向链表测试类&#xff1a;双向链表实现类&#xff1a; 4、单向环形链表**测试类**&…

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写&#xff1f; 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…

Java课题笔记~ Spring 概述

Spring 框架 一、Spring 概述 1、Spring 框架是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架&#xff0c;它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。 Spring…

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…

聊聊 Docker 和 Dockerfile

目录 一、前言 二、了解Dockerfile 三、Dockerfile 指令 四、多阶段构建 五、Dockerfile 高级用法 六、小结 一、前言 对于开发人员来说&#xff0c;会Docker而不知道Dockerfile等于不会Docker&#xff0c;上一篇文章带大家学习了Docker的基本使用方法&#xff1a;《一文…

【NLP概念源和流】 01-稀疏文档表示(第 1/20 部分)

一、介绍 自然语言处理(NLP)是计算方法的应用,不仅可以从文本中提取信息,还可以在其上对不同的应用程序进行建模。所有基于语言的文本都有系统的结构或规则,通常被称为形态学,例如“跳跃”的过去时总是“跳跃”。对于人类来说,这种形态学的理解是显而易见的。 在这篇介…

设计模式-迭代器模式在Java中使用示例

场景 为开发一套销售管理系统&#xff0c;在对该系统进行分析和设计时&#xff0c;发现经常需要对系统中的商品数据、客户数据等进行遍历&#xff0c; 为了复用这些遍历代码&#xff0c;开发人员设计了一个抽象的数据集合类AbstractObjectList&#xff0c;而将存储商品和客户…

MySQL正则表达式检索数据

目录 一、使用正则表达式进行基本字符匹配 1.使用regexp关键字 2.使用正则表达式 . 二、进行OR匹配 1.为搜索两个串之一&#xff0c;使用 | 2.匹配几个字符之一[] 3.匹配范围 4.匹配特殊字符 过滤数据允许使用匹配、比较、通配符操作来寻找数据&#xff0c;但是随…

MySQL 的事件调度器

MySQL 的事件调度器可以通过以下方式进行管理&#xff1a; 1】查看事件调度器的状态 SHOW VARIABLES LIKE event_scheduler;2】启用/禁用事件调度器 SET GLOBAL event_scheduler ON;SET GLOBAL event_scheduler OFF; 注意&#xff1a;启用/禁用事件调度器需要具有 SUPE…

Spring源码之XML文件中Bean标签的解析1

读取XML文件&#xff0c;创建对象 xml文件里包含Bean的信息&#xff0c;为了避免多次IO&#xff0c;需要一次性读取xml文件中所有bean信息&#xff0c;加入到Spring工厂。 读取配置文件 new ClassPathResource("applicationContext.xml")ClassPathResource是Sprin…

10倍提升效率,号称取代Elasticsearch?

[Manticore Search](https://github.com/manticoresoftware/manticoresearch/) 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx&#xff0c;显着改进了它的功能&#xff0c;修复了数百…

Charles抓包工具使用(一)(macOS)

Fiddler抓包 | 竟然有这些骚操作&#xff0c;太神奇了&#xff1f; Fiddler响应拦截数据篡改&#xff0c;实现特殊场景深度测试&#xff08;一&#xff09; 利用Fiddler抓包调试工具&#xff0c;实现mock数据特殊场景深度测试&#xff08;二&#xff09; 利用Fiddler抓包调试工…

Linux下TCP网络服务器与客户端通信程序入门

文章目录 目标服务器与客户端通信流程TCP服务器代码TCP客户端代码 目标 实现客户端连接服务器&#xff0c;通过终端窗口发送信息给服务器端&#xff0c;服务器接收到信息后对信息数据进行回传&#xff0c;客户端读取回传信息并返回。 服务器与客户端通信流程 TCP服务器代码 …

etcd

文章目录 etcd单机安装设置键值对watch操作读取键过往版本的值压缩修订版本lease租约&#xff08;过期机制&#xff09;授予租约撤销租约keepAlive续约获取租约信息 事务基于etcd实现分布式锁原生实现官方 concurrency 包实现 服务注册与发现Go 操作 Etcd 参考 etcd etcd 是一…

02|Oracle学习(数据类型、DDL)

1. 数据类型&#xff1a; 通常为&#xff1a;字符型、数值型、日期型以及大字段型大字段型&#xff1a;存放大数据及文件。 存储大数据时&#xff0c;基本上blob就能满足。 2. DDL&#xff08;数据库定义语言&#xff09; 主要包括对数据库对象的创建、删除及修改的操作。…

2.文件的逻辑结构

第四章 文件管理 2.文件的逻辑结构 顺序文件采用顺序存储则意味着各个逻辑上相邻的记录在物理上也是相邻的存储的。所以如果第0号记录的逻辑地址为0的话&#xff0c;则i号记录的逻辑为i *L。 特别的如果这个定长记录的顺序文件采用串结构&#xff0c;也就是这些记录的顺序和他…

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录 一、结构体 1、python 与 go面向对象的实现&#xff1a; 2、初用GO中的结构体&#xff1a;&#xff08;实例化一个值类型的数据&#xff08;结构体&#xff09;&#xff09; 输出结果不同的三种方式 3、实例化一个引用类型的数据&#xff08;结构体&#xff09; 4、…

Tomcat添加第三方jar包、如何在IDEA中启动部署Web模板

前言:公司最近维护老项目,是最原始的web项目,servlet和jsp结合的web项目,启动的时候配置了好几遍, 都起不来,很折磨人,这个文档比较全配置一遍准备工作 首先 拉取代码: git clone xxx.git ,如需要别的操作,自行baidu 也可以在idea中拉取第一步File ->Project Structure->…

Redis两种持久化方案RDB持久化和AOF持久化

Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启…

VSCode插件Todo Tree的使用

在VSCode中安装插件Todo Tree。按下快捷键ctrlshiftP&#xff0c;输入setting.jspn&#xff0c;选择相应的配置范围&#xff0c;我们选择的是用户配置 Open User Settings(JSON)&#xff0c;将以下代码插入其中。 //todo-tree 标签配置从这里开始 标签兼容大小写字母(很好的功…