برنامه نویسی

چگونه می توانید یک مکانیسم ورود شرطی بین LDAP و پایگاه داده محلی با استفاده از Spring Boot پیاده سازی کنید.

Summarize this content to 400 words in Persian Lang
اجرای یک مکانیزم ورود به سیستم شرطی در Spring Boot که به طور یکپارچه بین احراز هویت LDAP و احراز هویت پایگاه داده محلی بر اساس در دسترس بودن سرور LDAP سوئیچ می کند، یک جنبه حیاتی برای اطمینان از دسترسی بدون وقفه به برنامه شما است.

با استفاده از این رویکرد احراز هویت پویا، می‌توانید قابلیت اطمینان و انعطاف‌پذیری سیستم خود را افزایش دهید و تجربه ورود یکپارچه به کاربران را حتی در زمان خرابی سرور LDAP فراهم کنید.

برای پیاده‌سازی مکانیزم ورود مشروط که بررسی می‌کند آیا سرور LDAP در دسترس است و بر اساس آن، با استفاده از سرور LDAP احراز هویت می‌شود یا به پایگاه داده محلی PostgreSQL برمی‌گردد، باید:

در دسترس بودن سرور LDAP را بررسی کنید: مکانیزمی را برای بررسی اینکه آیا سرور LDAP قابل دسترسی است یا خیر، اجرا کنید.

تلاش برای احراز هویت LDAP: اگر سرور LDAP در دسترس است، با استفاده از LDAP احراز هویت کنید.

بازگشت به احراز هویت محلی: اگر سرور LDAP قابل دسترسی نیست، با استفاده از اعتبارنامه های ذخیره شده در پایگاه داده محلی PostgreSQL احراز هویت کنید.

در اینجا پیاده سازی گام به گام است :

1. افزودن وابستگی ها:

در اینجا من Maven را به عنوان ابزار ساخت در نظر می‌گیرم. مطمئن شوید که وابستگی‌های زیر را در خود داریدpom.xmlفایل:

org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-data-jpaorg.postgresqlpostgresqlruntimeorg.springframework.bootspring-boot-starter-ldaporg.springframework.bootspring-boot-starter-actuator

2. ویژگی های برنامه را پیکربندی کنید

ویژگی های لازم را در application.properties تنظیم کنید:

# LDAP Server Configuration
ldap.url=ldap://url:389
ldap.admin.dn=cn=admin,dc=urdc,dc=urdc
ldap.admin.password=ldappassword
ldap.search.base=dc=cspurdc,dc=csp

# PostgreSQL Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/yourdb
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update

# User Authentication Configuration
user.samaccountname=username
user.password=ldappassword

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. Entity و Repository کاربر برای PostgreSQL ایجاد کنید

یک موجودیت کاربر و مخزن ساده برای پایگاه داده PostgreSQL تعریف کنید. User.java

package com.example.ldapauth.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

UserRepository.java

package com.example.ldapauth.repository;

