1. 程式人生 > >【OAuth2.0】Spring Security OAuth2.0篇之初識

【OAuth2.0】Spring Security OAuth2.0篇之初識

  • 不吐不快

  因為專案需求開始接觸OAuth2.0授權協議。斷斷續續接觸了有兩週左右的時間。不得不吐槽的,依然是自己的學習習慣問題,總是著急想了解一切,習慣性地鑽牛角尖去理解小的細節,而不是從巨集觀上去掌握,或者說先用起來(少年,一輩子辣麼長,你這麼著急合適嗎?)。好在前人們已經做好了很好的demo,我自己照著抄一抄也就理解了大概如何用,依舊手殘黨,依舊敲不出好程式碼。懺悔…

  • WHAT?

  專案之中實際使用OAuth2.0實現是用的Spring Security OAuth2.0,一套基於Spring Security專案的實現,配合Spring Security配置使用。

  總體來講,自己所理解的這套實現當中,是在Spring Security的基礎之上又增加了幾部分內容:

  • authorization server

這部分配置算是OAuth2.0的核心配置部分。

該配置涉及:

  client details service(第三方client端資訊查詢配置)、

  token service(token查詢操作相關)、

  authorization code service(授權code獲取)、

  user approval handler(使用者授權處理)、

  client端的各種grant_type等等。

同時,這部分內容“內建”了兩個FrameworkEndpoint(和Controller意義相同):AuthorizationEndpoint和TokenEndpoint,分別對應請求/oauth/authorize和/oauth/token。只要在spring配置檔案中開啟MVC配置就能使用並攔截對應

該部分簡單配置:

複製程式碼
 1 <mvc:annotation-driven/>
 2 <mvc:default-servlet-handler/>
 3 
 4 <!-- 1. OAuth2 related config -->
 5 <oauth2:authorization-server client-details-service-ref="clientDetailsService" token-services-ref="tokenServices"
 6                                 user-approval-handler-ref
="oauthUserApprovalHandler" 7 user-approval-page="oauth_approval" 8 error-page="oauth_error"> 9 <oauth2:authorization-code authorization-code-services-ref="authorizationCodeServices" /> 10 <oauth2:implicit/> 11 <oauth2:refresh-token/> 12 <oauth2:client-credentials/> 13 <oauth2:password/> 14 </oauth2:authorization-server> 15 16 <!-- 1.1 client detail service --> 17 <beans:bean id="clientDetailsService" class="com.cyou.nad.bet.oauth.service.impl.CustomJdbcClientDetailsServiceImpl"> 18 <beans:constructor-arg index="0" ref="platform_dataSource"/> 19 </beans:bean> 20 21 <!-- 1.2 Config token services--> 22 <beans:bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices"> 23 <beans:property name="tokenStore" ref="tokenStore"/> 24 <beans:property name="supportRefreshToken" value="true"/> 25 </beans:bean> 26 <beans:bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.JdbcTokenStore"> 27 <beans:constructor-arg index="0" ref="platform_dataSource"/> 28 </beans:bean> 29 30 <!-- 1.3 oauthUserApprovalHandler --> 31 <beans:bean id="oauthUserApprovalHandler" class="com.cyou.nad.bet.oauth.approval.SimpleTokenServiceUserApprovalHandler"> 32 <beans:property name="tokenServices" ref="tokenServices"/> 33 <beans:property name="oauthClientDetailsService" ref="oauthClientDetailsService"/><!-- FIXME 考慮直接使用clientDetailService --> 34 </beans:bean> 35 36 <!-- 1.4 authorization code creator --> 37 <beans:bean id="authorizationCodeServices" class="org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices"> 38 <beans:constructor-arg index="0" ref="platform_dataSource"/> 39 </beans:bean>
複製程式碼
  • 第三方client配置

在spring的這套實現當中,在第三方client端也有自己單獨的id、secret和許可權,所以從某種程度上來講,其實client端相當於是一種特殊的user了。

以前使用Spring Security配置user許可權校驗的時候,會配置authentication-manager,使用DB的話,還需要提供userService用於查詢DB獲取使用者資訊。

這裡在配置OAuth的時候,client端也有類似配置,同樣需要配置authentication-manager並指定clientDetailService。

實際後續瞭解更多之後,發現實際校驗時,二者封裝成的都是類UserDetails的例項

用於client端校驗的AuthenticationManager配置:

複製程式碼
1 <authentication-manager id="oauth2ProviderManager">
2     <authentication-provider user-service-ref="oauth2ClientDetailsUserService"/>
3 </authentication-manager>
4 <beans:bean id="oauth2ClientDetailsUserService"
5             class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
6     <beans:constructor-arg ref="clientDetailsService"/>
7 </beans:bean>
複製程式碼
  • resource custom filter

