SpringSecurity - [01] 概述
Spring Security 是一个灵活且强大的工具,可以帮助你构建安全可靠的Spring应用程序。它不仅简化了认证和授权的过程,而且还提供了丰富的特性和扩展点,使得开发者可以根据项目的独特需求定制安全策略。无论是小型的内部工具还是大型的企业级应用,Spring Security都能提供必要的安全保障。
001 || SpringSecurity是什么
Spring Security是一个强大的、可定制的身份验证和访问控制框架,它是为基于Java的Spring应用程序设计的安全框架。
它提供了全面的安全服务,包括不限于:
- 认证(Authentication):确认用户身份,即验证用户提供的凭证(如用户名和密码)是否正确。
- 授权(Authorization):决定已认证的用户是否有权限执行某些操作或访问特定资源。
Spring Security构建在Spring框架之上,可以轻松集成到任何基于Spring的应用程序中,并且支持多种安全协议和技术,如OAuth2、JWT(JSON Web Tokens)、LDAP等。
002 || 作用
【1】保护Web应用:通过配置HTTP请求的安全策略来保护Web应用程序,例如限制对某些URL的访问。
【2】管理用户认证:提供多种方式来处理用户登录,包括表单登录、基本认证、记住我功能等。
【3】实施访问控制:允许开发者定义细粒度的访问规则,以确保只有授权用户才能访问敏感数据或执行关键操作。
【4】防止常见的共计:内置防御机制对抗跨站脚本共计(XSS)、跨站请求伪造(CSRF)、点击劫持(Clickjacking)等常见安全威胁。
【5】支持多样的认证机制:除了传统的用户名/密码认证外,还支持社交登录(如Google、Facebook)、双因素认证等现代认证方式。
003 || 如何使用
要在Spring Boot项目中使用Spring Security,通常需要完成以下几个步骤:
(1)添加依赖
首先,在pom.xml或build.gradle文件中添加Spring Security Starter依赖。以Maven项目为例,则为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
默认启动Springboot项目之后,会在控制台显示默认用户user的临时密码

在浏览器准备访问 localhost:8080/hello 时,自动跳转到localhost:8080/login页面

