Spring基础分析13-Spring Security框架

news2024/12/25 3:27:08

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是一个基于Java的企业级应用程序的安全框架,是Spring项目家族的一员。Spring Security提供了全面的安全服务,在身份验证和授权两个核心领域中,为基于Spring的应用程序提供了强有力的保护。它不仅能够保护Web应用程序,还能保护非Web的Java应用程序。

核心概念

  1. 认证(Authentication):确定用户的身份。
  2. 授权(Authorization):决定已经通过认证的用户可以访问哪些资源。
  3. 安全配置(Security Configuration):定义了应用程序如何进行认证和授权。
  4. 过滤器链(Filter Chain):一系列的过滤器用于处理请求,它们可以用来执行各种安全相关的任务。
  5. 权限(Authorities):表示用户的权限,通常与角色关联。
  6. 安全表达式(Security Expressions):提供了一种简单的方法来添加细粒度的访问控制逻辑。

主要特性

  • 声明式安全:通过注解或XML配置文件来定义安全策略。
  • HTTP基本认证、表单登录、OAuth2等支持:多种认证方式的支持。
  • CSRF防护:防止跨站请求伪造攻击。
  • 记住我(Remember-Me):允许用户在关闭浏览器后仍然保持登录状态。
  • 会话管理:包括会话固定防护、并发会话控制等。
  • 密码编码:内置多种加密算法以安全地存储密码。
  • 集成其他安全系统:如LDAP、JDBC、CAS、SAML等。

快速开始指南

快速了解如何使用Spring Security,创建一个简单的Spring Boot应用程序,并为其添加基本的安全配置。

依赖设置

首先,在pom.xml文件中添加Spring Security的依赖:

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

基本配置

创建一个配置类来启用Spring Security的基本保护:

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll() // 允许所有人访问根路径和/home
                .anyRequest().authenticated()         // 所有其他请求都需要认证
                .and()
            .formLogin()
                .loginPage("/login")                  // 自定义登录页面
                .permitAll()                          // 允许任何人访问登录页面
                .and()
            .logout()
                .permitAll();                         // 允许任何人访问登出操作
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user =
             User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}

这段代码设置了几个重要的东西:

  • 定义了哪些URL模式需要认证,哪些不需要。
  • 指定了自定义的登录页面位置。
  • 设置了一个内存中的用户细节服务,包含一个用户名为"user",密码为"password"的用户。

控制器示例

接下来创建一个简单的控制器来测试安全配置:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/user")
    public String user() {
        return "user";
    }
}

这里的每个映射对应于不同的视图模板,需要确保这些模板存在以便正确渲染页面。

高级主题

角色与权限

Spring Security允许通过角色和权限来细化访问控制。角色通常是以ROLE_开头的字符串,例如ROLE_ADMIN。可以在配置中指定哪些角色可以访问特定的URL模式,也可以在方法级别上使用@PreAuthorize、@PostAuthorize等注解来实现更复杂的访问控制逻辑。

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminPage() {
    return "admin";
}

OAuth2 和 OpenID Connect 支持

Spring Security对OAuth2客户端和资源服务器都有良好的支持。对于客户端,可以轻松配置应用程序以使用Google、GitHub等第三方提供商进行登录。对于资源服务器,可以保护API端点并使用访问令牌进行验证。

配置OAuth2登录可能如下所示:

@Bean
public SecurityFilterChain oauth2LoginSecurityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeRequests(authorizeRequests ->
            authorizeRequests.anyRequest().authenticated()
        )
        .oauth2Login(oauth2Login ->
            oauth2Login.loginPage("/login/oauth2/code/github")
        );
    return http.build();
}

CSRF 保护

默认情况下,Spring Security启用了CSRF保护,这对于防止跨站请求伪造攻击非常重要。如果正在构建RESTful API,并且知道所有客户端都支持发送正确的CSRF令牌,那么应该保留这个保护措施。但是,如果的应用需要支持不发送CSRF令牌的客户端,可以通过以下方式禁用CSRF保护:

http.csrf().disable();

请注意,禁用CSRF保护可能会使的应用更容易受到CSRF攻击。

记住我(Remember-Me)

