Authenticating against an LDAP server

Symfony provides different means to work with an LDAP server.

symfony は、LDAP サーバーを操作するためのさまざまな手段を提供します。

The Security component offers:

セキュリティ コンポーネントは以下を提供します。
  • The ldap user provider, using the LdapUserProvider class. Like all other user providers, it can be used with any authentication provider.
    LdapUserProvider クラスを使用する LDAP ユーザー プロバイダー。他のすべてのユーザー プロバイダーと同様に、任意の認証プロバイダーで使用できます。
  • The form_login_ldap authentication provider, for authenticating against an LDAP server using a login form. Like all other authentication providers, it can be used with any user provider.
    ログインフォームを使用して LDAP サーバーに対して認証を行うための form_login_ldap 認証プロバイダー。他のすべての認証プロバイダーと同様に、任意のユーザー プロバイダーで使用できます。
  • The http_basic_ldap authentication provider, for authenticating against an LDAP server using HTTP Basic. Like all other authentication providers, it can be used with any user provider.
    HTTP Basic を使用して LDAP サーバーに対して認証するための http_basic_ldap 認証プロバイダー。他のすべての認証プロバイダーと同様に、任意のユーザー プロバイダーで使用できます。

This means that the following scenarios will work:

これは、次のシナリオが機能することを意味します。
  • Checking a user's password and fetching user information against an LDAP server. This can be done using both the LDAP user provider and either the LDAP form login or LDAP HTTP Basic authentication providers.
    ユーザーのパスワードを確認し、LDAP サーバーに対してユーザー情報を取得します。これは、LDAP ユーザー プロバイダーと、LDAP フォーム ログインまたは LDAP HTTP 基本認証プロバイダーの両方を使用して行うことができます。
  • Checking a user's password against an LDAP server while fetching user information from another source (database using FOSUserBundle, for example).
    別のソース (たとえば、FOSUserBundle を使用するデータベース) からユーザー情報をフェッチしながら、LDAP サーバーに対してユーザーのパスワードをチェックします。
  • Loading user information from an LDAP server, while using another authentication strategy (token-based pre-authentication, for example).
    別の認証戦略 (トークンベースの事前認証など) を使用しながら、LDAP サーバーからユーザー情報をロードする。

Installation

In applications using Symfony Flex, run this command to install the Ldap component before using it:

Symfony Flex を使用するアプリケーションでは、次のコマンドを実行して、使用する前に LDAP コンポーネントをインストールします。
1
$ composer require symfony/ldap

Ldap Configuration Reference

See Security Configuration Reference (SecurityBundle) for the full LDAP configuration reference (form_login_ldap, http_basic_ldap, ldap). Some of the more interesting options are explained below.

完全な LDAP 構成リファレンス (form_login_ldap、http_basic_ldap、ldap) については、セキュリティ構成リファレンス (SecurityBundle) を参照してください。より興味深いオプションのいくつかを以下で説明します。

Configuring the LDAP client

All mechanisms actually need an LDAP client previously configured. The providers are configured to use a default service named ldap, but you can override this setting in the security component's configuration.

実際には、すべてのメカニズムで事前に構成された LDAP クライアントが必要です。プロバイダーは、ldap という名前のデフォルト サービスを使用するように構成されていますが、セキュリティ コンポーネントの構成でこの設定をオーバーライドできます。

An LDAP client can be configured using the built-in LDAP PHP extension with the following service definition:

LDAP クライアントは、組み込みの LDAP PHP 拡張機能と次のサービス定義を使用して構成できます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/services.yaml
services:
    Symfony\Component\Ldap\Ldap:
        arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
        tags:
            - ldap
    Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
        arguments:
            -   host: my-server
                port: 389
                encryption: tls
                options:
                    protocol_version: 3
                    referrals: false

Fetching Users Using the LDAP User Provider

If you want to fetch user information from an LDAP server, you may want to use the ldap user provider.

LDAP サーバーからユーザー情報を取得する場合は、ldap ユーザー プロバイダーを使用することをお勧めします。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/security.yaml
security:
    # ...

    providers:
        my_ldap:
            ldap:
                service: Symfony\Component\Ldap\Ldap
                base_dn: dc=example,dc=com
                search_dn: "cn=read-only-admin,dc=example,dc=com"
                search_password: password
                default_roles: ROLE_USER
                uid_key: uid
                extra_fields: ['email']

Caution

注意

The Security component escapes provided input data when the LDAP user provider is used. However, the LDAP component itself does not provide any escaping yet. Thus, it's your responsibility to prevent LDAP injection attacks when using the component directly.