在spring oauth2.0的配置當中,可以單獨配置resource-server,指定特定的resource-id。

這個resource-server的用處在於,之後會作為一個custom-filter加到Spring Security Filter Chain當中的。當第三方client嘗試訪問受限資源時,該filter會對client資訊和其攜帶過來的access_token進行校驗,校驗通過之後才能拿到資源。

resource配置:

1 <oauth2:resource-server id="userResourceServerFilter" resource-id="user" token-services-ref="tokenServices"/>

    後續作為custom-filter新增到http配置中:

複製程式碼
1 <http pattern="/oauth/userInfo*" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint"
2       access-decision-manager-ref="oauth2AccessDecisionManager">
3     <anonymous enabled="false"/>
4     <!-- 獲取使用者資訊 -->
5     <intercept-url pattern="/oauth/userInfo*" access="ROLE_UNITY,scope=READ"/>
6     <custom-filter ref="userResourceServerFilter" before="PRE_AUTH_FILTER"/>
7     <access-denied-handler ref="oauth2AccessDeniedHandler"/>
8 </http>
複製程式碼

另外需要一提的就是,OAuth2.0當中還有一個SCOPE的概念,相當於使用者對client授權訪問自己擁有的某一資源時,可以指定其範圍,比如read(只讀), write(可寫),或者get_user_info(獲取使用者資訊), share(分享)等等。一開始沒有很好的理解,後來看到別的專案的配置,感覺可以這樣想:如果resource對應的是工程的Controller的話,那麼scope可以理解為Controller當中的方法,類似於user.getUserInfo()或者user.addShare()等。配置參考:https://github.com/cloudfoundry/uaa/blob/master/samples/api/src/main/webapp/WEB-INF/spring-servlet.xml

新增scope之後,在<http>配置的AccessDecisionManager中就需要新增用於oauth2.0 scope校驗相關的voter了:

複製程式碼
<beans:bean id="oauth2AccessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
    <beans:constructor-arg>
        <beans:list>
            <beans:bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter">
                <beans:property name="scopePrefix" value="scope="></beans:property>
            </beans:bean>
            <beans:bean class="org.springframework.security.access.vote.RoleVoter"/>
            <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
        </beans:list>
    </beans:constructor-arg>
</beans:bean>
複製程式碼

  關於Spring這套實現的配置,前輩們分享的已經很多了,基本都是類似的配置。後續主要整理對於整體流程和諸如code或token的生成和儲存規則相關的東西,最最重要的,還是要把使用過程中遇到的各種問題記錄下來才是。

轉載地址:

http://www.cnblogs.com/tinkerz/p/3759796.html

相關推薦

OAuth2.0Spring Security OAuth2.0初識

