CakePHP3で開発をしています。
Auth機能を使ってLDAP認証をしたいと考えています。
認証はデータベースのパスワードを使わずに
Ldapのパスワードで認証をかけようとしています。
今の仕様だとパスワードの選択を外しても
必ずDBのテーブルでハッシュ化されたパスワード認証する仕様になっています。
そこで以下のsrc/Controller/AppControllerの編集と
src/Auth/LdapAuthenticate.phpを作成し、実装しました。
しかしながら、「Authentication adapter "Ldap" was not found. 」
というエラーになりLdap認証してくれません。
どうすればLDAPの認証ができるのか
特に知りたいのは以下の2点です。
- - Ldapの情報を認証時にLDAPAuthentication.phpのauthenticateを反応させること
-
- データベースでのパスワード認証をしないsrc/Controller/AppController.php
/src/Controller/AppController.php
php
1 2<?php 3namespace App\Controller; 4 5use Cake\Controller\Controller; 6use Cake\ORM\Query; 7 8class AppController extends Controller { 9 public function initialize() { 10 parent::initialize(); 11 12 $this->loadComponent('Flash'); 13 $this->loadComponent('Auth', [ 14 'authorize' => 'Controller', 15 'authenticate' => ['Ldap'], 16 'loginRedirect' => [ 17 'controller' => 'Users', 18 'action' => 'index' 19 ], 20 'logoutRedirect' => [ 21 'controller' => 'Users', 22 'action' => 'login' 23 ], 24 'authError' => __('現在はログイン状態ではありません。再度ログインをお試しください。') 25 ]); 26 27 $this->Auth->config('authorize', ['Ldap']); 28 $this->Auth->authenticate = array('Ldap'); 29 30 $this->Auth->allow(['view', 'display']); 31 } 32 33 public function isAuthorized($user) { 34 // Admin can access every action 35 if (isset($user['role_id']) && $user['role_id'] === 1) { 36 return true; 37 } 38 // Default deny 39 return false; 40 } 41} 42
src/Auth/LdapAuthorize.php
php
1 2<?php 3namespace App\Auth; 4 5use Cake\Auth\BaseAuthorize; 6use Cake\Network\Request; 7use Cake\Network\Response; 8use Cake\Error\FatalErrorException; 9 10class LdapAuthorize extends BaseAuthorize { 11 protected $_host = 'xxx.xxx.xxx.xxx'; 12 13 public function authenticate(Request $request, Response $response) { 14 $username = $request->data['username'] ; 15 $password = $request->data['password'] ; 16 17 $ds = ldap_connect($this->_host) ; 18 if (!$ds) { 19 throw FatalErrorException ('Unable to connect to LDAP host.') ; 20 } 21 $basedn = "your ldap query... "; 22 $dn = "uid=$username, ".$basedn; 23 $ldapbind = @ldap_bind($ds, $dn, $password); 24 if (!$ldapbind) { 25 return false ; 26 } 27 // Do whatever you want with your LDAP connection... 28 $entry = ldap_first_entry ($ldapbind) ; 29 $attrs = ldap_get_attributes ($ldapbind, $entry) ; 30 $user = [] ; 31 // Loop 32 for ($i = 0 ; $i < $attrs["count"] ; $i++) { 33 $user[$attrs[$i]] = ldap_values ($ldapbind, $entry, $attrs[$i])[0] ; 34 } 35 ldap_unbind ($ldapbind) ; 36 return $user ; 37 } 38 39 public function authorize($user, Request $request) { 40 if ($user['username'] == 'ad-auth') { // where username is logged on ldap user on a computer. 41 return true; 42 } 43 } 44} 45
ちなみにQueenCityCodeFactory\LDAPはcomposerで
インストールできなかったので不安定かなと思い
利用しないようにしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。