最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security LDAP實現(xiàn)身份驗證的項目實踐

 更新時間:2023年08月20日 08:54:49   作者:江帥帥  
在本文中,我們涵蓋了“使用 Spring Boot 的 Spring Security LDAP 身份驗證示例”的所有理論和示例部分,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

如果你曾經(jīng)在生產(chǎn)級應(yīng)用程序中實現(xiàn)過登錄功能,你一定聽說過 LDAP 身份驗證。

LDAP 可用于任何類型的分層目錄信息,LDAP 最流行的用途是存儲組織數(shù)據(jù)。

舉個例子,比如說你們公司一個典型的組織結(jié)構(gòu),那么一般都有董事、經(jīng)理、監(jiān)事等職位。這些呢就是 LDAP 機制最適合實現(xiàn)的分層數(shù)據(jù)。通過這種方式,大多數(shù)組織使用它來維護(hù)組織信息,包括其憑證。

因此,我們接下來演示一下 Spring Security LDAP 身份驗證示例。

1、LDAP 是什么?

LDAP 代表輕量級目錄訪問協(xié)議。它是一種開放的、供應(yīng)商中立的行業(yè)標(biāo)準(zhǔn)應(yīng)用程序協(xié)議,用于通過網(wǎng)絡(luò)訪問和維護(hù)分布式目錄信息服務(wù)。

2、LDAP 是怎么工作的?

比如上面那個例子,LDAP 可用來存儲組織的用戶信息。

當(dāng)用戶嘗試登錄應(yīng)用程序時,它會檢查 LDAP 以查看其是否是有效用戶以及該用戶是否具有所需的權(quán)限和有效憑據(jù)。

在 Spring Security 的上下文中,應(yīng)用程序連接到 LDAP 服務(wù)器,以便根據(jù)該 LDAP 驗證有效用戶。

3、LDIF 是什么?

LDIF 是 LDAP 數(shù)據(jù)交換格式的縮寫。
它是文件的標(biāo)準(zhǔn)純文本數(shù)據(jù)交換格式,用于表示 LDAP 目錄內(nèi)容,文件的擴展名是“.ldif”。
LDIF 文件中有多個字段,詳細(xì)了解一下:

3.1 LDIF 文件中有哪些常見字段?

1)dn:專有名稱
“dn”代表唯一標(biāo)識目錄中條目的名稱。
DN 是必填字段,如果 DN 中存在逗號,則必須使用反斜杠(\)對逗號進(jìn)行轉(zhuǎn)義。例如,dn: uid=sam, ou=people, o=example.com Bolivia\,S.A.

2)o:組織
“o”代表組織名稱。例如:juejin.cn

3)dc:域分量
“dc”代表域的每個組成部分。例如 www.example.com 將寫為 DC = www, DC = example, DC = com

4)ou:組織單位
“ou”代表用戶所屬的組織單位(或有時是用戶組)。如果用戶屬于多個組,您可以通過提供多個條目來指定它。例如:OU = 員工,OU = 管理員。

5)cn:通用名
“cn”代表您正在查詢的單個對象(人名、會議室、菜譜名稱、職位等)。它是人們常用的。例如,cn:郭德綱。至少需要一個通用名稱。

6)sn:姓氏
“sn”代表人的姓氏。例如,sn:郭。需要提供姓氏。

7)objectClass:對象類
“objectClass”指定與此條目一起使用的對象類。
它是必填字段。例如:objectClass:person,objectClass:organizationalPerson。
應(yīng)包含此對象類規(guī)范,因為許多 LDAP 客戶端在對個人或組織人員進(jìn)行搜索操作期間需要它。

3.2 LDIF 文件的格式是什么?

LDIF 由一個或多個以空行分隔的目錄條目組成。每個 LDIF 條目都包含一個可選的條目 ID、一個必需的專有名稱、一個或多個對象類以及多個屬性定義。

LDIF 格式在 RFC 2849 LDAP 數(shù)據(jù)交換格式 (LDIF) 中定義。 Sun Java System Directory Server 符合此標(biāo)準(zhǔn)。

LDIF 中表示的目錄項的基本形式如下:

dn: distinguished_name 
objectClass: object_class 
objectClass: object_class 
...
attribute_type[;subtype]:attribute_value
attribute_type[;subtype]:attribute_value 
... 