不吐不快   因為專案需求開始接觸OAuth2.0授權協議。斷斷續續接觸了有兩週左右的時間。不得不吐槽的,依然是自己的學習習慣問題,總是著急想了解一切,習慣性地鑽牛角尖去理解小的細節,而不是從巨集觀上去掌握,或者說先用起來(少年,一輩子辣麼長,你這麼著急合適嗎?

Oauth2.0Spring-security-oauth2 非常簡單

上週,我想開發OAuth 2.0的一個例項。我檢查了Spring-security-Oauth2.0的樣例,OAuth 2提供商sparklr2和OAuth 2客戶端TONR 。我探索在網際網路上了一下,整理相關文件。編譯並運行了OAuth 2提供商sparklr2和

新手須知Spring Boot 2.0.0 + MyBatis + Shiro + Swagger 開發專案踩坑記錄

寫在前面 Swagger 2.8.0 Spring Boot 2.0.0.RELEASE Shiro 1.4.0 Mybatis 1.3.1 填坑 踩坑一: MyBatis xml檔案

開源專案Spring Security三大許可權框架案例講解01—專案初始化

GitHub 前言 大致簡介專案主要逐步迭代講解Spring Security + Spring Social + Spring Security OAuth + REST服務開發,通過實際的案例開發來講解,專案註解詳細適合作為教程案例,同時對程式碼的演進還有重構

一文帶你瞭解 OAuth2 協議與 Spring Security OAuth2 整合!

OAuth 2.0 允許第三方應用程式訪問受限的HTTP資源的授權協議,像平常大家使用Github、Google賬號來登陸其他系統時使用的就是 OAuth 2.0 授權框架,下圖就是使用Github賬號登陸Coding系統的授權頁面圖: 類似使用 OAuth 2.0 授權的還有很多,本文將介紹 OAuth

OAuth2.0學習(4-1)Spring Security OAuth2.0 - 代碼分析

endpoint manager authent work cor tro 過程 pro efi 1、org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter

spring security oauth2.0 實現

規範 ppi basic final pre 代碼 處理 state 三方  oauth應該屬於security的一部分。關於oauth的的相關知識可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.htm

spring-security-oauth2(九) OAuth 2.0協議及SpringSocial簡介

從本篇起,我們將利用SpringSocial進行第三方登入開發,它其實利用的是OAuth 2.0協議,所以有必要先了解下。 對OAuth 2.0協議還不太清楚的同學可以先看看下面這2篇文章, 阮一峰大神的理解OAuth 2.0 https://www.cnblogs.com/Wddpct

spring security oauth2.0配置詳解

spring security oauth2.0 實現 目標 現在很多系統都支援第三方賬號密碼等登陸我們自己的系統,例如:我們經常會看到,一些系統使用微信賬號,微博賬號、QQ賬號等登陸自己的系統,我們現在就是要模擬這種登陸的方式,很多大的公司已經實現了這

Spring security oauth2.0簡介

Spring security OAuth2.0簡介 在開始之前,特別強調一下OAuth和SSO的區別: OAuth主要用來解決系統和系統間的身份認證問題,比如A、B、C三個獨立部署的微服務系統均以REST對外提供服務,現在為A系統增加一些限制

Spring Security OAuth2筆記系列- 使用Spring MVC開發RESTful API 使用swagger自動生成html文件

使用swagger自動生成html文件 本節內容 使用swagger自動生成html文件 使用WireMock快速偽造restful服務 前後分離並行開發的時候(當然不是一個人從前到後都幹那種);那麼提供文件就很有必要了。 光看文件不是那麼的直觀。偽

Spring Security OAuth2筆記系列- Spring Social第三方登入

QQ登入 上一章節完成了 ServiceProvider的功能,這一節完成應用內部的需要做的一些功能 注意看這個官網文件: https://docs.spring.io/spring-social/docs/1.1.x/ 由於在spring-bo

Spring Security OAuth2.0 - AuthorizationServer和ResourceServer分離

class token osi service run cli demo sse web 《Spring Security實現OAuth2.0授權服務 - 基礎版》和《Spring Security實現OAuth2.0授權服務 - 進階版》兩篇文章中介紹如何搭建OAu

基於spring boot2.0+spring security +oauth2.0+ jwt微服務架構

ros emp 服務 應用程序 ken res load uri 提高 github地址:https://github.com/hankuikuide/microservice-spring-security-oauth2# 項目介紹該項目是一個演示項目,主要演示了,基於s

spring security OAuth2.0客戶端Client的實現

ner hub context uestc tap tde val pos ise 項目代碼:https://github.com/hankuikuide/microservice-spring-security-oauth2 網上多數的項目客戶端都是采用純js寫,或用p

SpringSecurityOAuth2原始碼分析@EnableOAuth2Sso在Spring Security OAuth2 SSO單點登入場景下的作用

目錄 一、從Spring Security OAuth2官方文件瞭解@EnableOAuth2Sso作用 二、原始碼分析@EnableOAuth2Sso作用 @EnableOAuth2Client OAuth

Spring Security OAuth2.0認證授權一:框架搭建和認證測試

## 一、OAuth2.0介紹 OAuth(開放授權)是一個開放標準,**允許使用者授權第三方應用訪問他們儲存在另外的服務提供者上的資訊,而不 需要將使用者名稱和密碼提供給第三方應用或分享他們資料的所有內容**。 ### 1.stackoverflow和github 聽起來挺拗口,不如舉個例子說明下,就

Spring Security OAuth2.0認證授權二:搭建資源服務

在上一篇文章[Spring Security OAuth2.0認證授權一:框架搭建和認證測試](https://www.cnblogs.com/kuangdaoyizhimei/p/14250374.html) 詳細講解了如何搭建一個基於spring boot + oauth2.0的認證服務,這篇文章將會介紹

Spring Security OAuth2.0認證授權四:分散式系統認證授權

Spring Security OAuth2.0認證授權系列文章 > [Spring Security OAuth2.0認證授權一:框架搭建和認證測試](https://blog.kdyzm.cn/post/24) > [Spring Security OAuth2.0認證授權二:搭建資源服務](h

Spring Security OAuth2.0認證授權五:使用者資訊擴充套件到jwt

歷史文章 > [Spring Security OAuth2.0認證授權一:框架搭建和認證測試](https://blog.kdyzm.cn/post/24) > [Spring Security OAuth2.0認證授權二:搭建資源服務](https://blog.kdyzm.cn/post/25)