我在cake php中使用自定义身份验证对象。
我在component/Auth/LdapAuthenticate.php
中创建了一个文件。在这个文件中,我有一个使用LDAP进行身份验证的函数。它看起来像这样:
App::uses('BaseAuthenticate', 'Controller/Component/Auth');
class LdapAuthenticate extends BaseAuthenticate {
public function authenticate(CakeRequest $request, CakeResponse $response) {
$username=$request->data["Users"]["username"];
$pwd=$request->data["Users"]["password"];
$ldap = ldap_connect("ldap:........");
ldap_set_option ($ldap, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
$bind = @ldap_bind($ldap, "TEST\\".$username, $pwd);
if ($bind && $pwd!="") {
//CakeLog::write('debug', "loggé");
$ldap_dn ="DC=world,DC=pcm,DC=local";
$filter = "(&(objectClass=user)(samaccountname=".$username.")(cn=*))";
$justthese = array("cn","mail","givenname","distinguishedname","memberof");
$sr=ldap_search($ldap, $ldap_dn, $filter,$justthese);
$info = ldap_get_entries($ldap, $sr);
ldap_close($ldap);
return $info;
} else {
ldap_close($ldap);
return false;
}
}
}
它在用户控制器中以这样的方式记录我:
function login(){
if ($this->request->is('post')) {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirectUrl());
}else{
$this->Session->setFlash(__('Username ou password incorrect'), 'default', array('class'=>'error-message'), 'auth');
}
我现在想要创建第二个登录控制器,它将我的用户登录到数据库。我的问题是如何创建第二个自定义身份验证对象并在正确的位置调用它?我想在函数logindist()
中使用它。将有2个页面用于身份验证,一个用于ldap连接,另一个用于数据库连接。
答案 0 :(得分:2)
我不明白你的问题。但无论如何我会盲目投篮。 我想你想支持multiply cakephp auth。 auth对象是他们为此目的。您可以附加许多对象,cakephp将按顺序检查它们,如果有任何可以识别请求,则允许访问。
$this->Auth->authenticate = array(
'databaseAuth',
'Ldap'
);
如果你的所有auth对象都使用authenticate()方法识别它们,即没有stataless,那么你不需要任何设置,只需要包含正确顺序的auth对象,cakephp将从那里接管。 相反,如果您需要首先针对数据库对您的用户进行身份验证,那么上面的设置就可以了。
但请记住,如果你需要在你的应用程序中进行并行身份验证,就像你上面说的那样,你需要手动调用identify()方法或者在auth对象中实现getUser()方法,以便cakephp Auth正常运行
public function logindist(){
$user = $this->Auth->identify();
if($user){
$this->Auth->allow();
}
// throw 403 exception
}