我們必須提供 DN 和至少一個對象類定義。此外,我們必須包含為條目定義的對象類所需的任何屬性。

所有其他屬性和對象類都是可選的。我們可以按任何順序指定對象類和屬性。冒號后面的空格也是可選的。

例如,下面是 LDIF 文件中的有效條目,這里的“uid”字段代表該人的用戶 ID。

dn: uid=bob,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: Bob Hamilton
sn: Hamilton
uid: bob
userPassword: bobspassword

4、如何使用 Spring Boot 實現(xiàn) Spring Security LDAP 身份驗證?

假設(shè)我們有一個應(yīng)用程序,我們已經(jīng)使用 Spring 框架提供的 Spring Security API 實現(xiàn)了基本的安全性?,F(xiàn)在我們必須實施 LDAP 身份驗證以使其更加安全。

因此,我們需要開發(fā)一個基本的 Web 應(yīng)用程序,然后實現(xiàn) LDAP 身份驗證概念來滿足 Spring Security LDAP 身份驗證示例的要求。

以下是詳細(xì)步驟:

步驟1:創(chuàng)建 Spring Boot Starter 項目

創(chuàng)建入門項目時,選擇“Spring Web”、“Spring LDAP”、“嵌入式 LDAP 服務(wù)器”、“Spring security”和“Spring Boot DevTools”作為入門項目依賴項。

這里“Spring Boot Dev Tools”是可選添加的。我們使用 Spring Boot Dev Tools 來實現(xiàn)熱加載,避免在測試應(yīng)用程序時多次重新啟動 tomcat 服務(wù)器。除此之外,我們還需要添加一個額外的依賴項“spring-security-ldap”。

以下是我們使用 Spring Boot 開發(fā)此 Spring Security LDAP 身份驗證示例所使用的依賴項。

<dependency>?
? ? <groupId>org.springframework.boot</groupId>?
? ? <artifactId>spring-boot-starter-web</artifactId>?
</dependency>
<dependency>?
? ? <groupId>org.springframework.boot</groupId>?
? ? <artifactId>spring-boot-starter-data-ldap</artifactId>?
</dependency>?
<dependency>?
? ? <groupId>com.unboundid</groupId>?
? ? <artifactId>unboundid-ldapsdk</artifactId>?
? ? <!-- <scope>test</scope> -->?
</dependency>?
<dependency>?
? ? <groupId>org.springframework.security</groupId>?
? ? <artifactId>spring-security-ldap</artifactId>?
</dependency>?
<dependency>?
? ? <groupId>org.springframework.boot</groupId>?
? ? <artifactId>spring-boot-starter-security</artifactId>?
</dependency>?
<dependency>?
? ? <groupId>org.springframework.boot</groupId>?
? ? <artifactId>spring-boot-devtools</artifactId>?
? ? <scope>runtime</scope>?
</dependency>?

步驟2:創(chuàng)建一個 .ldif 文件作為 ldap-data.ldif

該文件將具有強制的 .ldif 擴展名。在 src/main/resources 文件夾下創(chuàng)建一個名為“ldap-data.ldif”的文件并更新數(shù)據(jù),如下所示。

我們從 Spring 官方文檔網(wǎng)站獲取此文件。它將作為本地目錄工作,并具有兼容的數(shù)據(jù)以相應(yīng)地與 LDAP 配合使用。

