热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

SpringBootSecurity配置教程

在本文里我们给大家分享了关于SpringBootSecurity配置的相关步骤以及注意要点,需要的朋友们跟着操作下。

1.简介

在本文中,我们将了解Spring Boot对spring Security的支持。

简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它。

2.默认Security设置

为了增加Spring Boot应用程序的安全性,我们需要添加安全启动器依赖项:


  org.springframework.boot
  spring-boot-starter-security

这将包括SecurityAutoConfiguration类 - 包含初始/默认安全配置。

注意我们在这里没有指定版本,假设项目已经使用Boot作为父项。

简而言之,默认情况下,为应用程序启用身份验证。此外,内容协商用于确定是否应使用basic或formLogin。

有一些预定义的属性,例如:

spring.security.user.name
spring.security.user.password

如果我们不使用预定义属性spring.security.user.password配置密码并启动应用程序,我们会注意到随机生成默认密码并在控制台日志中打印:

Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6

3.禁用自动配置

要放弃安全性自动配置并添加我们自己的配置,我们需要排除SecurityAutoConfiguration类。

这可以通过简单的排除来完成:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class SpringBootSecurityApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(SpringBootSecurityApplication.class, args);
  }
}

或者通过在application.properties文件中添加一些配置:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

还有一些特殊情况,这种设置还不够。

例如,几乎每个Spring Boot应用程序都在类路径中使用Actuator启动。
这会导致问题,因为另一个自动配置类需要我们刚刚排除的那个,因此应用程序将无法启动。

为了解决这个问题,我们需要排除该类;并且,特定于Actuator情况,我们需要排除

ManagementWebSecurityAutoConfiguration。

3.1. 禁用和超越 Security Auto-Configuration
禁用自动配置和超越它之间存在显着差异。

通过禁用它,就像从头开始添加Spring Security依赖项和整个设置一样。这在以下几种情况下很有用:

将应用程序security与自定义security提供程序集成

将已有security设置的旧Spring应用程序迁移到Spring Boot

但是,大多数情况下我们不需要完全禁用安全自动配置。

Spring Boot的配置方式允许通过添加我们的新/自定义配置类来超越自动配置的安全性。这通常更容易,因为我们只是定制现有的安全设置以满足我们的需求。

4.配置Spring Boot Security
如果我们选择了禁用Security自动配置的路径,我们自然需要提供自己的配置。

正如我们之前讨论过的,这是默认的安全配置;我们可以通过修改属性文件来自定义它。

例如,我们可以通过添加我们自己的密码来覆盖默认密码:

security.user.password=password

如果我们想要一个更灵活的配置,例如多个用户和角色 - 您现在需要使用完整的@Configuration类:

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {
 
  @Override
  protected void configure(AuthenticationManagerBuilder auth)
   throws Exception {
    auth
     .inMemoryAuthentication()
     .withUser("user")
      .password("password")
      .roles("USER")
      .and()
     .withUser("admin")
      .password("admin")
      .roles("USER", "ADMIN");
  }
 
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
     .authorizeRequests()
     .anyRequest()
     .authenticated()
     .and()
     .httpBasic();
  }
}

如果我们禁用默认安全配置,则@EnableWebSecurity注释至关重要。

如果丢失,应用程序将无法启动。只有在我们使用WebSecurityConfigurerAdapter覆盖默认行为时,注释才是可选的。

现在,我们应该通过几个快速实时测试验证我们的安全配置是否正确应用:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvirOnment= RANDOM_PORT)
public class BasicConfigurationIntegrationTest {
 
  TestRestTemplate restTemplate;
  URL base;
  @LocalServerPort int port;
 
  @Before
  public void setUp() throws MalformedURLException {
    restTemplate = new TestRestTemplate("user", "password");
    base = new URL("http://localhost:" + port);
  }
 
  @Test
  public void whenLoggedUserRequestsHomePage_ThenSuccess()
   throws IllegalStateException, IOException {
    ResponseEntity respOnse= restTemplate.getForEntity(base.toString(), String.class);
 
    assertEquals(HttpStatus.OK, response.getStatusCode());
    assertTrue(response
     .getBody()
     .contains("Baeldung"));
  }
 
