Spring Data LDAPガイド

Spring Data LDAPのガイド

1. 前書き

この記事では、we’ll focus on Spring Data LDAP integration and configuration. Spring LDAPの段階的な紹介については、this articleをざっと見てください。

また、Spring Data JPAガイドhereの概要もあります。

2. メーベン 依存

まず、必要なMaven依存関係を追加します。


    org.springframework.data
    spring-data-ldap
    1.0.6.RELEASE

spring-data-ldapの最新バージョンはここにあります。

3. ドメインエントリ

Spring LDAPプロジェクトは、Object-Directory Mapping (ODM)を使用してLDAPエントリをJavaオブジェクトにマップする機能を提供します。

Spring LDAP articleで既に構成されているLDAPディレクトリをマップするために使用されるエンティティを定義しましょう。

@Entry(
  base = "ou=users",
  objectClasses = { "person", "inetOrgPerson", "top" })
public class User {
    @Id
    private Name id;

    private @Attribute(name = "cn") String username;
    private @Attribute(name = "sn") String password;

    // standard getters/setters
}

@Entryは、(JPA / ORMの)@Entityに似ており、LDAPエントリのディレクトリルートにマップするエンティティを指定するために使用されます。

Entryクラスには、エンティティDNを表すタイプjavax.naming.Nameのフィールドで宣言された@Idアノテーションが必要です。 @Attributeアノテーションは、オブジェクトクラスフィールドをエンティティフィールドにマップするために使用されます。

4. Spring Data Repository

Spring Data Repositoryは、さまざまな永続ストアのデータアクセスレイヤーの実装をすぐに使用できる基本的なすぐに使用可能な抽象化です。

データリポジトリ内の特定のクラスのSpring Framework internally provides the implementation of CRUD operations。 完全な詳細はIntroduction to Spring Data JPAの記事にあります。

Spring Data LDAPは、LDAPディレクトリの基本的なCRUD操作を含むRepositoryインターフェースの自動実装を提供する同様の抽象化を提供します。

また、Spring Data Frameworkは、メソッド名に基づいてcustom queryを作成できます。

User Entry:を管理するために使用されるリポジトリインターフェースを定義しましょう

@Repository
public interface UserRepository extends LdapRepository {
    User findByUsername(String username);
    User findByUsernameAndPassword(String username, String password);
    List findByUsernameLikeIgnoreCase(String username);
}

ご覧のとおり、エントリUser.LdapRepositoryを拡張することでインターフェイスを宣言しました。SpringDataFrameworkは、find()findAll()save(),delete(),など。

また、いくつかのカスタムメソッドを宣言しました。 Spring Data Frameworkは、Query Builder Mechanismと呼ばれる戦略でメソッド名をプローブすることにより、実装を提供します。

5. 設定

Javaベースの@ConfigurationクラスまたはXML名前空間を使用してSpring DataLDAPを構成できます。 Javaベースのアプローチを使用してリポジトリを構成しましょう。

@Configuration
@EnableLdapRepositories(basePackages = "com.example.ldap.**")
public class AppConfig {
}

@EnableLdapRepositoriesは、Springが指定されたパッケージをスキャンして、@Repository.としてマークされたインターフェイスを探すことを示唆しています。

6. ビジネスの論理

LDAPディレクトリを操作するためにUserRepositoryを使用するサービスクラスを定義しましょう。

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // business methods
}

ここで、一度に1つのアクションを調べ、Spring Data Repositoryを使用してこれらのアクションをどれだけ簡単に実行できるかを確認します。

6.1. ユーザ認証

次に、既存のユーザーを認証するための簡単なロジックを実装しましょう。

public Boolean authenticate(String u, String p) {
    return userRepository.findByUsernameAndPassword(u, p) != null;
}

6.2. ユーザー作成

次に、新しいユーザーを作成し、パスワードのハッシュを保存しましょう。

public void create(String username, String password) {
    User newUser = new User(username,digestSHA(password));
    newUser.setId(LdapUtils.emptyLdapName());
    userRepository.save(newUser);
}

6.3. ユーザーの変更

次の方法で既存のユーザーまたはエントリを変更できます。

public void modify(String u, String p) {
    User user = userRepository.findByUsername(u);
    user.setPassword(p);
    userRepository.save(user);
}

カスタムメソッドを使用して既存のユーザーを検索できます。

public List search(String u) {
    List userList = userRepository
      .findByUsernameLikeIgnoreCase(u);

    if (userList == null) {
        return Collections.emptyList();
    }

    return userList.stream()
      .map(User::getUsername)
      .collect(Collectors.toList());
}

7. 実例

最後に、簡単な認証シナリオをすばやくテストできます。

@Test
public void givenLdapClient_whenCorrectCredentials_thenSuccessfulLogin() {
    Boolean isValid = userService.authenticate(USER3, USER3_PWD);

    assertEquals(true, isValid);
}

8. 結論

このクイックチュートリアルでは、Spring LDAPリポジトリの構成とCRUD操作の基本について説明しました。

この記事で使用されている例は、over on GitHubにあります。