dn: dc=springframework,dc=org
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: springframework
dn: ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups
dn: ou=subgroups,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: subgroups
dn: ou=people,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people
dn: ou=space cadets,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: space cadets
dn: ou="quoted people",dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: "quoted people"
dn: ou=otherpeople,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: otherpeople
dn: uid=ben,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben Alex
sn: Alex
uid: ben
userPassword: $2a$10$c6bSeWPhg06xB1lvmaWNNe4NROmZiSpYhlocU/98HNr2MhIOiSt36
dn: uid=admin,ou=people,dc=springframework,dc=org?
objectclass: top?
objectclass: person?
objectclass: organizationalPerson?
objectclass: inetOrgPerson?
cn: Admin?
sn: Admin?
uid: admin?
userPassword: $2a$10$ODZhWAyD0i8zruWQcMYx9ePkW2xXsqIljhh4K8spSOUCY897ERkwu
dn: uid=bob,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Bob Hamilton
sn: Hamilton
uid: bob
userPassword: bobspassword
dn: uid=joe,ou=otherpeople,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Joe Smeth
sn: Smeth
uid: joe
userPassword: joespassword
dn: cn=mouse, jerry,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Mouse, Jerry
sn: Mouse
uid: jerry
userPassword: jerryspassword
dn: cn=slash/guy,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: slash/guy
sn: Slash
uid: slashguy
userPassword: slashguyspassword
dn: cn=quote"guy,ou="quoted people",dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: quote"guy
sn: Quote
uid: quoteguy
userPassword: quoteguyspassword
dn: uid=space cadet,ou=space cadets,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Space Cadet
sn: Cadet
uid: space cadet
userPassword: spacecadetspassword
dn: cn=developers,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: developers
ou: developer
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
uniqueMember: uid=bob,ou=people,dc=springframework,dc=org
dn: cn=managers,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: managers
ou: manager
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
uniqueMember: cn=mouse, jerry,ou=people,dc=springframework,dc=org
dn: cn=submanagers,ou=subgroups,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: submanagers
ou: submanager
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org

在這里,我們突出顯示了一個用戶的數(shù)據(jù),我們將使用該數(shù)據(jù)來測試已實施的示例。

步驟3:更新 application.properties 文件

在此文件中,我們將擁有嵌入式 LDAP 的一些屬性,如下所示。

spring.ldap.embedded.port=8389
spring.ldap.embedded.ldif=classpath:ldap-data.ldif
spring.ldap.embedded.base-dn=dc=springframework,dc=org

步驟4:創(chuàng)建一個用于基本身份驗證的控制器類

下一步是創(chuàng)建一個 RestController 類。
當(dāng)我們輸入憑據(jù)以登錄應(yīng)用程序時,我們將看到一條成功登錄消息。讓我們創(chuàng)建一個簡單的控制器 LoginController.java,如下所示。

@RestController
public class LoginController {
? ? @GetMapping("/")
? ? public String getLoginPage() {
? ? ? ? return "登錄成功!";
? ? }
}?

步驟5:從 LdapSecurityConfig.java 創(chuàng)建一個配置類

這是我們將保留 LDAP 身份驗證的整個邏輯的配置類,如下所示。

@Configuration
public class LdapSecurityConfig extends WebSecurityConfigurerAdapter {
? ? @Override
? ? protected void configure(HttpSecurity http) throws Exception {
? ? ? ? ?http
? ? ? ? .authorizeRequests()
? ? ? ? .anyRequest().fullyAuthenticated()
? ? ? ? .and()
? ? ? ? .formLogin();
? ? }
? ? @Override
? ? public void configure(AuthenticationManagerBuilder auth) throws Exception {
? ? ? ? ?auth
? ? ? ? .ldapAuthentication()
? ? ? ? .userDnPatterns("uid={0},ou=people")
? ? ? ? .groupSearchBase("ou=groups")
? ? ? ? .contextSource()
? ? ? ? .url("ldap://localhost:8389/dc=springframework,dc=org")
? ? ? ? .and()
? ? ? ? .passwordCompare()
? ? ? ? .passwordEncoder(new BCryptPasswordEncoder())
? ? ? ? .passwordAttribute("userPassword");
? ? }
}?

注意:如果您使用 Spring Security 5.7.0-M2 或更高版本,不要使用 WebSecurityConfigurerAdapter。

5、如何測試應(yīng)用程序?

為了測試應(yīng)用程序,我們需要打開瀏覽器并點擊 URL http://localhost:8080/。
點擊 URL 后,將顯示默認(rèn)登錄頁面。此外,輸入 ldap-data.ldif 文件中給出的任何憑據(jù)。
如果輸入的憑據(jù)正確,您將看到使用 LDAP 身份驗證成功登錄的消息。例如,讓我們觀察 ldap-data.ldif 文件中的以下用戶數(shù)據(jù)。

dn: uid=admin,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Admin
sn: Admin
uid: admin
userPassword: $2a$10$ODZhWAyD0i8zruWQcMYx9ePkW2xXsqIljhh4K8spSOUCY897ERkwu

這里,aid是用戶名,userpassword是密碼的加密值。密碼的真實值為“admin@123”。

因此,我們需要提供 admin@123 作為密碼。單擊登錄按鈕后,您應(yīng)該在屏幕上看到消息“登錄成功!”。

