Spring Boot Security配置教程

1.简介

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

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

2.默认Security设置

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

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

这将包括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<String> 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<String> 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依赖项来开始设置我们的应用程序:

<dependency>
  <groupId>org.springframework.security.oauth</groupId>
  <artifactId>spring-security-oauth2</artifactId>
</dependency>

此依赖项包括一组能够触发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

(0)

相关推荐

  • Spring Boot2.0使用Spring Security的示例代码

    一.Spring Secutity简介 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案.一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户认证一般要求用户提供用户名和密码.系统通过校验用户名和密码来完成认证过程.用户授权指的是

  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    实现原理 在之前的文章中,我们介绍了普通的帐号密码登录的方式: SpringBoot + Spring Security 基本使用及个性化登录配置. 但是现在还有一种常见的方式,就是直接通过手机短信验证码登录,这里就需要自己来做一些额外的工作了. 对SpringSecurity认证流程详解有一定了解的都知道,在帐号密码认证的过程中,涉及到了以下几个类:UsernamePasswordAuthenticationFilter(用于请求参数获取),UsernamePasswordAuthentica

  • SpringBoot+Spring Security+JWT实现RESTful Api权限控制的方法

    摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能够访问API. 一:开发一个简单的API 在IDEA开发工具中新建一个maven工程,添加对应的依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

  • 详解Spring Boot Security

    简介 Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权. 工作流程 从网上找了一张Spring Security 的工作流程图,如下. 图中标记的MyXXX,就是我们项目中需要配置的. 快速上手 建表 表结构 建表语句 DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `role`; DROP TABLE IF

  • Spring Boot Security 结合 JWT 实现无状态的分布式API接口

    简介 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.JSON Web Token 入门教程 这篇文章可以帮你了解JWT的概念.本文重点讲解Spring Boot 结合 jwt ,来实现前后端分离中,接口的安全调用. Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权. 快速上手 之前的文章已经对 Spring Security 进行

  • Spring Boot整合Spring Security简单实现登入登出从零搭建教程

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

  • SpringBoot结合SpringSecurity实现图形验证码功能

    本文介绍了SpringBoot结合SpringSecurity实现图形验证码功能,分享给大家,具体如下: 生成图形验证码 根据随机数生成图片 将随机数存到Session中 将生成的图片写到接口的响应中 生成图形验证码的过程比较简单,和SpringSecurity也没有什么关系.所以就直接贴出代码了 根据随机数生成图片 /** * 生成图形验证码 * @param request * @return */ private ImageCode generate(ServletWebRequest r

  • Spring Boot Security配置教程

    1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设置 为了增加Spring Boot应用程序的安全性,我们需要添加安全启动器依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • 基于spring boot 的配置参考大全(推荐)

    如下所示: # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # =============================

  • Spring Boot 项目搭建教程及注解

    Spring Boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域成为领导者 特点: 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标,健康检查和外部配置

  • Spring Boot 集成MyBatis 教程详解

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 在集成MyBatis前,我们先配置一个druid数据源. Spring Boot 系列 1.Spring Boot 入门 2.Spring Boot 属性配置

  • 在Linux系统上安装Spring boot应用的教程详解

    Unix/Linux 服务 systemd 服务 操作过程 1. 安装了JDK的centOS7虚拟机 注意下载linux版本JDK的时候不能直接通过wget这种直接链接下载,否则会解压不成功,应该打开原官网,点击同意许可后点击下载(这种方式下载很慢),比较好的方式是复制下载页的地址到迅雷,通过迅雷打开该下载页,同意许可后点击下载. 下载后解压.配置环境变量 tar -zxvf jdk1.8.0_211.jar.gz 环境变量配置:/etc/profile 文件最后添加如下 export JAVA

  • Spring Boot DevTools使用教程

    DevTools通过提供自动重启和LiveReload功能,使您更快.更轻松地开发Spring Boot应用程序.除此之外,它还将各种属性设置为更适合本地开发的值.此外,它允许您远程连接到您的应用程序,并仍然使用其大部分功能.在生产中运行时,不要使用DevTools. 如何使用DevTools进一步加快Spring Boot开发速度?你需要做的就是添加正确的依赖关系,与Spring Boot一样,设置非常简单. 如果您使用Maven: <dependency> <groupId>o

  • spring boot security设置忽略地址不生效的解决

    spring boot security设置忽略地址不生效 最近在试下微服务改造,出现这样一个问题所有请求都经过spring cloud gateway进行认证授权后再访问后端数据方服务,但有些需要合作机构回调,由于进行了security认证,最终的方案是对回调地址进行忽略auth认证. 最终security主要代码如下: @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityCon

  • Spring boot security权限管理集成cas单点登录功能的实现

    目录 1.Springboot集成Springsecurity 2.部署CASserver 3.配置CASclient 挣扎了两周,Spring security的cas终于搞出来了,废话不多说,开篇! 1.Spring boot集成Spring security 本篇是使用spring security集成cas,因此,先得集成spring security新建一个Spring boot项目,加入maven依赖,我这里是用的架构是Spring boot2.0.4+Spring mvc+Spri

随机推荐