Spring Security也支持“记住我”功能,这可以让用户在关闭浏览器后仍然保持登录状态。要启用此功能,只需在安全配置中添加以下内容:

http.rememberMe().key("uniqueAndSecret");

Spring Security是一个强大的工具,它使得保护基于Spring的应用程序变得相对简单。从基础的认证和授权到高级的主题如OAuth2、OpenID Connect以及细粒度的访问控制,Spring Security几乎涵盖了现代应用程序安全性的各个方面,欢迎大家一起讨论~

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

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

相关文章

华为云计算HCIE笔记02

第二章&#xff1a;华为云Stack规划设计 交付总流程 准备工作&#xff1a;了解客户的基本现场&#xff0c;并且对客户的需求有基本的认知。 HLD方案BOQ报价设备采购和设备上架 2.安装部署流程 硬件架构设计 硬件设备选配 设备上架与初始化配置 准备相关资料&#xff08;自动下载…

WWW23-多行为级联|级联图卷积网络的多行为推荐

论文&#xff1a;https://arxiv.org/abs/2303.15720 代码&#xff1a;https://github.com/SS-00-SS/MBCGCN 这篇论文MB-CGCN和上一篇CRGCN是同一个团队的&#xff0c;都是级联的方式。一个用了残差&#xff0c;一个用了特征转换&#xff0c;文章最后有discussion讨论了两者的不…

【day16】Java开发常用API

模块15回顾 在深入探讨模块16之前&#xff0c;让我们回顾一下【day15】中的重点内容&#xff1a; String类&#xff1a; 构造方法&#xff1a;String(), String(String s), String(char[] chars), String(byte[] bytes), String(char[] chars, int offset, int count), String…

MLU运行Stable Diffusion WebUI Forge【flux】

文章目录 一、平台环境准备二、代码下载三、基础环境准备3.1 支援whl包 四、代码修改4.2 组件下载 六、运行效果 FLUX模型是由Black Forest Labs推出的一款文本生成图像的AI模型&#xff0c;具有120亿参数&#xff0c;显著提升了图像生成的质量和多样性‌。FLUX模型包含三个版本…

PPP - NCP协议

NCP协议是一个很多子协议构成的主要取决于网络层封装的什么协议比如 三层协议NCP协议ipIPCPIPv6IPv6CPMPLSMPLSCP NCP能够协商的内容包括&#xff1a; 1.网络层协议&#xff08;ip&#xff1f;ipv6&#xff1f;MPLS&#xff1f;…&#xff09;  2.协商地址 主要了解使用最多…

< Chrome Extension : TamperMonkey > 去禁用网页的鼠标的事件 (水文)

问题描述 在一个视频网站看视频&#xff0c;在播放视频时&#xff0c; 如果当鼠标移到视频外&#xff0c;只要有点击鼠标的动作&#xff0c;视频就会暂停播放&#xff08;包括 Window 下的 其它 tab&#xff09;。有种被打劫完财物&#xff0c;还被凌辱的感觉。 解决方案 使…

网络安全 | 常见的网络攻击类型及防范技巧全解析

网络安全 | 常见的网络攻击类型及防范技巧全解析 一、前言二、常见网络攻击类型2.1 网络扫描2.2 恶意软件攻击2.3 网络钓鱼2.4 拒绝服务攻击&#xff08;DoS/DDoS&#xff09;2.5 中间人攻击2.6 SQL 注入攻击2.7 跨站脚本攻击&#xff08;XSS&#xff09; 三、防范技巧3.1 网络…

CE第七次作业

1. for创建20用户 用户前缀由用户输入 用户初始密码由用户输入 例如&#xff1a;test01,test10 [rootServer ~]# vim add_user20.sh #!/bin/bash read -p "please input usernames prefix:" name_pre read -p "please input users passwd:" p…

了解反向传播算法

目录 一、说明 二、了解反向传播算法 三、定义神经网络模型 3.1 输入层 3.2 隐藏图层 3.3 输出层 四、前向传播和评估 五、反向传播和计算梯度 六、结束语 一、说明 梯度正向和反向传播&#xff0c;是神经网络的重要概念。其中包含的重要技巧是&#xff1a;1&#xff09;复函数…

