在本文中,咱們將瞭解Spring Boot對spring Security的支持。css
簡而言之,咱們將專一於默認Security配置以及如何在須要時禁用或自定義它。git
爲了增長Spring Boot應用程序的安全性,咱們須要添加安全啓動器依賴項:github
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
這將包括SecurityAutoConfiguration類 - 包含初始/默認安全配置。web
注意咱們在這裏沒有指定版本,假設項目已經使用Boot做爲父項。spring
簡而言之,默認狀況下,爲應用程序啓用身份驗證。此外,內容協商用於肯定是否應使用basic或formLogin。安全
有一些預約義的屬性,例如:服務器
spring.security.user.name spring.security.user.password
若是咱們不使用預約義屬性spring.security.user.password配置密碼並啓動應用程序,咱們會注意到隨機生成默認密碼並在控制檯日誌中打印:session
Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6
要放棄安全性自動配置並添加咱們本身的配置,咱們須要排除SecurityAutoConfiguration類。app
這能夠經過簡單的排除來完成:curl
@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。
禁用自動配置和超越它之間存在顯着差別。
經過禁用它,就像從頭開始添加Spring Security依賴項和整個設置同樣。這在如下幾種狀況下頗有用:
可是,大多數狀況下咱們不須要徹底禁用安全自動配置。
Spring Boot的配置方式容許經過添加咱們的新/自定義配置類來超越自動配置的安全性。這一般更容易,由於咱們只是定製現有的安全設置以知足咱們的需求。
若是咱們選擇了禁用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中。
Spring Boot爲OAuth2提供專用的自動配置支持。
在我們開始以前,讓咱們添加Maven依賴項來開始設置咱們的應用程序:
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </dependency>
此依賴項包括一組可以觸發OAuth2AutoConfiguration類中定義的自動配置機制的類。
如今,咱們有多種選擇能夠繼續,具體取決於咱們的應用範圍。
若是咱們但願咱們的應用程序是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
Spring Boot OAuth2涵蓋了一些其餘用例,例如:
若是咱們須要將我們的應用程序做爲上述類型之一,咱們只須要爲應用程序屬性添加一些配置。
與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
在本文中,咱們重點介紹Spring Boot提供的默認安全配置。咱們瞭解瞭如何禁用或覆蓋安全性自動配置機制以及如何應用新的安全性配置。
源代碼能夠在Github上找到。