安全顶部

我刚宣布了新的学习春天安全课程,包括Spring Security 5中新的OAuth2堆栈的完整材料:

>>查看课程

1.介绍

在本文中,我们将看一下春季启动的安全性方法。

简单地说,我们将关注默认的安全配置,以及在需要时如何禁用或自定义它。

进一步阅读:

Spring Security - Security None,过滤无,访问Pilitall

Access =“pilitall”之间的差异,FilterS =“无”,Security = Spring Security中的“无”。

Spring安全表单登录

Spring登录示例 - 如何设置简单的登录表单,基本安全XML配置以及一些更高级的配置技术。

2.默认的安全设置

为了向我们的Spring引导应用程序添加安全性,我们需要添加安全起动器的依赖:

<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-security < / artifactId > < / >的依赖

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

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

简单的说,默认情况下,对应用程序启用了身份验证。此外,内容协商用于确定是否应该使用基本或FormLogin。

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

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

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

使用默认安全密码:C8BE15DE-4488-4490-9DC6-FAB3F91435C6

有关更多默认设置,请参见Spring Boot常用的应用程序属性参考页面。

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启动应用程序都在类路径中使用执行器启动。这将导致问题,因为另一个自动配置类需要我们刚刚排除的那个类,因此应用程序将无法启动。

为了解决这个问题,我们需要排除那个课程;并且,具体到执行器的情况,我们需要排除ManagementWebSecurityAutoConfiguration

3.1。禁用与超越安全自动配置

禁用自动配置和超越自动配置之间有显著的区别。

禁用它,就像从头添加Spring安全依赖项和整个设置一样。这在以下几种情况下是有用的:

  1. 将应用程序安全与自定义安全提供程序集成
  2. 将具有现有安全设置的遗留Spring应用程序迁移到Spring Boot

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

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

4.配置Spring Boot安全性

如果我们选择了禁用安全自动配置的路径,我们自然需要提供自己的配置。

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

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

spring.security.user.password =密码

如果我们想要一个更灵活的配置,例如有多个用户和角色-我们需要充分利用@ configuration类:

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

@bablewebsecurity.如果我们禁用默认的安全配置,注释是至关重要的。

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

同时,注意到我们需要使用PasswordEncoder使用Spring Boot 2时设置密码。有关更多详细信息,请参阅我们的指南Spring Security 5中的默认密码编码器5

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

@runwith(springrunner.class)@springboottest(webenvironment = random_port)public类basicconfigurationIntegrationtest {testRestTemplate RestTemplate;URL基础;@localserverport int port;@Before public void setup()抛出malformedurlexception {resttemplate = new testresttemplate(“用户”,“密码”);Base = New URL(“http:// localhost:”+端口);@Test公共void whenloggedUserRequestShomepage_thensccess()抛出IfleDalStateException,IoException {anallyEntity  response = RestTemplate.getForentity(Base.ToString(),String.Class);assertequals(httpstatus.ok,response.getstatuscode());asserttrue(response.getbody()。包含(“baeldu金宝搏188体育ng”));@Test公共void whenUserwithwrondcredentials_thenUnauthorizedPage()抛出异常{restTemplate =新的测试restTemplate(“用户”,“错误校准”);analesstentity  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有专门的自动配置支持。

春天安全oauth.Spring Boot附带的支持1。x在以后的引导版本中被删除,代替了附带的第一级OAuth支持春天安全5.。我们将在下一节中看到如何使用它。

对于遗留堆栈(使用Spring Security OAuth),首先我们需要添加一个Maven依赖项来开始设置我们的应用程序:

<依赖>  org.springframework.security.oauth   Spring-Security-OAuth2  

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

现在,根据应用程序的范围,我们有多个选择可以继续。

5.1。OAuth2授权服务器自动配置

如果我们想要我们的应用程序成为OAuth2提供者,我们可以使用@EnableAuthorizationServer

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

使用默认安全密码:A81CB256-F243-40C0-A585-81CE1B952A98 Security.oauth2.client.client-id = 39d2835b-1f87- 4a77-9798-e2975f36972e secuity.oauth2.client.client-secret = f1463f8b-0791-46FE-9269-521b86c55b71

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

curl -X POST -u 39d2835b-1f87-4a77- 978-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覆盖的其他一些用例如:

  1. 资源服务器- - - - - -@EnableResourceServer
  2. 客户应用程序- - - - - -@EnableOAuth2Sso或者@EnableOAuth2Client

如果我们需要我们的应用程序是上述类型之一,我们只需要向应用程序属性添加一些配置,如上面的链接所述。

所有OAuth2特定的属性都可以在下面找到Spring Boot常用的应用程序属性

6.Spring Boot OAuth2自动配置(使用新的堆栈)

要使用新堆栈,我们需要根据要配置的内容添加依赖项 - 授权服务器,资源服务器或客户端应用程序。

让我们一个一个地看。

6.1。OAuth2授权服务器支持

正如我们在前一节中看到的,Spring Security OAuth堆栈提供了将授权服务器设置为Spring应用程序的可能性。但是该项目已经被弃用,Spring目前还不支持自己的授权服务器。相反,建议使用现有的完善的提供者,如Okta、Keycloak和Forgerock。

然而,Spring Boot让我们可以很容易地配置这样的提供程序。作为Keycloak配置的一个例子,我们可以引用其中任何一个使用弹簧靴使用keycloak的快速指南或者Keycloak嵌入在Spring Boot应用程序中

6.2。OAuth2资源服务器支持

为了支持资源服务器,我们需要添加以下依赖项:

<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-oauth2-resource-server < / artifactId > < / >的依赖

有关最新版本的信息,请访问Maven中央

此外,在我们的安全配置中,我们需要包括oauth2resourceserver()DSL:

@Configuration public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {@Override protected void configure(HttpSecurity http) throws Exception {http ... .oauth2ResourceServer(oauth2 -> oauth2.jwt());…}}

我们的OAUTH 2.0具有Spring Security 5的资源服务器5提供了对此主题的深度视图。

6.3。OAuth2客户支持

与配置资源服务器的方式类似,客户机应用程序也需要它自己的依赖项和dsl。

以下是OAuth2客户端支持的具体依赖项:

<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-oauth2-client < / artifactId > < / >的依赖

最新的版本可以在下面找到Maven中央

Spring Security 5还通过其提供一流的登录支持oath2Login ()DSL。

有关新堆栈中SSO支持的详细信息,请参阅我们的使用Spring Security OAuth2进行简单的单点登录

7. Spring Boot 2安全性VS Spring Boot 1安全性

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

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

Spring Boot 2使用了Spring Security的大多数默认设置。由于这个原因,一些在Spring Boot 1中默认不受保护的端点现在在默认情况下是受保护的

这些端点包括静态资源,例如/ css / **,/ js / **,/图像/ **,/ webjars / **,/**/favicon.ico和错误端点。如果我们需要允许未经身份验证的访问这些端点,我们可以显式配置。

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

security.basic。授权模式安全。basic.enabled安全。basic.path安全。basic.realm安全。enable-csrf security.headers.cache security.headers。content-security-policy security.headers。content-security-policy-mode security.headers。内容类型安全性。headers.frame安全性。hsts安全性。headers.xss安全性。忽视安全。需要ssl security.sessions

结论

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

OAuth2的源代码可以在我们的OAuth2 GitHub存储库中找到遗产新的堆栈。可以找到其余的代码关于教程GitHub

安全底

我刚宣布了新的学习春天安全课程,包括Spring Security 5中新的OAuth2堆栈的完整材料:

>>查看课程
本文评论关闭!