假設如下:
可以App/Controller/Component/Auth/MyAuthenticate.php
下創建新Authenticate
組件:
<?php
App::uses('FormAuthenticate', 'Controller/Component/Auth');
class MyAuthenticate extends FormAuthenticate {
public function authenticate(CakeRequest $request, CakeResponse $response) {
$username = $request->data['login'] ;
$password = $request->data['password'] ;
App::import('Model', 'User') ;
$userModel = new User() ;
/* Try to authenticate as a user... */
$user = $userModel->find('first', array(
'conditions' => array(
'idcard' => $username,
'password' => User::hashPassword($password) ;
)
)) ;
if ($user) {
$user = $user['User'] ; // Get only useful info
$user['type'] = 'user'; // Save user type
return $user ;
}
/* Same thing for admin. */
App::import('Model', 'Admin') ;
$adminModel = new Admin() ;
$user = $adminModel->find('first', array(
'conditions' => array(
'login' => $username,
'password' => Admin::hashPassword($password) ;
)
)) ;
if ($user) {
$user = $user['Admin'] ; // Get only useful info
$user['type'] = 'admin'; // Save user type
return $user ;
}
return null ;
}
};
你只需要確保,一個管理員不能被認證爲用戶,並扭轉。
在你AppController
:
public $components = array(
'Auth' => array(
'authenticate' => array('My'), // The prefix in front of your component
'loginAction' => array(/* ... */),
'loginRedirect' => array(/* ... */),
'logoutRedirect' => array(/* ... */),
'authError' => "...",
'authorize' => 'Controller'
)
) ;
你的登錄操作是一樣的,對正常表:
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
}
else {
$this->request->data['password'] = "" ;
$this->Session->setFlash('Invalid login/id or password.');
}
}
}
然後,在beforeFilter
或isAuthorized
您可以檢查$this->Auth->user('type');
。例如,在AppController中:
public function isAuthorized() {
/* Assuming you keep CakePHP convention where action starting with admin_ set admin params. */
if(isset($this->params['admin'])) {
return $this->Auth->user('type') == 'admin' ;
}
return true ;
}
或者,如果您希望禁用非管理員用戶訪問在AdminController
所有行動,使用beforeFilter
:
class AdminController extends AppController {
public function beforeFilter() {
if (!$this->Auth->loggedIn()) {
$this->Session->setFlash('You need to be logged to access this page.');
$this->redirect(/* Login url. */) ;
return ;
}
if ($this->Auth->user('type') != 'admin') {
$this->Session->setFlash('You need to be admin to access this page.');
$this->redirect(/* Somewhere... */) ;
return ;
}
return parent::beforeFilter() ;
}
}
這通常是已經被設計失敗。嘗試將所有用戶保留在同一個表中 - 並通過角色區分它們。 而且應該總是隻有一個登錄頁面。 保持簡單。 – mark
由於外鍵約束,我無法將所有用戶保留在同一張桌子上,例如: 員工屬於某個部門,而管理員不屬於任何位置。當然,用戶表將會有一個指向部門表的外鍵。如果我想創建一個管理員帳戶,我不能只在department_id上放置任何內容或爲null。這只是其中一個例子。我認爲設計不失敗! – codeless
@codeless爲什麼不把null放在department_id上?此外,還有其他一些方法可以設計數據庫,例如爲所有用戶共用的數據(例如,登錄名和密碼)提供用戶表,然後擁有與您關聯的管理表和常規用戶表用戶表中包含管理員或常規用戶唯一的字段。 – Kai