  @Test
  public void whenUserWithWrongCredentials_thenUnauthorizedPage() 
   throws Exception {
 
    restTemplate = new TestRestTemplate("user", "wrongpassword");
    ResponseEntity respOnse= restTemplate.getForEntity(base.toString(), String.class);
 
    assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
    assertTrue(response
     .getBody()
     .contains("Unauthorized"));
  }
}

实际上,Spring Boot Security的背后是Spring Security,所以任何可以用这个完成的安全配置,或者这个支持的任何集成都可以实现到Spring Boot中。

5. Spring Boot OAuth2自动配置
Spring Boot为OAuth2提供专用的自动配置支持。

在我们开始之前,让我们添加Maven依赖项来开始设置我们的应用程序:


  org.springframework.security.oauth
  spring-security-oauth2

此依赖项包括一组能够触发OAuth2AutoConfiguration类中定义的自动配置机制的类。

现在,我们有多种选择可以继续,具体取决于我们的应用范围。

5.1。 OAuth2授权服务器自动配置
如果我们希望我们的应用程序是OAuth2提供程序,我们可以使用@EnableAuthorizationServer。

在启动时,我们会在日志中注意到自动配置类将为我们的授权服务器生成客户端ID和客户端密钥,当然还有用于基本身份验证的随机密码。

Using default security password: a81cb256-f243-40c0-a585-81ce1b952a98
security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e
security.oauth2.client.client-secret = f1463f8b-0791-46fe-9269-521b86c55b71

这些凭据可用于获取访问令牌:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e:f1463f8b-0791-46fe-9269-521b86c55b71 \
 -d grant_type=client_credentials -d username=user -d password=a81cb256-f243-40c0-a585-81ce1b952a98 \
 -d scope=write http://localhost:8080/oauth/token

5.2。其他Spring Boot OAuth2自动配置设置

Spring Boot OAuth2涵盖了一些其他用例,例如:

资源服务器 - @EnableResourceServer

客户端应用程序 - @ EnableOAuth2Sso或@ EnableOAuth2Client

如果我们需要将我们的应用程序作为上述类型之一,我们只需要为应用程序属性添加一些配置。

6. Spring Boot 2 security与Spring Boot 1 security

与Spring Boot 1相比,Spring Boot 2大大简化了自动配置。

在Spring Boot 2中,如果我们想要自己的安全配置,我们可以简单地添加一个自定义的WebSecurityConfigurerAdapter。这将禁用默认自动配置并启用我们的自定义安全配置。

Spring Boot 2使用Spring Security的大部分默认值。因此,默认情况下,Spring Boot 1中默认不安全的某些端点现在是安全的。

这些端点包括静态资源,如/ css / ,/ js / ,/ images / ,/ webjars / ,//favicon.ico和错误端点。如果我们需要允许对这些端点进行未经身份验证的访问,我们可以明确地配置它**。

为了简化与安全相关的配置,Spring Boot 2删除了以下Spring Boot 1属性:

security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.sessions

7.结论

在本文中,我们重点介绍Spring Boot提供的默认安全配置。我们了解了如何禁用或覆盖安全性自动配置机制以及如何应用新的安全性配置。

附上源码:https://github.com/eugenp/tutorials/tree/master/spring-boot-security


推荐阅读
  • 腾讯云前台面经(笔试+3技术面+HR面)
    话不多说,直接上题。(时间周期太长,可能不太全了)面试周期:从投递简历到收到offer大概经历了一个月左右,所以最好还是不要裸辞,不然心态会裂开。笔试题:(二面、三面后的笔试)1、 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 大家好,我们是慢雾安全团队。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 三周学会小程序第七讲:提交问题
    截止到上一讲可以支持数据库存储了,所以这一讲开始讲解怎么从小程序发布一个问题并存储到服务器端。下面简单罗列一下本讲的知识点。对了老规矩,文末附源码。对小 ... [详细]
  • 一般的网页我的项目能够很容易的实现换肤性能,能够通过js扭转link元素中引入的css主题款式链接。然而微信小程序不能动静扭转wxss文件,所以须要其余的计划来实现。 ... [详细]
  • IntelliJ IDEA 卡成球了?
    在和同事的一次讨论中发现,对IntelliJIDEA内存采用不同的设置方案,会对IDE的速度和响应能力产生不同的影响。Don’tbeaScroogeandgiveyourIDEso ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
author-avatar
cssic_630
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有