前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot 集成 Spring Security

Spring Boot 集成 Spring Security

作者头像
阿宝哥
发布于 2019-11-07 12:06:58
发布于 2019-11-07 12:06:58
3.1K00
代码可运行
举报
文章被收录于专栏:全栈修仙之路全栈修仙之路
运行总次数:0
代码可运行

一、Spring Security 简介

Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC(Inversion of Control 控制反转),DI(Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

Spring Security 对 Web 安全性的支持大量地依赖于 Servlet 过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security 提供有若干个过滤器,它们能够拦截 Servlet 请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。用户可以根据自己的需要,使用适当的过滤器来保护自己的应用程序。

二、集成 Spring Security

本项目所使用的开发环境及主要框架版本:

  • java version “1.8.0_144”
  • spring boot 2.2.0.RELEASE
  • spring security 5.2.0.RELEASE

首先新建一个 Spring Boot 项目,然后在根目录下的 pom.xml 文件中引入 spring-boot-starter-security 坐标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

接下来我们来定义一个 HomeController 并实现一个 home 方法,对外提供一个 /home 接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class HomeController {

    @GetMapping("home")
    public String home() {
        return "This is home page";
    }
}

之后我们直接启动 Spring Boot 项目,然后打开浏览器访问 http://localhost:8080/home,如果不出我所料的话,在当前页面你会看到以下内容:

这是什么情况,你明明访问的是 http://localhost:8080/home,怎么突然变成http://localhost:8080/login,期望的访问路径被系统自动重定向到了登录页,而且还让你输入用户名和密码。相信此时对于刚入门的小伙伴来说,肯定一脸懵逼。

小伙伴们,这里我只能告诉你们用户名,密码还得靠你们自己来发掘。Spring Security 会为我们创建一个默认的用户,对应的用户名是 user,而密码可以从控制台中获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UserDetailsServiceAutoConfiguration : 
Using generated security password: 14186562-e682-4744-a6a6-02b5f7c3fb19

注意:每次重新启动 Spring Boot 项目时,都会生成一个随机的新密码。

下面我们在登录页面输入正确的用户名和密码后,再重新访问 http://localhost:8080/home地址时,在当前页面你会看到以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
This is home page

三、自定义用户名和密码

前面我们已经介绍过了,每次重新启动 Spring Boot 项目时,都会生成一个随机的新密码。这在实际项目开发过程中是很另人抓狂的一件事,而针对这个问题 Spring Security 也为我们提供了对应的解决方案,即通过系统默认的配置文件来设置用户名和密码。

下面我们来简单介绍一下如何操作,首先打开项目中的 application.properties 文件,输入以下配置信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设置Spring Security默认的用户名和密码
spring.security.user.name=semlinker
spring.security.user.password=123456

在输入完成之后,重新启动一下项目,待项目启动完成之后,就可以访问 http://localhost:8080/login 地址验证上述的配置是否生效,小伙伴们可以自行验证一下。除了设置用户和密码之外,我们还可以设置默认用户的角色,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设置Spring Security默认的用户名、密码和角色
spring.security.user.name=semlinker
spring.security.user.password=123456
spring.security.user.roles=admin

Spring Security 是一款灵活、功能强大的安全框架。为了实现灵活性,它为框架的使用者提供了非常多的配置属性,本节我们已经介绍了以下 3 个配置属性:

Key

Default Value

Description

spring.security.user.name

user

默认用户名

spring.security.user.password

默认密码

spring.security.user.roles

默认角色

如果你对其它的配置属性感兴趣,可以访问 SpringBoot官网 - security-properties 查看所有支持的属性。

四、默认的登录页

4.1 默认登录页与登录请求

前面我们已经介绍了如何在 Spring Boot 项目中快速集成 Spring Security,之后我们介绍了如何从控制台获取默认的登录密码。除此之外,我们还进一步介绍了如何通过系统配置文件修改默认的用户名和密码。最后我们来简单分析一下系统默认的登录页。

当我们在默认登录页输入已知的用户名和密码,点击 Sign in 按钮后,将会发起一个登录请求,具体请求信息如下图所示:

通过观察上图我们可知,在执行登录操作时,会以 POST 方式请求 http://localhost:8080/login 地址,我们在界面中所输入的用户名和密码会以 Form Data 的形式提交到服务器。眼力好的小伙伴,估计也发现了除了 usernamepassword 之外,还多了一个 _csrf 属性,这个属性是哪里来的呢?

要揭开这个问题的谜底,我们来看一下登录页中登录表单对应的 HTML 源代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form class="form-signin" method="post" action="/login">
    <h2 class="form-signin-heading">Please sign in</h2>
    <p>
       <label for="username" class="sr-only">Username</label>
       <input type="text" id="username" name="username" class="form-control" 
            placeholder="Username" required="" autofocus="">
    </p>
    <p>
       <label for="password" class="sr-only">Password</label>
       <input type="password" id="password" name="password" class="form-control" 
            placeholder="Password" required="">
    </p>
    <input name="_csrf" type="hidden" value="e0c83d21-e72f-4693-95ad-60ac3b71a010">
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>

Sign in 登录按钮上面,多了一个隐藏域,它的 name 就是 Form Data 中的 _csrf,而 value 值与 Form Data 中的值一模一样。其中 _csrf 的属性名可不是随便起的,而是有它实际的含义。CSRF 是 Cross-site request forgery 的缩写,对应的中文意思是跨站请求伪造。它也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

4.2 跨站请求伪造
4.2.1 攻击的细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了 Web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

例子

假如一家银行用以运行转账操作的 URL 地址如下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那么,一个恶意攻击者可以在另一个网站上放置如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">

如果有账户名为 Alice 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000 资金。

这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险

透过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作

4.2.2 防御措施
  1. 检查 Referer 字段

HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer 字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer 字段地址通常应该是转账按钮所在的网页地址,应该也位于 www.examplebank.com 之下。而如果是 CSRF 攻击传来的请求,Referer 字段会是包含恶意网址的地址,不会位于 www.examplebank.com 之下,这时候服务器就能识别出恶意的访问。

这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 http 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。

  1. 添加校验 Token

由于 CSRF 的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行 CSRF 攻击。

这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过 CSRF 传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验 token的值为空或者错误,拒绝这个可疑请求。

了解完 CSRF(跨站请求伪造)相关的攻击细节和防御措施之后,相信小伙伴们也搞清楚登录表单中 _csrf 隐藏域的作用了。至此为止,本文的主要内容都已经介绍完了,后续本人还会继续发布 Spring Security 相关文章,感兴趣的小伙伴请继续关注本人的 Spring Security 专题哟。

五、参考资源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Security 简单了解使用
Spring Security 是一个基于 Spring 框架的安全框架,提供了一套安全性认证和授权的解决方案,用于保护 Web 应用程序和服务。
Jimmy_is_jimmy
2023/08/02
2920
Spring Security 简单了解使用
Security安全认证 | Spring Boot如何集成Security实现安全认证
前面介绍了Spring Boot 使用JWT实现Token验证,其实Spring Boot 有完整的安全认证框架:Spring Security。接下来我们介绍如何集成Security 实现安全验证。
架构师精进
2023/03/23
1.2K0
Security安全认证 | Spring Boot如何集成Security实现安全认证
【SpringSecurity系列(十八)】SpringBoot 如何防御 CSRF 攻击?
《深入浅出Spring Security》一书已由清华大学出版社正式出版发行,感兴趣的小伙伴戳这里->->>深入浅出Spring Security,一本书学会 Spring Security。
江南一点雨
2021/06/09
2K0
Spring Security入门案例
IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。主要包含如下几个重要的内容:
ruochen
2021/11/25
1.3K0
手把手带你入门 Spring Security!
Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。
江南一点雨
2019/07/31
5130
手把手带你入门 Spring Security!
Spring Boot 中如何实现 HTTP 认证?
松哥给最近连载的 Spring Security 系列也录制了视频教程,感兴趣的小伙伴请戳这里->Spring Boot+Vue+微人事视频教程(Spring Boot 第十章就是 Spring Security)。
江南一点雨
2020/06/17
1.2K0
重学SpringBoot3-集成Spring Security(三)
在现代应用开发中,安全性是不可忽视的核心问题。无论是小型应用,还是大型分布式系统,应用都需要防范来自网络的潜在攻击。Spring Boot 3 与 Spring Security 提供了一系列功能来帮助开发者构建安全、健壮的应用,尤其是在防范常见漏洞攻击方面。本文将讨论如何在 Spring Boot 3 中利用 Spring Security 来防范几类常见的漏洞攻击。
CoderJia
2024/10/18
4460
重学SpringBoot3-集成Spring Security(三)
Spring Boot 3 集成 Spring Security(1)认证
Spring Security 是一个强大、灵活的安全框架,广泛用于保护 Java 应用程序。随着 Spring Boot 3 和 Java 17 的引入,Spring Security 继续增强其功能,为开发者提供了更简化的配置和现代化的安全实践。
Harry技术
2025/01/11
1870
Spring Boot 3 集成 Spring Security(1)认证
什么是Spring Security?具有哪些功能?
本篇将带你快速了解什么是Spring Security,通过入门案例以及相关原理和类的分析让你快速入门。
reload
2024/04/16
4711
什么是Spring Security?具有哪些功能?
Spring Security---详解登录步骤
首先新建一个 Spring Boot 项目,创建时引入 Spring Security 依赖和 web 依赖,如下图:
大忽悠爱学习
2021/12/07
2.2K0
Spring Security---详解登录步骤
松哥手把手带你入门 Spring Security,别再问密码怎么解密了
无论如何我也得写一篇文章,带大家入门 Spring Security!当我们在一个项目中引入 Spring Security 相关依赖后,默认的就是表单登录,因此我们就从表单登录开始讲起。
江南一点雨
2020/03/27
1.1K0
Spring Security安全
如果添加了Spring Security的依赖,那么web应用默认对所有的HTTP路径(也称为终点,端点,表示API的具体网址)使用’basic’认证。为了给web应用添加方法级别(method-level)的保护,可以添加@EnableGlobalMethodSecurity并使用想要的设置。
关忆北.
2020/10/15
7740
【SpringSecurity系列(二十九)】Spring Security 实现 Http Basic 认证
Http Basic 认证是 Web 服务器和客户端之间进行认证的一种方式,最初是在 HTTP1.0 规范(RFC 1945)中定义,后续的有关安全的信息可以在 HTTP 1.1 规范(RFC 2616)和 HTTP 认证规范(RFC 2617)中找到。
江南一点雨
2021/08/06
2.2K0
【SpringSecurity系列(二十九)】Spring Security 实现 Http Basic 认证
实战 | 从零学习CSRF漏洞并配合实战挖掘CSRF漏洞
跨站请求伪造(英语:Cross-siterequest forgery),也被称为one-clickattack或者session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
Power7089
2019/07/25
1.8K0
实战 | 从零学习CSRF漏洞并配合实战挖掘CSRF漏洞
常见Web攻击技术
跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript
憧憬博客
2020/11/23
8740
Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security、Apache Shiro 等。本文主要简单介绍一下 Spring Security,再通过 Spring Boot 集成开一个简单的示例。
朝雾轻寒
2019/12/04
1.1K0
Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
spring boot 2.0以上为Eureka添加用户认证-查看Eureka的元数据
Eureka Server(注册中心)是运行匿名访问的,本节为了安全,添加一个需要登陆才能访问的功能。同时在spring boot 2.0版本可以查看元数据。
jiankang666
2022/05/12
8290
spring boot 2.0以上为Eureka添加用户认证-查看Eureka的元数据
Spring Security的CORS与CSRF(三)
在之前的文章[Spring Boot或Spring MVC前后端分离的项目跨域问题的解决方案]已经介绍过跨域以及跨域的解决方案。
Java技术债务
2022/08/09
1.4K0
Spring Security的CORS与CSRF(三)
Spring Security 上
FilterSecurityInterceptor:是一个方法级的 权限过滤器 ,基本位于过滤链的最底部
张小驰出没
2021/05/08
6610
Spring Security  上
Spring Security 自定义用户认证
在 Spring Boot 集成 Spring Security 这篇文章中,我们介绍了如何在 Spring Boot 项目中快速集成 Spring Security,同时也介绍了如何更改系统默认生成的用户名和密码。接下来本文将基于 Spring Boot 集成 Spring Security 这篇文章中所创建的项目,进一步介绍在 Spring Security 中如何实现自定义用户认证。
阿宝哥
2019/11/15
1.4K0
推荐阅读
相关推荐
Spring Security 简单了解使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验