最初に免責事項を事前に: 投稿されたコード スニペットはすべて基本的な例です。些細な例外とその他のロジックを自分で処理する必要があります。
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 経由で通信します。おそらく安全なネットワークで誰がトラフィックを盗聴しているのかわかりません. ユーザー資格情報を扱っています。これは、特にシングル サインオン環境では、大規模な問題になる可能性があります。ばかげてはいけない。