第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring Security OpenID 認(rèn)證集成

1. 前言

在前面的小節(jié)我們介紹了多種認(rèn)證解決方案,本節(jié)介紹的是一種互聯(lián)網(wǎng)身份共享方案:「OpenID」。

OpenID 從其名稱可看成,是一種開放的身份認(rèn)證標(biāo)準(zhǔn)。

OpenID 的使用廣泛,Google,WordPress,Yahoo 和 PayPal 等知名公司或組織都是用 OpenID 做用戶身份驗證標(biāo)準(zhǔn)。

Spring Security 提供了集成 OpenID 認(rèn)證的方法,本節(jié)我們將重點討論如何通過 Spring Security 實現(xiàn) OpenID 認(rèn)證集成。

2. OpenID 基本原理

OpenID 是一種去中心化的互聯(lián)網(wǎng)身份認(rèn)證解決方案。對于使用 OpenID 的網(wǎng)站,用戶可以不需要為該網(wǎng)站設(shè)置用戶名密碼,而是使用預(yù)先注冊好的 OpenID 身份。

簡單來說,OpenID 是一張可以在各個網(wǎng)站使用的通行證,它實現(xiàn)的目標(biāo)是注冊一次身份,同時可在多個平臺使用。

OpenID 的身份標(biāo)識是以 URI 形式體現(xiàn),每當(dāng)我們訪問一個支持 OpenID 認(rèn)證的網(wǎng)站時,該網(wǎng)站會自動將網(wǎng)頁跳轉(zhuǎn)到 OpenID 認(rèn)證地址,使用 URI 作為用戶名,并由用戶提供密碼,完成身份認(rèn)證后,用戶訪問的目標(biāo)網(wǎng)站便接受了用戶的身份。

圖片描述

更多 OpenID 介紹可訪問的官方文檔。

3. Spring Security 實現(xiàn)方法

3.1 認(rèn)證集成

在 Spring Security 中,使用 Open ID 作為認(rèn)證標(biāo)準(zhǔn)的方式非常簡單。Spring Security 提供了集成 Open ID 認(rèn)證的標(biāo)簽組件,開發(fā)者只需要在表單登錄的頁面中加入 <openid-logn> 標(biāo)簽即可,完整代碼如下:

<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<openid-login />
</http>

當(dāng)然,我們首先需要配置好 Open ID 的認(rèn)證組件(例如:myopenid.com),并且增加用于認(rèn)證的用戶信息,如:

<user name="https://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />

配置好后,你就可以使用 myopenid.com 網(wǎng)站作為認(rèn)證服務(wù)。

除此之外,我們還可以指定 UserDetailsService 對象,用于配置 OpenID 的 user-service-ref 屬性。注意,此處我們雖然也給用戶對象設(shè)置了密碼屬性,但是該用戶對象中,我們僅僅是用來獲取權(quán)限的,其密碼在此處并不生效。但我們依然要保障密碼的復(fù)雜程度,以保障認(rèn)證服務(wù)的安全。

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 屬性代表該屬性必須從認(rèn)證中心返回,而屬性的名稱及定義規(guī)范則要和認(rèn)證服務(wù)的定義保持一致。從認(rèn)證中心返回的屬性可以通過以下形式得到:

OpenIDAuthenticationToken token =
    (OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List<OpenIDAttribute> attributes = token.getAttributes();

OpenIDAuthenticationToken 對象從 SecurityContextHolder 對象中獲取。Google,Yahoo 和 MyOpenID 所提供的屬性對象不盡相同。

4. 小結(jié)

本小節(jié)主要知識點有:

  • OpenID 是一個廣泛應(yīng)用于互聯(lián)網(wǎng)網(wǎng)站的認(rèn)證方式;
  • OpenID 的作用是提供身份識別的能力;
  • OpenID 被一些國際的主流網(wǎng)站支持,比如 Google,Yahoo 和 MyOpenID 等,在國內(nèi)尚未出現(xiàn)較權(quán)威的提供方;
  • Spring Security 提供了網(wǎng)站 OpenID 認(rèn)證集成的功能。

到此我們對一些被廣泛應(yīng)用的認(rèn)證授權(quán)方案進(jìn)行了介紹,包括 OAuth2.0、SAML2.0、CAS、JAAS 和 OpenID。下節(jié)我們討論一個可以提升用戶體驗的操作:「記住我」功能的實現(xiàn)。