最近在學習微服務相關的知識及各類框架的使用,在搭建的過程當中,遇到了很多問題,可是都沒有記錄下來,致使過一段時間後,就沒有什麼印象了.. 因此決定在掘金寫文章。 一是爲了記錄本身在寫代碼過程當中的知識點以及解決的問題,方便查閱; 二是爲了能與其它朋友一塊兒討論,能夠吸取不一樣思想及不一樣方案,擴展思路。html
標題之因此爲
Spring Cloud Security
,是由於想要寫Spring Cloud
相關的一系列技術。而Spring Cloud
依賴Springboot
,security
仍是Spring Security
模塊的東西,本質上沒有太大的區別。git
在寫的過程當中,遇到本身不熟悉或沒有把握的概念及知識,會謹慎的求證。也會盡可能保證發佈的任何代碼都是可運行的。 可是因爲本身技術能力有限,不免會有錯誤,包括但不限於
拼寫錯誤
、代碼錯誤
、有代碼潔癖的人看着縮進不舒服
、概念理解有誤差
、代碼不夠優雅
等等,但願各位能夠不吝指教,不喜勿噴~github
microservice
,做爲全部服務的parent
, 同時引入依賴<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<spring.cloud.dependencies.version>Greenwich.RELEASE</spring.cloud.dependencies.version>
<spring-security-oauth2-autoconfigure.version>2.1.5.RELEASE</spring-security-oauth2-autoconfigure.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>${spring-security-oauth2-autoconfigure.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
複製代碼
uaa-service
,做爲認證受權服務,引入依賴<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
</dependencies>
複製代碼
spring-cloud-starter-oauth2
這個依賴應該已經包含了spring security
相關的jar
,可是spring-cloud-dependencies
版本爲Greenwich.RELEASE
時,spring-security-oauth2-autoconfigure
子module中引入的版本一直是2.1.0.M4
,不論是從新import仍是刪除本地maven repository
都無論用, 在官方的issue
中也有人遇到的相同的問題, 因此以上依賴暫時使用單獨引入spring-security-oauth2-autoconfigure
,version
還必須在子module中指定,不知大家是否也碰到這種問題.spring
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
super.configure(security);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client-id")
.secret(passwordEncoder.encode("client-secret"))
.scopes("read", "write")
.authorizedGrantTypes("password", "refresh_token")
.authorities("user:view");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.authenticationManager(authenticationManager)
.tokenStore(tokenStore());
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
複製代碼
@EnableAuthorizationServer
註解告訴Spring
激活authorization server@Configuration
註解的實現了AuthorizationServerConfigurer
接口的類代表這是一個authorization server配置類。AuthorizationServerConfigurerAdapter
是Spring
提供的默認實現AuthorizationServerConfigurer
接口的類,裏面都是空方法authenticationManager
,這是Spring
默認提供的,若是須要使用password
模式,必須顯示地配置endpoints.authenticationManager(authenticationManager)
passwordEncoder
,用於用戶登陸時密碼校驗以及建立用戶時密碼的加密tokenStore
這裏暫時使用InMemoryTokenStore
,Spring
同時也提供了以下幾種存儲token
方式
ClientDetailsServiceConfigurer
是配置authorization server頒發的client的憑證
client.inMemory()
是在內存中存儲client信息withClient
和secret
是client的username
和password
scopes
是受權範圍,例如該client能夠進行讀和寫authorizedGrantTypes
是配置受權方式, 能夠是OAuth2.0
中支持的方式,也能夠是自定義的@Configuration
@EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("admin")
.password(passwordEncoder().encode("password"))
.roles("ADMIN");
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
複製代碼
@EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true)
開啓方法級別權限驗證AuthenticationManagerBuilder
在內存中配置一個用戶,用於password
模式獲取token
BCryptPasswordEncoder
配置加密實現類以上項目啓動完成以後,啓動項目,spring security
會爲咱們提供幾個endpoint
, 其中一個就是獲取token的: /oauth/token
。使用的http請求工具是postman
bash
如上圖所示,輸入以後,會把以前配置的client
的username
和password
的base64
編碼放在http header
中服務器
在http body
中輸入框架
發送請求以後,獲得響應, 其中的access_token
就是咱們後續請求接口使用的令牌maven
以上就是利用spring security
簡單地搭建authorization server, 能夠看到仍是蠻方便的。可是若是是用在生產環境,還遠不夠,例如用戶信息、client信息、token信息的持久化,各類異常的處理,資源服務器的配置等等,在後續的文章也會不斷的完善,感謝!ide