Spring Security OpenID 認證集成
1. 前言
在前面的小節(jié)我們介紹了多種認證解決方案,本節(jié)介紹的是一種互聯(lián)網身份共享方案:「OpenID」。
OpenID 從其名稱可看成,是一種開放的身份認證標準。
OpenID 的使用廣泛,Google,WordPress,Yahoo 和 PayPal 等知名公司或組織都是用 OpenID 做用戶身份驗證標準。
Spring Security 提供了集成 OpenID 認證的方法,本節(jié)我們將重點討論如何通過 Spring Security 實現 OpenID 認證集成。
2. OpenID 基本原理
OpenID 是一種去中心化的互聯(lián)網身份認證解決方案。對于使用 OpenID 的網站,用戶可以不需要為該網站設置用戶名密碼,而是使用預先注冊好的 OpenID 身份。
簡單來說,OpenID 是一張可以在各個網站使用的通行證,它實現的目標是注冊一次身份,同時可在多個平臺使用。
OpenID 的身份標識是以 URI 形式體現,每當我們訪問一個支持 OpenID 認證的網站時,該網站會自動將網頁跳轉到 OpenID 認證地址,使用 URI 作為用戶名,并由用戶提供密碼,完成身份認證后,用戶訪問的目標網站便接受了用戶的身份。
更多 OpenID 介紹可訪問的官方文檔。
3. Spring Security 實現方法
3.1 認證集成
在 Spring Security 中,使用 Open ID 作為認證標準的方式非常簡單。Spring Security 提供了集成 Open ID 認證的標簽組件,開發(fā)者只需要在表單登錄的頁面中加入 <openid-logn>
標簽即可,完整代碼如下:
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<openid-login />
</http>
當然,我們首先需要配置好 Open ID 的認證組件(例如:myopenid.com),并且增加用于認證的用戶信息,如:
<user name="https://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />
配置好后,你就可以使用 myopenid.com 網站作為認證服務。
除此之外,我們還可以指定 UserDetailsService
對象,用于配置 OpenID 的 user-service-ref
屬性。注意,此處我們雖然也給用戶對象設置了密碼屬性,但是該用戶對象中,我們僅僅是用來獲取權限的,其密碼在此處并不生效。但我們依然要保障密碼的復雜程度,以保障認證服務的安全。
3.2 屬性交換
Spring Security 支持 Open ID 的屬性交換功能。例如,通過以下配置,我們可以獲取到 Open ID 用戶的郵箱和昵稱屬性:
<openid-login>
<attribute-exchange>
<openid-attribute name="email" type="https://axschema.org/contact/email" required="true"/>
<openid-attribute name="name" type="https://axschema.org/namePerson"/>
</attribute-exchange>
</openid-login>
本例中,每一個 Open ID 的屬性類型值都是 URI 形式,定義在 https://axschema.org/ 中。required
屬性代表該屬性必須從認證中心返回,而屬性的名稱及定義規(guī)范則要和認證服務的定義保持一致。從認證中心返回的屬性可以通過以下形式得到:
OpenIDAuthenticationToken token =
(OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List<OpenIDAttribute> attributes = token.getAttributes();
OpenIDAuthenticationToken
對象從 SecurityContextHolder
對象中獲取。Google,Yahoo 和 MyOpenID 所提供的屬性對象不盡相同。
4. 小結
本小節(jié)主要知識點有:
- OpenID 是一個廣泛應用于互聯(lián)網網站的認證方式;
- OpenID 的作用是提供身份識別的能力;
- OpenID 被一些國際的主流網站支持,比如 Google,Yahoo 和 MyOpenID 等,在國內尚未出現較權威的提供方;
- Spring Security 提供了網站 OpenID 認證集成的功能。
到此我們對一些被廣泛應用的認證授權方案進行了介紹,包括 OAuth2.0、SAML2.0、CAS、JAAS 和 OpenID。下節(jié)我們討論一個可以提升用戶體驗的操作:「記住我」功能的實現。