实力认可 | 通付盾入选《ISC.AI 2024创新能力全景图谱》五项领域

近日&#xff0c;ISC.AI 2024创新能力百强&#xff08;以下简称“创新百强”&#xff09;正式发布《ISC.AI 2024创新能力全景图谱》。该全景图谱是由政企、资本、高校、行业力量共同完成了领域划分、综合创新等标准的制定&#xff0c;整合梳理了参评的300余家数字安全厂商、120…

Web3.0安全开发实践:9个sCrypt智能合约开发的最佳实践

sCrypt是一种基于TypeScript的嵌入式领域特定语言&#xff08;eDSL&#xff09;&#xff0c;专为在比特币链上编写智能合约而设计。sCrypt智能合约使用比特币支持的操作码&#xff0c;可以编译成Bitcoin Script。由此生成的类似汇编的脚本可用作交易中的锁定脚本。 本文将探讨…

新手SEO指南如何快速入门与提升网站排名

内容概要 搜索引擎优化&#xff08;SEO&#xff09;是提高网站可见度和排名的重要手段&#xff0c;尤其对新手来说&#xff0c;掌握其基本概念和实用技巧至关重要。本文将针对新手提供一系列的指导&#xff0c;帮助你快速入门并逐步提升网站排名。 首先&#xff0c;了解SEO的…

【EthIf-14】EthIfGeneral容器配置-02

1.实际EthIfGeneral的配置实例 关闭DET接口开启发送确认中断开启接收中断主周期接收timeout主周期 2. 代码实例参考 阅读此部分代码,搞清楚代码分为几个section,大概瞄一眼就好,不用深究其含义,只需有一个宏观的层次结构的映像即可。 //Appl/GenData/EthIf_Cfg.h #

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…

Docker 部署 SpringBoot VUE项目

是一套基于若依的wms仓库管理系统 一、后端部署 后端地址&#xff1a;https://gitee.com/zccbbg/wms-ruoyi/tree/v1/ 1、用IDEA拉代码&#xff0c;并修改API统一后缀 2、复制一个配置文件 application-dev.yaml&#xff0c;并修改里面的mysql与redis配置 3、将打包的jar上传…

面试基础篇---迭代器,yield, tcp, 等

1.谈谈python的装饰器&#xff0c;迭代器&#xff0c;yield&#xff1f; 迭代器在内存中通常是一次性遍历的&#xff0c;也就是说&#xff0c;一旦遍历完所有元素&#xff0c;它就会停止工作&#xff0c;不可再用。 惰性计算&#xff1a;生成器按需生成数据&#xff0c;即只有在…

【文档搜索引擎】搜索模块的完整实现

调用索引模块&#xff0c;来完成搜索的核心过程 主要步骤 简化版本的逻辑&#xff1a; 分词&#xff1a;针对用户输入的查询词进行分词&#xff08;用户输入的查询词&#xff0c;可能不是一个词&#xff0c;而是一句话&#xff09;触发&#xff1a;拿着每个分词结果&#xf…

帝国cms灵动标签调用相关文章

帝国cms相关文章调用的方法很多&#xff0c;官方默认调用方法是使用标签 [!--other.link--] 那么内容页调用相关文章&#xff0c;什么时候用到灵动标签呢 答案是调用同类型的文章&#xff0c;比如有相同关键词或者相同tags标签的文章 使用灵动标签是如何调用的呢&#xff0…

低空经济的地理信息支撑:构建安全、高效的飞行管理体系

随着无人机等低空飞行器的广泛应用&#xff0c;低空空域管理的重要性日益凸显。地理信息技术作为低空空域管理的重要支撑&#xff0c;对于保障低空经济的健康发展具有不可替代的作用。 地理信息技术在低空空域管理中的作用 地理信息技术在低空空域管理中扮演着关键角色&#x…

一体式IO模块:打印机加工产线国产化降本增效的新利器

在当今全球化的市场竞争中&#xff0c;打印机制造行业面临着前所未有的挑战与机遇。为了提升生产效率、降低成本&#xff0c;并加速国产化进程&#xff0c;各大打印机制造商纷纷寻求技术创新与升级。明达技术自研推出的MR20一体式IO模块作为工业自动化领域的核心组件&#xff0…