import com.example.ldapauth.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository {
User findByUsername(String username);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. سرویس برای احراز هویت محلی

سرویسی اضافه کنید تا احراز هویت پایگاه داده محلی را کنترل کند.LocalAuthService.java

package com.example.ldapauth.service;

import com.example.ldapauth.entity.User;
import com.example.ldapauth.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LocalAuthService {

@Autowired
private UserRepository userRepository;

public boolean authenticate(String username, String password) {
User user = userRepository.findByUsername(username);
return user != null && user.getPassword().equals(password);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. LdapService را تغییر دهید تا شامل بررسی سلامت شود:

روشی برای بررسی در دسترس بودن سرور LDAP اضافه کنید.LdapService.java

package com.example.ldapauth.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ldap.support.LdapUtils;
import org.springframework.stereotype.Service;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import java.util.Hashtable;

@Service
public class LdapService {

@Autowired
private DirContext ldapContext;

@Value(“${ldap.search.base}”)
private String searchBase;

@Value(“${user.samaccountname}”)
private String sAMAccountName;

@Value(“${user.password}”)
private String userPassword;

public boolean isLdapAvailable() {
try {
// Try a no-op search to check server availability
NamingEnumeration results = ldapContext.search(“”, “(objectClass=*)”, new SearchControls());
return results != null; // If this does not throw an exception, LDAP is available
} catch (NamingException e) {
return false; // LDAP is not available
}
}

public String getUserDn(String username) {
try {
String searchFilter = “(sAMAccountName=” + username + “)”;
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration results = ldapContext.search(searchBase, searchFilter, searchControls);

if (results.hasMore()) {
SearchResult searchResult = results.next();
return searchResult.getNameInNamespace();
}
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}

public boolean authenticateUser(String userDn, String password) {
if (userDn == null) {
System.out.println(“User authentication failed: User DN not found.”);
return false;
}

try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER_URL, ldapContext.getEnvironment().get(Context.PROVIDER_URL).toString());
env.put(Context.SECURITY_AUTHENTICATION, “simple”);
env.put(Context.SECURITY_PRINCIPAL, userDn);
env.put(Context.SECURITY_CREDENTIALS, password);

DirContext ctx = new InitialDirContext(env);
ctx.close();
System.out.println(“User authentication successful.”);
return true;
} catch (NamingException e) {
System.out.println(“User authentication failed: ” + e.getMessage());
return false;
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. کنترل کننده را برای پیاده سازی ورود شرطی تغییر دهید

LdapController.java

package com.example.ldapauth.controller;

import com.example.ldapauth.service.LdapService;
import com.example.ldapauth.service.LocalAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LdapController {

@Autowired
private LdapService ldapService;

@Autowired
private LocalAuthService localAuthService;

@PostMapping(“/login”)
public String performLogin(@RequestParam String username, @RequestParam String password) {
if (ldapService.isLdapAvailable()) {
String userDn = ldapService.getUserDn(username);
boolean isAuthenticated = ldapService.authenticateUser(userDn, password);
if (isAuthenticated) {
return “LDAP authentication successful!”;
}
}

boolean isLocalAuthenticated = localAuthService.authenticate(username, password);
if (isLocalAuthenticated) {
return “Local authentication successful!”;
}

return “Authentication failed!”;
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

بررسی در دسترس بودن LDAP: روش isLdapAvailable در LdapService یک جستجوی ساختگی LDAP را برای بررسی اینکه آیا سرور LDAP در دسترس است انجام می دهد.
منطق ورود شرطی: در LdapController، نقطه پایانی /login در دسترس بودن LDAP را بررسی می کند. اگر LDAP در دسترس باشد، سعی می کند کاربر را با LDAP احراز هویت کند. اگر احراز هویت LDAP ناموفق باشد یا LDAP در دسترس نباشد، با استفاده از LocalAuthService به احراز هویت پایگاه داده PostgreSQL محلی بازمی گردد.
احراز هویت محلی: اگر LDAP در دسترس نباشد یا کاربر در تأیید اعتبار LDAP ناموفق باشد، پایگاه داده محلی PostgreSQL را برای اعتبار کاربر با استفاده از UserRepository بررسی می کند.
کنترلر REST: @PostMapping در نقطه پایانی /login درخواست‌های ورود را مدیریت می‌کند و منطق شرطی را برای احراز هویت اعمال می‌کند.

این تنظیمات مکانیزمی قوی برای جابجایی بین LDAP و احراز هویت محلی بر اساس در دسترس بودن سرور LDAP فراهم می کند.

امیدوارم این مفید بوده باشه بچه ها لطفاً توجه داشته باشید که باید چند چیز را بر اساس نیازها و منطق خود تغییر دهید. من در اینجا فقط ایده کلی داده ام.

کد نویسی مبارک 🙂

با تشکر،جاواچارترکایلاش نیرمالنوشته شده در : 5 جولای 2024.

اجرای یک مکانیزم ورود به سیستم شرطی در Spring Boot که به طور یکپارچه بین احراز هویت LDAP و احراز هویت پایگاه داده محلی بر اساس در دسترس بودن سرور LDAP سوئیچ می کند، یک جنبه حیاتی برای اطمینان از دسترسی بدون وقفه به برنامه شما است.

با استفاده از این رویکرد احراز هویت پویا، می‌توانید قابلیت اطمینان و انعطاف‌پذیری سیستم خود را افزایش دهید و تجربه ورود یکپارچه به کاربران را حتی در زمان خرابی سرور LDAP فراهم کنید.

برای پیاده‌سازی مکانیزم ورود مشروط که بررسی می‌کند آیا سرور LDAP در دسترس است و بر اساس آن، با استفاده از سرور LDAP احراز هویت می‌شود یا به پایگاه داده محلی PostgreSQL برمی‌گردد، باید:

  1. در دسترس بودن سرور LDAP را بررسی کنید: مکانیزمی را برای بررسی اینکه آیا سرور LDAP قابل دسترسی است یا خیر، اجرا کنید.
  2. تلاش برای احراز هویت LDAP: اگر سرور LDAP در دسترس است، با استفاده از LDAP احراز هویت کنید.
  3. بازگشت به احراز هویت محلی: اگر سرور LDAP قابل دسترسی نیست، با استفاده از اعتبارنامه های ذخیره شده در پایگاه داده محلی PostgreSQL احراز هویت کنید.

در اینجا پیاده سازی گام به گام است :

1. افزودن وابستگی ها:

در اینجا من Maven را به عنوان ابزار ساخت در نظر می‌گیرم. مطمئن شوید که وابستگی‌های زیر را در خود دارید
pom.xml
فایل:

org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-data-jpaorg.postgresqlpostgresqlruntimeorg.springframework.bootspring-boot-starter-ldaporg.springframework.bootspring-boot-starter-actuator

2. ویژگی های برنامه را پیکربندی کنید

ویژگی های لازم را در application.properties تنظیم کنید:

# LDAP Server Configuration
ldap.url=ldap://url:389
ldap.admin.dn=cn=admin,dc=urdc,dc=urdc
ldap.admin.password=ldappassword
ldap.search.base=dc=cspurdc,dc=csp

# PostgreSQL Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/yourdb
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update

# User Authentication Configuration
user.samaccountname=username
user.password=ldappassword
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. Entity و Repository کاربر برای PostgreSQL ایجاد کنید

یک موجودیت کاربر و مخزن ساده برای پایگاه داده PostgreSQL تعریف کنید. User.java

package com.example.ldapauth.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String username;
    private String password;
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

UserRepository.java

package com.example.ldapauth.repository;

import com.example.ldapauth.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository {
    User findByUsername(String username);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. سرویس برای احراز هویت محلی

سرویسی اضافه کنید تا احراز هویت پایگاه داده محلی را کنترل کند.
LocalAuthService.java

package com.example.ldapauth.service;

import com.example.ldapauth.entity.User;
import com.example.ldapauth.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LocalAuthService {

    @Autowired
    private UserRepository userRepository;

    public boolean authenticate(String username, String password) {
        User user = userRepository.findByUsername(username);
        return user != null && user.getPassword().equals(password);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. LdapService را تغییر دهید تا شامل بررسی سلامت شود:

روشی برای بررسی در دسترس بودن سرور LDAP اضافه کنید.
LdapService.java

package com.example.ldapauth.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ldap.support.LdapUtils;
import org.springframework.stereotype.Service;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import java.util.Hashtable;

@Service
public class LdapService {

    @Autowired
    private DirContext ldapContext;

    @Value("${ldap.search.base}")
    private String searchBase;

    @Value("${user.samaccountname}")
    private String sAMAccountName;

    @Value("${user.password}")
    private String userPassword;

    public boolean isLdapAvailable() {
        try {
            // Try a no-op search to check server availability
            NamingEnumeration results = ldapContext.search("", "(objectClass=*)", new SearchControls());
            return results != null;  // If this does not throw an exception, LDAP is available
        } catch (NamingException e) {
            return false; // LDAP is not available
        }
    }

    public String getUserDn(String username) {
        try {
            String searchFilter = "(sAMAccountName=" + username + ")";
            SearchControls searchControls = new SearchControls();
            searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration results = ldapContext.search(searchBase, searchFilter, searchControls);

            if (results.hasMore()) {
                SearchResult searchResult = results.next();
                return searchResult.getNameInNamespace();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public boolean authenticateUser(String userDn, String password) {
        if (userDn == null) {
            System.out.println("User authentication failed: User DN not found.");
            return false;
        }

        try {
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, ldapContext.getEnvironment().get(Context.PROVIDER_URL).toString());
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, userDn);
            env.put(Context.SECURITY_CREDENTIALS, password);

            DirContext ctx = new InitialDirContext(env);
            ctx.close();
            System.out.println("User authentication successful.");
            return true;
        } catch (NamingException e) {
            System.out.println("User authentication failed: " + e.getMessage());
            return false;
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. کنترل کننده را برای پیاده سازی ورود شرطی تغییر دهید

LdapController.java

package com.example.ldapauth.controller;

import com.example.ldapauth.service.LdapService;
import com.example.ldapauth.service.LocalAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LdapController {

    @Autowired
    private LdapService ldapService;

    @Autowired
    private LocalAuthService localAuthService;

    @PostMapping("/login")
    public String performLogin(@RequestParam String username, @RequestParam String password) {
        if (ldapService.isLdapAvailable()) {
            String userDn = ldapService.getUserDn(username);
            boolean isAuthenticated = ldapService.authenticateUser(userDn, password);
            if (isAuthenticated) {
                return "LDAP authentication successful!";
            }
        }

        boolean isLocalAuthenticated = localAuthService.authenticate(username, password);
        if (isLocalAuthenticated) {
            return "Local authentication successful!";
        }

        return "Authentication failed!";
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  1. بررسی در دسترس بودن LDAP: روش isLdapAvailable در LdapService یک جستجوی ساختگی LDAP را برای بررسی اینکه آیا سرور LDAP در دسترس است انجام می دهد.
  2. منطق ورود شرطی: در LdapController، نقطه پایانی /login در دسترس بودن LDAP را بررسی می کند. اگر LDAP در دسترس باشد، سعی می کند کاربر را با LDAP احراز هویت کند. اگر احراز هویت LDAP ناموفق باشد یا LDAP در دسترس نباشد، با استفاده از LocalAuthService به احراز هویت پایگاه داده PostgreSQL محلی بازمی گردد.
  3. احراز هویت محلی: اگر LDAP در دسترس نباشد یا کاربر در تأیید اعتبار LDAP ناموفق باشد، پایگاه داده محلی PostgreSQL را برای اعتبار کاربر با استفاده از UserRepository بررسی می کند.
  4. کنترلر REST: @PostMapping در نقطه پایانی /login درخواست‌های ورود را مدیریت می‌کند و منطق شرطی را برای احراز هویت اعمال می‌کند.

این تنظیمات مکانیزمی قوی برای جابجایی بین LDAP و احراز هویت محلی بر اساس در دسترس بودن سرور LDAP فراهم می کند.

امیدوارم این مفید بوده باشه بچه ها لطفاً توجه داشته باشید که باید چند چیز را بر اساس نیازها و منطق خود تغییر دهید. من در اینجا فقط ایده کلی داده ام.

کد نویسی مبارک 🙂

با تشکر،
جاواچارتر
کایلاش نیرمال
نوشته شده در : 5 جولای 2024.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا