1

私は Yii2 の初心者で、ldap を使用してログイン システムを作成する必要があります。あまり情報がないので、どなたか教えていただけると幸いです。

edvlerblog/yii2-adldap-module をインストールしましたが、すでに認証の実装に成功しています。

私の問題は、ログイン後、高度なテンプレートを操作するのと同じ方法でユーザーの ID を取得し、Yii::$app->user 機能を使用できるようにすることです。

公式の例では、IdentityInterface を実装する User を作成しますが、ActiveRecord を使用します。

http://www.yiiframework.com/doc-2.0/yii-web-identityinterface.html

また、Yii バージョン 1 を参照する多くの例も見つけました。これは良い例です。

https://www.exchangecore.com/blog/yii-active-directory-useridentity-login-authentication/

しかし、まだ機能させることができません...おそらく概念の問題または構文の問題ですが、とにかくここで助けていただければ幸いです。

models/LoginForm.php 認証方法:

public function validatePasswordLdap($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUserLdap();
        if (!$user || !Yii::$app->ldap->authenticate($this->username,$this->password)) {
            $this->addError($attribute, 'Incorrect username or passwords.');
        }
    }
}

models/LoginForm.php ログイン方法:

public function loginLdap()
{
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUserLdap(), $this->rememberMe ? 3600 * 24 * 30 : 0);
    } else {
        return false;
    }
}

最後は getUser メソッドです。UserLdap は IdentityInterface を実装していますが、正しく行う方法がわかりません:

public function getUserLdap()
{
    if ($this->_user === false) {           
        $this->_user = UserLdap::findIdentity($this->username);
    }

    return $this->_user;
}
4

3 に答える 3

2

私は最終的にその論理を理解しました:

  • ビューにログインすると、LoginForm.php はユーザー名とパスワードを取得し、validatePasswordLdap を使用して検証します。パスワードを検証する機能をルールで指定する必要があります。

  • 次に、validate() が OK の場合、ログインで導入されたユーザー名で FindIdentity を呼び出します。この関数は IdentityInterface オブジェクトを返す必要があるため、最初に User オブジェクトを作成し、パラメータ (電子メール、電話番号、名前など) を設定して返す必要があります。

  • サイト全体でログイン/ログアウト機能と isGuest を使用するには、以下の loginLdap 関数のようにして、このユーザー オブジェクトを Yii::$app->user->login メソッドに渡すだけです。

コードは次のようになります。

ログインフォーム.php

public function rules()
{
    return [
        // username and password are both required
        [['username', 'password'], 'required'],
        // rememberMe must be a boolean value
        ['rememberMe', 'boolean'],
       // password is validated by validatePassword()
        ['password', 'validatePasswordLdap'],
    ];
}


public function validatePasswordLdap($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUserLdap();
        if (!$user || !Yii::$app->ldap->authenticate($this->username,$this->password)) {
            $this->addError($attribute, 'Incorrect username or passwords.');
        }
    }
}

public function loginLdap()
{
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUserLdap(), $this->rememberMe ? 3600 * 24 * 30 : 0);
    } else {
        return false;
    }
}

ユーザー.php

public static function findIdentity($id)
{

    $new_identity = new User();

    if ($user_ldap_info = Yii::$app->ldap->user()->infoCollection($id, array("*"))){
        $new_identity->setId($user_ldap_info->samaccountname);
        $new_identity->setEmail($user_ldap_info->mail);
        $new_identity->setUsername($user_ldap_info->displayName);   
    }

    return $new_identity;
}

public function setEmail($email)
{
    $this->email = $email;
}

public function setUsername($username)
{
    $this->username = $username;
}

public function setId($id)
{
    $this->id = $id;
}

LoginForm.php の内部

public function getUserLdap()
{
    if ($this->_user === false) {           
        $this->_user = User::findIdentity($this->username);
    }

    return $this->_user;
}

編集: ベンダー ADLDAP の更新により、findIdentity を次のように変更する必要がありました。

public static function findIdentity($id)
{
    $new_identity = new User ();

    if ( $user_ldap_info = Yii::$app->ldap->users()->find($id) ) {
        $new_identity->setId ( $user_ldap_info->samaccountname [0] );
        $new_identity->setEmail ( $user_ldap_info->mail[0] );
        $new_identity->setUsername ( $user_ldap_info->givenname [0] );
    }

    return $new_identity;
}
于 2015-05-06T07:22:06.777 に答える
0

私は、Daniel Stolf が彼の記述の実際の例を公開していることを知りたいと思っていました。

検索中に、これが最新の Larvel 5.1 で達成されているかどうか疑問に思ったところ、次のことがわかりました。

https://libraries.io/github/sroutier/laravel-5.1-enterprise-starter-kit

sroutier/eloquent-ldap を使用したオプションの LDAP/AD 認証。次のオプションがあります。

Automatically creates local account for LDAP/AD users on first login.
Automatically assign to matching local roles based on LDAP/AD group membership.
Refresh role assignment on login.