セキュリティ コンポーネントは、LDAP ユーザー プロバイダが使用されている場合、提供された入力データをエスケープします。ただし、LDAP コンポーネント自体はまだエスケープ機能を提供していません。したがって、コンポーネントを直接使用する場合、LDAP インジェクション攻撃を防ぐのはあなたの責任です。

Caution

注意

The user configured above in the user provider is only used to retrieve data. It's a static user defined by its username and password (for improved security, define the password as an environment variable).

上記のユーザー プロバイダーで構成されたユーザーは、データの取得にのみ使用されます。これは、ユーザー名とパスワードで定義された静的ユーザーです (セキュリティを向上させるために、パスワードを環境変数として定義します)。

If your LDAP server allows retrieval of information anonymously, you can set the search_dn and search_password options to null.

LDAP サーバーで情報の匿名取得が許可されている場合は、search_dn および search_password オプションを null に設定できます。

The ldap user provider supports many different configuration options:

LDAP ユーザー プロバイダーは、さまざまな構成オプションをサポートしています。

service

type: string default: ldap

タイプ: 文字列 デフォルト: LDAP

This is the name of your configured LDAP client. You can freely choose the name, but it must be unique in your application and it cannot start with a number or contain white spaces.

これは、構成済みの LDAP クライアントの名前です。名前は自由に選択できますが、アプリケーション内で一意である必要があり、数字で始まったり空白を含んだりすることはできません。

base_dn

type: string default: null

タイプ: 文字列 デフォルト: null

This is the base DN for the directory

これは、ディレクトリのベース DN です。

search_dn

type: string default: null

タイプ: 文字列 デフォルト: null

This is your read-only user's DN, which will be used to authenticate against the LDAP server to fetch the user's information.

これは読み取り専用ユーザーの DN であり、LDAP サーバーに対して認証を行ってユーザーの情報を取得するために使用されます。

search_password

type: string default: null

タイプ: 文字列 デフォルト: null

This is your read-only user's password, which will be used to authenticate against the LDAP server to fetch the user's information.

これは読み取り専用ユーザーのパスワードであり、LDAP サーバーに対して認証を行ってユーザーの情報を取得するために使用されます。

default_roles

type: array default: []

タイプ: 配列 デフォルト: []

This is the default role you wish to give to a user fetched from the LDAP server. If you do not configure this key, your users won't have any roles, and will not be considered as authenticated fully.

これは、LDAP サーバーから取得したユーザーに付与するデフォルトの役割です。このキーを構成しない場合、ユーザーは役割を持たず、完全に認証されたとは見なされません。

uid_key

type: string default: null

タイプ: 文字列 デフォルト: null

This is the entry's key to use as its UID. Depends on your LDAP server implementation. Commonly used values are:

これは、UID として使用するエントリのキーです。 LDAP サーバーの実装によって異なります。一般的に使用される値は次のとおりです。
  • sAMAccountName (default)
    sAMAccountName (デフォルト)
  • userPrincipalName
    ユーザープリンシパル名
  • uid
    イド

If you pass null as the value of this option, the default UID key is used sAMAccountName.

このオプションの値として null を渡すと、デフォルトの UID キーは usedsAMAccountName になります。

extra_fields

type: array default: null

タイプ: 配列 デフォルト: null

Defines the custom fields to pull from the LDAP server. If any field does not exist, an \InvalidArgumentException will be thrown.

LDAP サーバーから取得するカスタム フィールドを定義します。フィールドが存在しない場合は、\InvalidArgumentException がスローされます。

filter

type: string default: null

タイプ: 文字列 デフォルト: null

This key lets you configure which LDAP query will be used. The {uid_key} string will be replaced by the value of the uid_key configuration value (by default, sAMAccountName), and the {user_identifier} string will be replaced by the user identified you are trying to load.

このキーを使用すると、使用する LDAP クエリを構成できます。 {uid_key} 文字列は uid_key 構成値 (デフォルトでは sAMAccountName) の値に置き換えられ、{user_identifier} 文字列はロードしようとしている識別されたユーザーに置き換えられます。

6.2

6.2

Starting from Symfony 6.2, the {username} string was deprecated in favor of {user_identifier}.

Symfony 6.2 から、{username} 文字列は非推奨になり、{user_identifier} が優先されました。

For example, with a uid_key of uid, and if you are trying to load the user fabpot, the final string will be: (uid=fabpot).