(2)配置安全性
可以通过Java配置类或YAML/Properties文件来进行Spring Security相关配置。
下面是一个简单的Java配置示例,它允许匿名访问/hello路径,而其他所有请求都需要认证。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/hello").permitAll() // 允许所有人访问 /hello
.anyRequest().authenticated() // 所有其他请求都需要认证
.and()
.formLogin(); // 启用表单登录
return http.build();
}
}
(3)创建用户详情服务(可选)
自定义用户存储和服务,比如从数据库加载用户信息,需要实现UserDetailsService接口并覆盖loadUserByUsername方法。然后将这个实现注册为SpringBean:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根据用户名查找用户实体,并将其转换为Spring Security的UserDetails对象
return userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
}
(4)定义用户和角色(可选)
通过内存中的用户配置快速设置一些测试用户及其角色。这对于开发阶段非常有用:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfiguration {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
(5)自定义登录页面(可选)
默认情况下,Spring Security会提供一个简易的登录页面。如果想要创建自己的登录界面,可以通过覆盖默认的登录路径来实现:
http
.formLogin()
.loginPage("/login") // 指定自定义登录页面的URL
.permitAll(); // 允许所有人访问登录页面
同时,需要创建相应的HTML模板或者JSP页面用于显示登录表单。
SpringSecurity - [01] 概述的更多相关文章
- kafka详解(01) - 概述
kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...
- Zookeeper详解(01) -概述
Zookeeper详解(01) -概述 概念 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分 ...
- 01 - 概述 VTK 6.0 迁移
摘要 对vtk版本4和5的管道机制重新架架构的主要目的是:迁移数据对象和算法对象中的管道执行逻辑到一个新集合的类中,我们称这个集合类叫executives.分离数据和执行模型的代码后,可以双双简化修改 ...
- Redis数据库 01概述| 五大数据类型
1.NoSQL数据库简介 解决应用服务器的CPU和内存压力:解决数据库服务的IO压力: ----->>> ① session存在缓存数据库(完全在内存里),速度快且数据结构简单: 打 ...
- Hive 01 概述、安装配置
概述 数据仓库:是一个面向主题的.集成的.不可更新的.随时间不变化的数据集合,它用于支持企业或组织的决策分析处理. 数据仓库的结构和建立过程: 数据源 数据存储及管理 ETL Extract 提取 T ...
- 【OracleDB】 01 概述和基本操作
实例概念: Oracle有一个特殊的概念 Oracle数据库 = 数据库 + Oracle文件系统 + Oracle实例 实例处理Oracle的请求,调用文件系统 然后返回结果响应给客户端 单实例和多 ...
- 【大数据面试】Flink 01 概述:包含内容、层次架构、运行组件、部署模式、任务提交流程、任务调度概念、编程模型组成
一.概述 1.介绍 对无界和有界数据流进行有状态计算的分布式引擎和框架,并可以使用高层API编写分布式任务,主要包括: DataSet API(批处理):静态数据抽象为分布式数据集,方便使用操作符进行 ...
- Headfirst JSP 01 (概述)
HTTP 协议 http 是tcp/ip上层协议, 如果你对这些网络协议还不是太熟悉, 下面提供一个非常简单的解释, tcp负责确保从一个网络节点向另一个网络节点发送文件能作为一个完整的文件到达目的地 ...
- Python学习笔记 :01概述
Python基础 首先推荐学习Python基础的教程和书籍 视频教程推荐南京大学张莉老师在cousera上的教程用Python玩转数据 入门教程<Python基础教程> 数据挖掘教程< ...
- 重学C语言---01概述
1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...
随机推荐
- React使用useRef调用子组件方法
前情 公司前端主技术栈是react系,最近在提取组件的时候想到vue可以通过ref获取子组件,再调用子组件的方法,于是想在react中实现同样效果. 实现原理 父组件调用useRef获取ref对象,再 ...
- DA14531芯片固件逆向系列(3)- BLE收包流程分析及漏洞挖掘思路分享
文章首发于 https://xz.aliyun.com/t/9194 前言 本文介绍定位和分析DA14531收包流程的方法,并提供简单的BLE协议漏洞挖掘思路. 定位收包函数 通过查看DA14531的 ...
- 鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述
1. 背景 在鸿蒙开发中,ArkTS是优选的主力应用开发语言. ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集. 因此,在学习Ar ...
- PDFSharp 常见问题
PDFSharp 常见问题 PDFsharp: Frequently Asked Questions - PDFsharp and MigraDoc Wiki 1. PDFSharp 是什么? PDF ...
- mysql命令行创建数据库并设置字符集
CREATE DATABASE test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- Qt音视频开发30-qmedia内核qt4方案phonon播放(支持视频流)
一.前言 在Qt4中如果需要播放视频,一般用phonon多媒体框架,这应该就是Qt5/Qt6中多媒体框架的前身(查阅qmultimedia模块的相关代码可以发现架构几乎雷同,除了部分命名变了以外),p ...
- Qt音视频开发19-vlc内核各种事件通知
一.前言 对于使用第三方的sdk库做开发,除了基本的操作函数接口外,还希望通过事件机制拿到消息通知,比如当前播放进度.音量值变化.静音变化.文件长度.播放结束等,有了这些才是完整的播放功能,在vlc中 ...
- Qt编写ERP库存库房发货电子看板
一.前言 有了之前可视化大屏电子看板系统的经验,要做这个ERP库存库房发货电子看板,可以说是水到渠成轻车熟路,技术难度比之前做过的各种大屏系统的子模块都要简单.由于库存库房发货数据的特殊性,基本上都是 ...
- Qt音视频开发14-mpv读取和控制
一.前言 用mpv来读取文件的信息,以及设置当前播放进度,音量.静音等,和当时vlc封装的功能一样,只不过vlc是通过调用函数接口去处理,而mpv是通过读取和设置属性来处理,vlc支持定时器或者线程中 ...
- 实时社群技术专题(一):支持百万人超级群聊,一文读懂社群产品Discord
本文由腾讯产品体验设计师volihuang分享,原题"千万级增长,实时社交产品Discord拆解",本文收录时有内容修订和大量排版优化. 1.引言 对于大多数人而言,对即时通讯IM ...