これはまさに私が探していたものです.Yii2フレームワークを使用することを好みましたが、Yii2にはそのような機能が1つに拡張されていないため、Laravelに移行すると思います。

これは、Konrad が親切にも Yii2 用にこのガイドを書き直さない限りです: http://blog.realhe.ro/windows/yii-role-mapping-based-on-active-directory

于 2015-10-09T12:54:21.307 に答える
0

最初に免責事項を事前に: 投稿されたコード スニペットはすべて基本的な例です。些細な例外とその他のロジックを自分で処理する必要があります。


Yii2 アドバンス テンプレートを使用して簡単な AD 認証を実現するための高速ハックを投稿します。このテンプレートは、ユーザー名とパスワードを取得し、MS Active Directory ドメイン コントローラーに対してこの組み合わせを認証します。さらに、ユーザーの特定のグループ メンバーシップをチェックするため、このグループのユーザーのみがログインできます。

次のように仮定します。

  • ユーザー (特にusername ) は、現在のユーザー テーブルに存在する必要があります ( rbac構造を構築するには 、 Authorization Guideを参照してください)。さらに、データベースからのユーザー名は、AD に対して認証するユーザー名と同じであると想定しています。
  • Yii2 用のAdldap2ラッパー ( alexeevdv/yii2-adldap など)を正しくセットアップするか、Adladp2 をベンダー モジュールとしてロードします。ラッパーの利点: アプリケーション構成のコンポーネント セクションで adldap2 クラスを構成すると、ラッパーを Yii2 コンポーネントとして使用できます。
  • PHP 環境は LDAP 拡張機能を使用します (たとえば、debian ディストリビューションではapt-get install php5-ldapなどを実行します)。
  • ドメインコントローラーに接続するための管理者資格情報があり、必要な方法で AD にクエリを実行する権限があります。

それでは、基本的なセットアップから始めましょう。

ラッパー構成をセットアップします (例: config/main-local.php)。

'components' => [
    'ldap' => [
        'class' => 'alexeevdv\adldap\Adldap',
        'options' => [
            'account_suffix' => '@stackoverflow.com',
            'domain_controllers' => ['dc1.stackoverflow.com', 'dc2.stackoverflow.com'],
            'base_dn' => 'dc=stackoverflow,dc=com',
            'admin_username' => 'someusername',
            'admin_password' => 'somepassword',
            'use_ssl' => true,
            'port' => '636'
        ],
    ],
],

LDAP認証とローカル認証を簡単に切り替えたい。グローバルにアクセス可能なアプリケーション パラメーターを持つように、いくつかのローカル パラメーターを構成します (例: config/params-local.php)。

return [
    'adminEmail' => 'admin@example.com',
    'authOverLdap' => true,
    'ldapGroup' => 'someldapgroup',
];

LoginForm.php、特にvalidatePassword関数 (例: common/models/LoginForm.php) を編集します。

/**
 * Validates the password.
 * This method serves as the inline validation for password.
 * If the authOverLdap attribute is set in the params config,
 * user and password will be authenticated over ldap
 *
 * @param string $attribute the attribute currently being validated
 * @param array $params the additional name-value pairs given in the rule
 */
public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        // to switch between the auth-methods
        $authOverLdap = \Yii::$app->params['authOverLdap'];
        if ($authOverLdap) {
            if (!$user || !$user->validateCredentialsOverLdap($user->username, $this->password)) {
                $this->addError($attribute, 'Some error text.');
            }
        } else {
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Some error text.');
            }
        }
    }
}

LDAP 認証を処理するユーザー モデル (例: /common/models/User.php)にvalidateCredentialsOverLdap関数を追加します。

/**
 * Validates a user/password combination over ldap
 *
 * @param string $username username to validate over ldap
 * @param string $password password to validate over ldap
 * @return boolean if the provided credentials are correct and the user is a member of **ldapGroup**
 */
public function validateCredentialsOverLdap($username, $password)
{
    $authSuccess = false;
    // checking the supplied credentials against the ldap (e.g. Active Directory)
    // first step: the user must have a valid account
    // second step: the user must be in a special group
    $authOk = \Yii::$app->ldap->authenticate($username, $password);
    if ($authOk) {
        $adUser = \Yii::$app->ldap->users()->find($username);
        // the user must be in special group (set in Yii params)
        if($adUser->inGroup(\Yii::$app->params['ldapGroup'])) {
            $authSuccess = true;
        }
    }

    return $authSuccess;
}

免責事項:

  • これらのスニペットをコピーして貼り付けないでください。あなたは何をしているのかを知らなければなりません!
  • これは例を示し、ラッパーと Yii2 フレームワークで AD 認証を実現するためのヒントを提供します。
  • このコードをウォールド ガーデンイントラネットで実行します。
  • SSLのような安全なレイヤーを使用して、LDAP 経由で通信しますおそらく安全なネットワークで誰がトラフィックを盗聴しているのかわかりません. ユーザー資格情報を扱っています。これは、特にシングル サインオン環境では、大規模な問題になる可能性があります。ばかげてはいけない。
于 2016-03-18T07:51:58.963 に答える