javascript
使用API身份验证的Spring Security
盡管有許多博客文章詳細(xì)介紹了如何使用Spring Security,但是當(dāng)問題域位于標(biāo)準(zhǔn)LDAP或數(shù)據(jù)庫身份驗(yàn)證之外時(shí),我仍然經(jīng)常發(fā)現(xiàn)配置挑戰(zhàn)。 在本文中,我將介紹一些針對(duì)Spring Security的簡(jiǎn)單自定義,使其能夠與基于REST的API調(diào)用一起使用。 具體來說,用例是您擁有一個(gè)API服務(wù),該服務(wù)將返回包含SHA-256密碼哈希的用戶對(duì)象。
設(shè)定
運(yùn)行此樣本的先決條件是Git和Maven,以及您選擇的IDE(已通過Eclipse和IntelliJ進(jìn)行了測(cè)試)。
可以在以下位置找到源代碼: https : //github.com/dajevu/Spring3SecurityUsingAPI 。 拉下代碼后,執(zhí)行以下步驟:
為了演示該解決方案,使用了三個(gè)Maven模塊,如下所示:
- SpringWebApp 。 這是一個(gè)典型的Spring Webapp,僅提供一個(gè)JSP頁面。 頁面的內(nèi)容將取決于用戶當(dāng)前是否登錄。 首次訪問該頁面時(shí),將顯示一個(gè)Login鏈接,該鏈接將其定向到內(nèi)置的Spring Security登錄表單。 當(dāng)他們嘗試登錄時(shí), R ESTEasy客戶端用于調(diào)用API服務(wù)(如下所述),該服務(wù)返回一個(gè)JSON字符串,該字符串通過RESTEasy客戶端轉(zhuǎn)換為Java對(duì)象。 以下各節(jié)討論了如何配置Spring Security的詳細(xì)信息。
- RestfulAPI 。 提供JSON請(qǐng)求的API服務(wù)。 它是使用RESTEasy(JAX-RS實(shí)現(xiàn))配置的,下一節(jié)將對(duì)其進(jìn)行詳細(xì)描述。
- 共享的 。 它包含其他兩個(gè)項(xiàng)目之間共享的一些Java類。 具體來說,用戶對(duì)象DTO和RESTEasy代理定義(由于RESTEasy客戶端也可以使用它,因此已共享)。
RestfulAPI解剖
API Webapp是使用RESTEasy的Spring實(shí)現(xiàn)配置的。 RESTEasy文檔非常詳盡,因此我將不對(duì)其設(shè)置進(jìn)行詳細(xì)說明。 定義了一個(gè)API調(diào)用(在Shared項(xiàng)目的UserProxy中),該調(diào)用返回靜態(tài)JSON字符串。 API的代理(或接口)定義如下:
Resteasy API代理
@Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path(UserProxy.Urls.BASE_URL) public interface UserProxy {public interface Urls {public static final String BASE_URL = "/api/v1";public static final String USER = "/user/{username}";}@GET@Produces( { MediaType.APPLICATION_JSON })@Path(UserProxy.Urls.USER)public User getUserByUsername(@PathParam("username") String username); }對(duì)于那些熟悉JAX-RS的人來說,您將可以輕松地遵循此配置。 它定義了一個(gè)API URI,它將響應(yīng)發(fā)送到/ api / v1 / user / {username}的URL路徑的請(qǐng)求,其中{username}被替換為實(shí)際的用戶名值。 該服務(wù)的實(shí)現(xiàn)僅返回一個(gè)靜態(tài)響應(yīng),如下所示:
關(guān)于唯一復(fù)雜的事情是使用用戶密碼的SHA-256哈希。 很快我們將看到Spring Security如何解釋這一點(diǎn)。 訪問URL時(shí),將返回以下JSON字符串:
該Webapp的web.xml包含用于服務(wù)于RESTEasy請(qǐng)求的設(shè)置配置,因此,如果您好奇的話,請(qǐng)看一下。
SpringWebApp解剖
現(xiàn)在我們可以看一下Spring Security的配置。 項(xiàng)目的web.xml文件將其配置為Spring應(yīng)用程序,并將文件applicationContext-security.xml指定為初始Spring配置文件。 讓我們仔細(xì)看一下這個(gè)文件,因?yàn)檫@是大多數(shù)魔術(shù)發(fā)生的地方:
讓我們遍歷每個(gè)行號(hào)以描述其功能。 第3至5行指示Spring在com.acme目錄中查找Spring支持的類,并且將支持Spring批注。 第7行用于加載application.properties文件中指定的屬性(用于指定API主機(jī))。 第9至11行為該應(yīng)用程序啟用Spring Security。 通常,作為http的子元素,您將指定使用角色來保護(hù)哪些頁面,但是為了使本示例簡(jiǎn)單起見,未對(duì)其進(jìn)行配置。
第13-17行是基于Spring Security的自定義開始的地方。 我們通過其bean ref定義了一個(gè)名為userDetailsS??rv的自定義身份驗(yàn)證提供程序。 該bean通過自定義類com.acme.security.UserDetailsS??ervice實(shí)現(xiàn)(第19行)。 讓我們仔細(xì)看一下這個(gè)類:
如您所見,此類實(shí)現(xiàn)了Spring接口org.springframework.security.core.userdetails.UserDetailsS??ervice。 這需要覆蓋方法loadUserByUsername。 此方法負(fù)責(zé)從身份驗(yàn)證提供者/源中檢索用戶。 返回的用戶(或者,如果找不到匹配的用戶,則拋出UsernameNotFoundException-第28行)必須包含密碼屬性,以便Spring Security與表單中提供的內(nèi)容進(jìn)行比較。 如前所述,在這種情況下,密碼以SHA-256哈希值返回。
在我們的API實(shí)現(xiàn)中,使用API??Helper類提取用戶查找,我們將在后面介紹。 然后,將返回的API數(shù)據(jù)填充到名為UserDetails的自定義類中。 這將使用相同的名稱實(shí)現(xiàn)Spring接口。 該接口需要getUsername()和getPassword()方法的具體實(shí)現(xiàn)。 Spring將在Security的下一個(gè)處理步驟中調(diào)用這些值,以將這些值與Web表單中記錄的值進(jìn)行比較。
Spring如何將SHA-256中返回的密碼與表單密碼值進(jìn)行比較。 如果回頭看一下XML配置,它包含以下設(shè)置:
注意passwordEncoder -該參考指向Spring類ShaPasswordEncoder。 此類將計(jì)算通過Web表單提供的密碼的SHA-256密碼,然后Spring會(huì)將計(jì)算出的值與我們通過API返回的值進(jìn)行比較。
讓我們通過看一下APIHelper類來解決這個(gè)問題:
第8和9行的第一件事是注入API.host屬性。 您還記得,這是在application.properties文件中設(shè)置的。 這標(biāo)識(shí)了要在其中發(fā)布API調(diào)用的主機(jī)(因?yàn)樗诒镜剡\(yùn)行,所以指定了localhost)。 第17至20行使用RESTEasy客戶端機(jī)制之一發(fā)布JSON RESTful調(diào)用(RESTEasy也具有所謂的客戶端代理實(shí)現(xiàn),它更易于使用/代碼更少,但沒有提供太多的低級(jí)控制)。 然后,通過第26行的Jackson方式,將來自API的結(jié)果響應(yīng)從JSON轉(zhuǎn)換為User Java對(duì)象。然后將該Java對(duì)象返回給UserDetails服務(wù)。
總結(jié)/總結(jié)
如您所見,定制Spring Security以針對(duì)API調(diào)用(或?qū)嶋H上是任何外部服務(wù))進(jìn)行身份驗(yàn)證所涉及的實(shí)際工作非常簡(jiǎn)單。 只需要實(shí)現(xiàn)幾個(gè)類,但是嘗試第一次弄清楚這一點(diǎn)可能很棘手。 因此,之所以我包括完整的端到端示例。
參考:來自Jeff's SOA Ruminations博客的JCG合作伙伴 Jeff Davis 使用API??身份驗(yàn)證的Spring Security 。
翻譯自: https://www.javacodegeeks.com/2012/10/spring-security-using-api-authentication.html
總結(jié)
以上是生活随笔為你收集整理的使用API身份验证的Spring Security的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce:通过数据密集型文本处
- 下一篇: Spring MVC定制用户登录注销实现