本文所介紹的項目是一個基於oath2協議的應用,實現的的功能邏輯與QQ互聯,微博開放平臺相似,都是同一套認證受權流程。java
項目結構簡單易懂,卻不偷工減料,在學習完本文內容後,讀者能夠直接獲取文中的項目代碼用於學習或者copy到公司的生產項目中修改後使用,真正達到學以至用的目的。git
所涉及技術棧:github
本項目包括功能有web
- 用戶註冊自動分配角色權限
- 用戶只能訪問本身所擁有的角色權限訪問路徑
- 用戶能夠申請獲取客戶ID和客戶密鑰
- 用戶能夠經過客戶ID獲取受權碼
- 用戶能夠經過客戶ID和密鑰以及受權碼獲取access token 和referrsh token和scope
- 可自定義配置需受權url
- 可自定義配置受限url的訪問scope
- 未受權用戶或訪問權限不足用戶,頁面提示相信息
- 用戶經過access token 來訪問對應url
首先來看一下項目的結構圖,瞭解項目的大體佈局spring
接下來正式介紹關於項目的細節,因爲項目自己就已經有很多中文註釋,因此在講解的時候會收縮起一些代碼的具體實現,若是讀者不習慣能夠在這裏點在線比對閱讀或者fork到本身的項目裏閱讀==> 項目代碼sql
@EnableWebSecurity
打開了 HttpSecurity 的安全配置,則該類將生效用戶註冊則往用戶表插入數據,同時往用戶角色表也插入一份數據。
固然也能夠設計的更復雜些,好比根據來源、時間、白名單、內部推薦等設置不一樣的權限,讀者可自行擴展。 docker
首先來看一下表結構,oauth_client_details 爲spring cloud oath2自帶的表, user_client_secret 爲咱們本身建立的表 數據庫
具體的實如今spring-security-oauth包中的, 非本項目內的自我實現api
客戶ID獲取受權碼 請求url: http://localhost:8080/oauth/authorize?response_type=code&client_id=client_92&redirect_uri=http://localhost:8080/code安全
具體的實如今spring-security-oauth包中的 org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
類,有興趣的同窗能夠在裏面進行debug調試
用受權碼獲取access_token 請求url: http://localhost:8080/oauth/token?grant_type=authorization_code&code=8fGtOV&client_id=client_92&client_secret=123456&redirect_uri=http://localhost:8080/code&scope=all
# 出現以下相似錯誤標識code失效,從新在獲取受權碼操做便可
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: iq30f9"
}
複製代碼
刷新 accessToken的 請求url: http://localhost:8080/oauth/token?grant_type=refresh_token&refresh_token=4741d043-e202-4de0-ae21-4f5c7ec5626e&client_id=client_1&client_secret=123456
驗證accessToken的 請求url: http://localhost:8080/oauth/check_token?token=1131809b-ee12-4aea-9823-ea4454b96f2d
到了這裏,咱們來看另外一個項目 order-service, 其實取名叫 order-api-resource 比較合適,不過也懶得改了。這個項目的結構與代碼比較稀少,因此學習起來更爲輕鬆。
antMatchers()
和
authenticated()
方法來配置,查看圖中紅框內的內容, 這些都是表明須要攔截驗證的請求路徑url,除了攔截請求外,還能夠指定攔截請求方式,好比訪問
/api/trade/ ,只對 POST 訪問作攔截, GET 請求的訪問一概放行。
access()
方法指定訪問的該 url 須要的 scope,取值爲 oauth_client_details 表中的 scope 值, 若是scope值與代碼中定義的不一致,則會出現以下錯誤:
spring-security-oauth2-2.2.1.RELEASE-sources.jar 中的 RemoteTokenServices.java 用於遠程調用 token 服務(開發平臺)進行操做