我們可以使用下面的程序類來對任何密碼進(jìn)行編碼。

public class PasswordEncoder {
? ? public static void main(String[] args) {
? ? ? ? System.out.println(new BCryptPasswordEncoder().encode("admin@123"));
? ? }
}?

6、總結(jié)

在本文中,我們涵蓋了“使用 Spring Boot 的 Spring Security LDAP 身份驗證示例”的所有理論和示例部分。
最后,您應(yīng)該能夠?qū)崿F(xiàn) Spring Security LDAP 身份驗證。同樣,您也可以根據(jù)自己的要求進(jìn)一步擴展此示例。也嘗試在您的項目中相應(yīng)地實現(xiàn)它。

到此這篇關(guān)于Spring Security LDAP實現(xiàn)身份驗證的項目實踐的文章就介紹到這了,更多相關(guān)Spring Security LDAP身份驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)貪吃蛇游戲(1小時學(xué)會)

    Java實現(xiàn)貪吃蛇游戲(1小時學(xué)會)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)貪吃蛇游戲,1小時學(xué)會貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • SpringBoot @Retryable注解方式

    SpringBoot @Retryable注解方式

    這篇文章主要介紹了SpringBoot @Retryable注解方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java8特性使用Function代替分支語句

    Java8特性使用Function代替分支語句

    這篇文章主要介紹了Java8特性使用Function代替分支語句,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java 發(fā)送郵件的實例代碼(可移植)

    java 發(fā)送郵件的實例代碼(可移植)

    java 發(fā)送郵件的實例代碼(可移植),需要的朋友可以參考一下
    2013-03-03
  • JAVA面向?qū)ο笤O(shè)計寵物類方式

    JAVA面向?qū)ο笤O(shè)計寵物類方式

    本指南涉及JAVA面向?qū)ο蟮膶櫸镱愒O(shè)計,包括寵物類的父類及其子類小貓類和小狗類,用戶可以選擇養(yǎng)貓或養(yǎng)狗,給寵物起名字,實現(xiàn)喂食互動,同時寵物具有飽食度和快樂度屬性,適合初學(xué)者學(xué)習(xí)面向?qū)ο笤O(shè)計
    2024-10-10
  • SpringBoot上傳圖片的示例

    SpringBoot上傳圖片的示例

    這篇文章主要介紹了SpringBoot上傳圖片的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名

    java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名

    這篇文章主要介紹了java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名,主要用在做主題時替換這些常見應(yīng)用的圖片,需要的朋友可以參考下
    2014-06-06
  • Spring中bean對象的裝配方式、作用域及生命周期詳解

    Spring中bean對象的裝配方式、作用域及生命周期詳解

    這篇文章主要介紹了Spring中bean對象的裝配方式、作用域及生命周期詳解,SprignBoot中?@Bean?完美的替換了了上面的這種在xml中配置的方法,使用以下方法就能讓spring在需要自動創(chuàng)建Info對象時,自動調(diào)用這個方法,需要的朋友可以參考下
    2023-11-11
  • java使用http實現(xiàn)文件下載學(xué)習(xí)示例

    java使用http實現(xiàn)文件下載學(xué)習(xí)示例

    這篇文章主要介紹了java使用http實現(xiàn)文件下載學(xué)習(xí)示例,需要的朋友可以參考下
    2014-04-04
  • Spring Cache原理解析

    Spring Cache原理解析

    Spring Cache是一個框架,它提供了基于注解的緩存功能,使得開發(fā)者可以很方便地將緩存集成到他們的應(yīng)用程序中,這篇文章主要介紹了Spring Cache原理解析,需要的朋友可以參考下
    2024-05-05

最新評論

恩施市| 来宾市| 塔河县| SHOW| 甘孜县| 汉川市| 五大连池市| 临泉县| 英超| 中江县| 二连浩特市| 江山市| 高台县| 肇州县| 翁源县| 尼勒克县| 开江县| 峨山| 平度市| 千阳县| 望奎县| 滁州市| 福安市| 茂名市| 大方县| 乡城县| 旺苍县| 平乐县| 九龙坡区| 临沧市| 镇巴县| 天柱县| 开平市| 商河县| 新沂市| 泗阳县| 辽源市| 津南区| 疏勒县| 大理市| 嘉黎县|