Spring (30)如何在Spring应用中启用Spring Security

在Spring应用中启用Spring Security涉及几个关键步骤,包括引入Spring Security依赖、创建安全配置类以及配置应用的安全细节。下面,我们将深入探讨这些步骤,并通过代码示例和源码分析来详细解析如何启用和配置Spring Security。

1. 引入Spring Security依赖

首先,在你的Spring Boot项目的pom.xml文件中添加Spring Security的起步依赖。如果你使用的是Maven构建工具,可以添加如下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

这个依赖会引入Spring Security相关的所有必要库,让你能够开始配置和使用Spring Security。

2. 创建安全配置类

Spring Security通过Java配置的方式进行安全配置。你需要创建一个继承自WebSecurityConfigurerAdapter的类,并使用@EnableWebSecurity注解来启用Web安全功能。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll() // 允许对于特定路径的公开访问.anyRequest().authenticated() // 其他所有路径都需要认证.and().formLogin().loginPage("/login") // 自定义登录页面.permitAll().and().logout().permitAll();}
}

在这个配置类中,我们重写configure(HttpSecurity http)方法来定义哪些路径应该是公开的,哪些需要认证。同时,我们也配置了自定义的登录页面。

3. 用户认证配置

Spring Security需要知道如何加载用户信息。这通常是通过实现UserDetailsService接口并重写loadUserByUsername方法来完成的。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserRepository userRepository; // 假设你有一个用户仓库@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),true, true, true, true, AuthorityUtils.createAuthorityList("USER"));}
}

这个服务组件将用户信息从特定的数据源(例如数据库)加载出来,然后构造一个UserDetails对象返回。

4. 密码编码

为了安全地存储密码,Spring Security推荐使用密码编码器。在你的配置类中,你可以定义一个密码编码器的Bean。

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

然后在你的UserDetailsService实现中使用这个编码器来检查用户提供的密码是否匹配存储的密码。

5. 启用方法级安全性

除了HTTP安全配置外,你还可以启用方法级的安全性,通过在配置类上添加@EnableGlobalMethodSecurity注解并配置相应的属性。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {// 配置细节
}

这样配置后,你就可以在服务层的方法上使用注解来控制访问权限,比如@PreAuthorize

源码解析

在底层,@EnableWebSecurity注解和WebSecurityConfigurerAdapter类是Spring Security配置的核心。@EnableWebSecurity注解会导入WebSecurityConfiguration类,这个类中定义了一系列的Bean,用于构建安全过滤器链。WebSecurityConfigurerAdapter提供了一种便利的方式来定制这个安全过滤器链。

例如,HttpSecurity对象是通过WebSecurityConfigurerAdapterconfigure(HttpSecurity http)方法配置的。这个对象构建了一个安全过滤器链,其中包括了对URL的授权、登录和注销等功能的支持。

通过这些步骤和配置,你就能在Spring应用中成功启用和配置Spring Security了,为应用提供认证和授权保护。

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

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

相关文章

python 五子棋游戏代码

下面是一个简单的五子棋游戏的Python代码示例。这个示例包括了游戏逻辑和用户界面的基本实现&#xff0c;但并不完整&#xff0c;例如没有AI对战功能。 import numpy as np import pygame # 初始化游戏界面 def init_game(): global board, screen, width, height width,…

微信小程序的view的属性值和用法

在微信小程序中&#xff0c;view 是一个基础的视图组件&#xff0c;用于承载其他视图组件或者展示文本、图片等内容。view 组件具有多种属性&#xff0c;用于控制其行为和样式。以下是一些常用的 view 属性及其用法&#xff1a; class / style: 控制视图的样式&#xff0c;可以…

docker部署Minio对象存储及使用

1.拉取镜像 docker pull minio/minio2.创建数据目录 mkdir -p /data/minio/data3.启动容器 docker run -p 39000:9000 -p 39090:9090 \ --name minio \ -d --restartalways \ -e "MINIO_ACCESS_KEYjyadmin" \ -e "MINIO_SECRET_KEYjyzx2023" \ -v /data…

【八股】Hibernate和JPA:理解它们的关系

在Java开发中&#xff0c;持久化框架是至关重要的工具&#xff0c;它们帮助开发者将Java对象与关系数据库中的数据进行映射和管理。Hibernate和JPA&#xff08;Java Persistence API&#xff09;是两个广泛使用的持久化框架。那么&#xff0c;Hibernate和JPA之间到底是什么关系…

沃通CA根证书获数科网维《商用密码根证书授信证明》

