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<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 依赖项来开始设置我们的应用程序:
- 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 提供的默认安全配置. 我们了解了如何禁用或覆盖安全性自动配置机制以及如何应用新的安全性配置.
源代码可以在 GitHub 上找到.
来源: http://www.bubuko.com/infodetail-3071916.html