たとえば、uid の uid_key を使用して、ユーザー fabpot をロードしようとしている場合、最終的な文字列は (uid=fabpot) になります。

If you pass null as the value of this option, the default filter is used ({uid_key}={user_identifier}).

このオプションの値として null を渡すと、デフォルトのフィルターが使用されます ({uid_key}={user_identifier})。

To prevent LDAP injection, the username will be escaped.

LDAP インジェクションを防ぐために、ユーザー名はエスケープされます。

The syntax for the filter key is defined by RFC4515.

フィルタ キーの構文は、RFC4515 で定義されています。

Authenticating against an LDAP server

Authenticating against an LDAP server can be done using either the form login or the HTTP Basic authentication providers.

LDAP サーバーに対する認証は、formlogin または HTTP 基本認証プロバイダーのいずれかを使用して行うことができます。

They are configured exactly as their non-LDAP counterparts, with the addition of two configuration keys and one optional key:

それらは、2 つの構成キーと 1 つのオプション キーを追加して、LDAP 以外の対応するものとまったく同じように構成されます。

service

type: string default: ldap

タイプ: 文字列 デフォルト: LDAP

This is the name of your configured LDAP client. You can freely choose the name, but it must be unique in your application and it cannot start with a number or contain white spaces.

これは、構成済みの LDAP クライアントの名前です。名前は自由に選択できますが、アプリケーション内で一意である必要があり、数字で始まったり空白を含んだりすることはできません。

dn_string

type: string default: {user_identifier}

タイプ: 文字列 デフォルト: {user_identifier}

This key defines the form of the string used to compose the DN of the user, from the username. The {user_identifier} string is replaced by the actual username of the person trying to authenticate.

このキーは、ユーザー名からユーザーの DN を構成するために使用される文字列の形式を定義します。 {user_identifier} 文字列は、認証しようとしている人の実際のユーザー名に置き換えられます。

For example, if your users have DN strings in the form uid=einstein,dc=example,dc=com, then the dn_string will be uid={user_identifier},dc=example,dc=com.

たとえば、ユーザーが DN 文字列を形式 muid=einstein,dc=example,dc=com で持っている場合、dn_string は beuid={user_identifier},dc=example,dc=com になります。

query_string

type: string default: null

タイプ: 文字列 デフォルト: null

This (optional) key makes the user provider search for a user and then use the found DN for the bind process. This is useful when using multiple LDAP user providers with different base_dn. The value of this option must be a valid search string (e.g. uid="{user_identifier}"). The placeholder value will be replaced by the actual user identifier.

この (オプションの) キーにより、ユーザー プロバイダーはユーザーを検索し、見つかった DN をバインド プロセスに使用します。これは、base_dn が異なる複数の LDAP ユーザープロバイダーを使用する場合に便利です。このオプションの値は、有効な検索文字列でなければなりません (例: uid="{user_identifier}")。プレースホルダーの値は、実際のユーザー ID に置き換えられます。

When this option is used, query_string will search in the DN specified by dn_string and the DN resulted of the query_string will be used to authenticate the user with their password. Following the previous example, if your users have the following two DN: dc=companyA,dc=example,dc=com and dc=companyB,dc=example,dc=com, then dn_string should be dc=example,dc=com.

このオプションを使用すると、query_string は dn_string で指定された DN を検索し、query_string の結果の DN を使用して、パスワードでユーザーを認証します。前の例に従って、ユーザーが dc=companyA,dc=example,dc=com および dc=companyB,dc=example,dc=com という 2 つの DN を持っている場合、dn_string は dc=example,dc=com である必要があります。

Bear in mind that usernames must be unique across both DN, as the authentication provider won't be able to select the correct user for the bind process if more than one is found.

ユーザー名は両方の DN で一意である必要があることに注意してください。複数のユーザーが見つかった場合、認証プロバイダーはバインド プロセスに正しいユーザーを選択できません。

Examples are provided below, for both form_login_ldap and http_basic_ldap.

form_login_ldap と http_basic_ldap の両方の例を以下に示します。

Configuration example for form login

  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            # ...
            form_login_ldap:
                # ...
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'uid={user_identifier},dc=example,dc=com'

Configuration example for HTTP Basic

  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            stateless: true
            http_basic_ldap:
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'uid={user_identifier},dc=example,dc=com'

Configuration example for form login and query_string

  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            # ...
            form_login_ldap:
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'dc=example,dc=com'
                query_string: '(&(uid={user_identifier})(memberOf=cn=users,ou=Services,dc=example,dc=com))'
                search_dn: '...'
                search_password: 'the-raw-password'