近日&#xff0c;沃通CA三款根证书获数科网维《商用密码根证书授信证明》&#xff0c;将列入数科受信根证书列表并预置到数科文档阅读器。这标志着沃通CA国产化适配能力进一步提升&#xff0c;沃通国产文档签名证书与数科国产文档阅读器兼容互认&#xff0c;能够更好地响应政企…

Nginx编译安装,信号,升级nginx

编译安装nginx&#xff1a;前面博客有写编译安装过程 systemctl stop firewalld setenforce 0 mkdir /data cd /data wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ yum -y install make gcc pcre-devel openssl-devel …

揭秘:Java字符串对象的内存分布原理

先来看看下面寄到关于String的真实面试题&#xff0c;看看你废不废&#xff1f; String str1 "Hello"; String str2 "Hello"; String str3 new String("Hello"); String str4 new String("Hello");System.out.println(str1 str2)…

Android 11 Audio strategy配置解析

在启动AudioPolicyService时&#xff0c;通过EngineBase的loadAudioPolicyEngineConfig函数去解析strategy配置。其调用流程如下 接下来就对loadAudioPolicyEngineConfig展开分析 1&#xff0c;解析volume标签 engineConfig::ParsingResult EngineBase::loadAudioPolicyEngine…

Pytorch Lighting 库的学习 mvsplat 的笔记

变量理解&#xff1a; context_image&#xff1a; 表示投影的 refrence image Epipolar Transformer vs Swin Transformer : 不同于 Pixel Splat 使用的是 Epipolar Transformer. MVspalt 使用的是 Swin Transformer&#xff0c; 但是作者在 Code 里面 也使用了 Epipolar Tran…

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…

echarts学习:基本使用和组件封装

前言 我在工作中使用echarts较少&#xff0c;这就导致每次使用时都要从头再来&#xff0c;这让我很头疼。因此我决心编写一系列文章将我参与工作后几次使用echarts所用到的知识记录下来&#xff0c;以便将来可以快速查阅。 一、基本使用 像我一样的新手&#xff0c;想要入门e…

PyCharm中快速搭建Python虚拟环境的指南

在 PyCharm 中创建一个新的 Python 虚拟环境可以帮助你为不同的项目管理不同的依赖包&#xff0c;避免版本冲突。以下是在 PyCharm 中创建虚拟环境的步骤&#xff1a; 打开或创建一个项目: 如果你还没有打开 PyCharm&#xff0c;首先打开它&#xff0c;然后选择“Open”打开一个…

【Java】还有人不懂继承?25 个 Case 包教包会

还有人不懂继承&#xff1f;25 个 Case 包教包会 1.Implement single inheritance2.Implement multilevel inheritance3.Implement hierarchical inheritance4.Override a base class method into a derived class5.Demonstrate the protected access specifier6.Create an Stu…

开发电商系统的技术选型

开发电商系统是一个复杂的任务&#xff0c;需要全面的技术选型来确保系统的稳定性、可扩展性和性能。本文将详细探讨在开发电商系统时涉及的各方面技术选型&#xff0c;包括架构设计、前端技术、后端技术、数据库选择、缓存策略、安全性、支付系统、日志和监控、以及自动化运维…

RN的安卓和iOS打包步骤(软件托管平台推荐)

安卓 官方中文网网址 步骤 1.在项目/android/app下面运行如下终端命令 keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000<

《面试笔记》——MySQL终结篇30

三大范式&#xff1f; 第一范式&#xff1a;字段具有原子性&#xff0c;不可再分&#xff08;字段单一职责&#xff09; 第二范式&#xff1a;满足第一范式&#xff0c;每行应该被唯一区分&#xff0c;加一列存放每行的唯一标识符&#xff0c;称为主键&#xff08;都要依赖主…

10- Redis 键值对数据库是怎么实现的?

在开始将数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型的对象&#xff0c;比如 List 对象&#xf…

Django序列化器中is_valid和validate

今天上班的时候分配了一个任务&#xff0c;是修复前端的一个提示优化&#xff0c;如下图所示&#xff1a; 按照以往的经验我以为可以直接在validate上进行校验&#xff0c;如何抛出一个异常即可 &#xff0c;例如&#xff1a; class CcmSerializer(serializers.ModelSerialize…

体验Photoshop:无需下载,直接在浏览器编辑图片

搜索Photoshop时&#xff0c;映入眼帘的是PS软件下载&#xff0c;自学PS软件需要多长时间&#xff0c;学PS软件有必要报班吗...PS软件的设计功能很多&#xff0c;除了常见的图像处理功能外&#xff0c;还涉及图形、文本、视频、出版等。不管你是平面设计师&#xff0c;UI/UX设计…

字节算法岗二面秒挂,效率真高。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…