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.xmlbuild.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] 概述的更多相关文章

  1. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...

  2. Zookeeper详解(01) -概述

    Zookeeper详解(01) -概述 概念 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分 ...

  3. 01 - 概述 VTK 6.0 迁移

    摘要 对vtk版本4和5的管道机制重新架架构的主要目的是:迁移数据对象和算法对象中的管道执行逻辑到一个新集合的类中,我们称这个集合类叫executives.分离数据和执行模型的代码后,可以双双简化修改 ...

  4. Redis数据库 01概述| 五大数据类型

    1.NoSQL数据库简介 解决应用服务器的CPU和内存压力:解决数据库服务的IO压力: ----->>> ① session存在缓存数据库(完全在内存里),速度快且数据结构简单: 打 ...

  5. Hive 01 概述、安装配置

    概述 数据仓库:是一个面向主题的.集成的.不可更新的.随时间不变化的数据集合,它用于支持企业或组织的决策分析处理. 数据仓库的结构和建立过程: 数据源 数据存储及管理 ETL Extract 提取 T ...

  6. 【OracleDB】 01 概述和基本操作

    实例概念: Oracle有一个特殊的概念 Oracle数据库 = 数据库 + Oracle文件系统 + Oracle实例 实例处理Oracle的请求,调用文件系统 然后返回结果响应给客户端 单实例和多 ...

  7. 【大数据面试】Flink 01 概述:包含内容、层次架构、运行组件、部署模式、任务提交流程、任务调度概念、编程模型组成

    一.概述 1.介绍 对无界和有界数据流进行有状态计算的分布式引擎和框架,并可以使用高层API编写分布式任务,主要包括: DataSet API(批处理):静态数据抽象为分布式数据集,方便使用操作符进行 ...

  8. Headfirst JSP 01 (概述)

    HTTP 协议 http 是tcp/ip上层协议, 如果你对这些网络协议还不是太熟悉, 下面提供一个非常简单的解释, tcp负责确保从一个网络节点向另一个网络节点发送文件能作为一个完整的文件到达目的地 ...

  9. Python学习笔记 :01概述

    Python基础 首先推荐学习Python基础的教程和书籍 视频教程推荐南京大学张莉老师在cousera上的教程用Python玩转数据 入门教程<Python基础教程> 数据挖掘教程< ...

  10. 重学C语言---01概述

    1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...

随机推荐

  1. Python 2.7 十六进制字符数组 转 字符串 (字符是Unicode字符)

    有一串十六进制数据,是Uncode字符. import struct strhex='003100310031' buf = strhex.decode("hex") value= ...

  2. zz 失血模型与充血模型等

    失血模型与充血模型 | 三秋 (贫血模型)优点是系统的层次结构清楚,各层之间单向依赖,Client->(BusinessFacade)->BusinessLogic->Data Ac ...

  3. bytecode 生成器

    基础 objectweb asm 很难用,找了几个高级点的. activej codegen 这个库很像 .net DLR 风格,采用 Expression 抽象,例如 Expressions.add ...

  4. springboot连接mysql报错errorCode 0, state 08S01

    前言许久未维护的项目需要检查一些数据,重新运行项目发现有create connection SQLException ,具体报错信息是 errorCode 0, state 08S01 . Sprin ...

  5. Spring Boot 2.4 中文

    Spring Boot 2.4 中文 https://runebook.dev/zh-CN/docs/spring_boot/spring-boot-features

  6. zstd - 一种由Facebook使用的快速数据压缩算法

    Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比,由Facebook开发. 它是用C语言编写的无损压缩算法 (在Java中有一个重新实现) - 因此它 ...

  7. debian/ubuntu系统vi无法删除字符的解决办法

    之前在 Linux 下操作,一直使用的是 Centos 系统,使用 vi 编辑命令一直很顺畅. 最近,入手了一台 debian 操作系统的 vps.在操作 vi 命令时,发现当输入 i 要进行文件编辑 ...

  8. Qt/C++地图动态绘制折线多边形矩形圆形标注点/可编辑拖动调整大小和位置

    一.前言说明 无论哪一家的地图,都提供了调用函数绘制各种覆盖物,但是有时候的场景是希望进入添加覆盖物模式,然后每次在地图上按下都自动生成对应的覆盖物比如圆形,这样就不需要用户提前知道经纬度坐标等参数, ...

  9. Qt音视频开发7-ffmpeg音频播放

    一.前言 之前用ffmpeg解码出来了音频,只是做了存储部分,比如存储成aac文件,播放的话早期用的是sdl来播放音频,自从Qt5以后提供了QAudioOutput来播放输入的音频数据,就更加方便了, ...

  10. 推荐一个windows系统的下载和安装的网址:win7之家

    win7之家:http://www.windows7en.com/ 精校 完整 极致 Windows系统下载仓储站HelloWindows :https://hellowindows.cn/