一 快速啟動
1 在項目中加入相關的依賴
需要 導入 易水公共組件 和 spring-security-oauth2-autoconfigure
兩個依賴
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.yishuifengxiao.common</groupId>
<artifactId>common-spring-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
2 在項目加入以下代碼
@Configuration
public class CustomOauth2Config extends OAuth2Config{
}
3 加上開啟注解
加上@EnableResourceServer
和 @EnableAuthorizationServer
注解
完全開啟示例代碼如下:
@Configuration
@EnableWebSecurity
@EnableResourceServer
@EnableAuthorizationServer
public class SecurityConfig extends AbstractSecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 調(diào)用父類中的默認配置
applyAuthenticationConfig(http);
}
@Configuration
public class CustomOauth2Config extends OAuth2Config{
}
}
4 實現(xiàn)自定義認證邏輯
實現(xiàn)UserDetailsService
接口 和 UserDetailsService
接口性宏,完成自己的認證邏輯伪节,并將其注入到spring 的上下文中
【特別注意】在用戶未按照此步驟配置自己的授權邏輯時祝峻,組件會默認進行一個缺省實現(xiàn)。在缺省實現(xiàn)的情況下貌夕,用戶能使用任意用戶名配合密碼(12345678)進行登錄
需要特別注意的是,在下面的授權方式之中声诸,UserDetailsService
負責校驗clientId
和clientSecret
是否正確钮科,UserDetailsService
負責校驗username
和password
是否正確。
完成前面的步驟之后奄喂,一個簡單的oauth2認證服務器就搭建完成了之剧。
二 四種授權方式
密碼模式
POST /oauth/token HTTP/1.1
Host: oauth2.yishuifengxiao.com
Authorization: Basic fdsfdsfdsfds
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w
在請求中,各參數(shù)的含義如下
- grant_type:表示授權類型砍聊,此處的值固定為"password",必選項贰军。
- username:表示用戶名玻蝌,必選項蟹肘。
- password:表示用戶的密碼,必選項俯树。
- scope:表示權限范圍帘腹,可選項。
- Authorization: 請求頭參數(shù) 许饿,值是 clientId:clientSecret 經(jīng)過 base64 編碼后的值
下面是一個響應的例子
{
"access_token": "BDF867DE69F05143C709",
"token_type": "bearer",
"refresh_token": "d7cda8fb15714209a9f9f3b039a0034f",
"expires_in": 43199,
"scope": "read write trust",
"client_id": "yishui"
}
客戶端模式
POST /oauth/token HTTP/1.1
Host: oauth2.yishuifengxiao.com
Authorization: Basic fdsfdsfdsfds
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
在本請求中阳欲,各參數(shù)的含義如下
- grant_type:表示授權類型,此處的值固定為"client_credentials"陋率,必選項球化。
- Authorization: 請求頭參數(shù) ,值是 clientId:clientSecret 經(jīng)過 base64 編碼后的值
下面是一個響應的例子
{
"access_token": "BDF867DE69F05143D3BF",
"token_type": "bearer",
"expires_in": 43199,
"scope": "read write trust",
"client_id": "yishui"
}
同密碼模式相比瓦糟,客戶端模式的響應中缺少了
refresh_token
參數(shù)
授權碼模式
授權碼模式首先需要保證 spring security 的登陸功能正惩灿蓿可用。只有開啟 spring security 的登陸功能可用菩浙,才能開啟授權碼功能巢掺。
先訪問一下請求
GET /oauth/authorize?response_type=code&client_id=yishui&state=xyz
&redirect_uri=http://demo.yishuifengxiao.com/demo HTTP/1.1
Host: oauth2.yishuifengxiao.com
在本請求中,各參數(shù)的含義如下:
- code:表示授權碼劲蜻,必選項陆淀。該碼的有效期應該很短,通常設為 10 分鐘先嬉,客戶端只能使用該碼一次轧苫,否則會被授權服務器拒絕。該碼與客戶端 ID 和重定向 URI坝初,是一一對應關系浸剩。
- state:如果客戶端的請求中包含這個參數(shù),認證服務器的回應也必須一模一樣包含這個參數(shù)鳄袍。
- client_id: 用戶的 client_id
在進行此請求時绢要,假如用戶沒有登錄,spring security 會進行攔截拗小,因此需要用戶先進行登錄重罪。
在正常情況下,訪問以上請求會被重定向到
http://demo.yishuifengxiao.com/demo?code=fsfsdf
&state=xyz
服務器回應客戶端的 URI哀九,包含以下參數(shù):
- code:表示授權碼剿配,必選項。該碼的有效期應該很短阅束,通常設為 10 分鐘呼胚,客戶端只能使用該碼一次,否則會被授權服務器拒絕息裸。該碼與客戶端 ID 和重定向 URI蝇更,是一一對應關系沪编。
- state:如果客戶端的請求中包含這個參數(shù),認證服務器的回應也必須一模一樣包含這個參數(shù)年扩。
通過上面的請求得到了code
以后蚁廓,用戶需要使用下面請求獲取到授權碼
POST /oauth/token HTTP/1.1
Host: oauth2.yishuifengxiao.com
Authorization: Basic fdsfdsfdsfds
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=fsfsdf
&redirect_uri=demo.yishuifengxiao.com/demo
在本請求中,各參數(shù)的含義如下:
- grant_type:表示使用的授權模式厨幻,必選項相嵌,此處的值固定為"authorization_code"。
- code:表示上一步獲得的授權碼况脆,必選項饭宾。
- redirect_uri:表示重定向 URI,必選項漠另,且必須與 A 步驟中的該參數(shù)值保持一致捏雌。
- client_id:表示客戶端 ID,必選項笆搓。
簡化模式
GET /oauth/authorize?response_type=token&client_id=yishui&state=xyz
&redirect_uri=http://demo.com/demo HTTP/1.1
Host: server.example.com
在本請求中性湿,各參數(shù)的含義如下:
- response_type:表示授權類型,此處的值固定為"token"满败,必選項肤频。
- client_id:表示客戶端的 ID,必選項算墨。
- redirect_uri:表示重定向的 URI宵荒,可選項。
- scope:表示權限范圍净嘀,可選項报咳。
- state:表示客戶端的當前狀態(tài),可以指定任意值挖藏,認證服務器會原封不動地返回這個值暑刃。
刷新 token
POST /oauth/token HTTP/1.1
Host: oauth2.yishuifengxiao.com
Authorization: Basic fdsfdsfdsfds
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=sdff
請求中個參數(shù)的含義:
- granttype:表示使用的授權模式,此處的值固定為"refreshtoken"膜眠,必選項岩臣。
- refresh_token:表示早前收到的更新令牌,必選項宵膨。
- scope:表示申請的授權范圍架谎,不可以超出上一次申請的范圍,如果省略該參數(shù)辟躏,則表示與上一次一致谷扣。
三 access_token 使用
通過 前面的方法獲取到 access_token 之后,一般有兩種使用方法
- 將 access_token 做為請求參數(shù)攜帶在 url 參數(shù)上
http://demo.yishuifengxiao.com/user/123?access_token=獲得到的access_token
- 將 access_token 做為請求參數(shù)放在請求頭中
在所有需要授權的請求的請求頭里都攜帶上參數(shù)
Authorization=Bearer 獲得到的 access_token
在通用組件中捎琐,由于對access_token
進行了深度處理抑钟,因此用戶可以access_token
通過易水工具包里的 DES 工具飯解析出 token 里攜帶的信息涯曲。
在解密時需要使用的密鑰由【安全管理】中設置的yishuifengxiao.security.secret-key
屬性值決定。
下面是一個 access_token
的解密信息示例
{
"username": "yishui",
"clientId": "admin",
"roles": [
"ROLE_USER",
"admin"
],
"grantType": "password"
}
解密信息的各參數(shù)的解釋:
- username: 用戶登錄時使用到的用戶名(在客戶端模式下該值為空)
- clientId: 用戶登錄時使用的 clientId(在簡化模式下該值為空)
- roles: 此登錄用戶擁有的角色(即此用戶的 authorities)
- grantType:access_token 對應的授權類型
由
access_token
反解析出用戶信息僅限于本組件在塔,原生的 oauth2 的access_token
不支持此功能
資源鏈接
易水公共組件官方文檔地址:http://doc.yishuifengxiao.com
易水公共組件源碼地址:https://gitee.com/zhiyubujian/common-starter
易水風蕭個人博客 http://www.yishuifengxiao.com
相關博客