我的数据库中有两个表,一个用于管理员(名为Admins),另一个用于普通用户,名为:utilisateurs(法语)。我知道我必须使用cakePHP的约定,它说我必须创建一个名为users的表,其中包含用户名和密码字段。但问题是我有两张桌子,而不仅仅是一张桌子。每个人都有自己的特定领域,所以我真的需要他们保持分离。甚至登录所需的信息也因用户而异:
管理员需要他们的登录名+密码
普通用户需要特定ID(在他们的身份证中)+密码
我想要做的是创建两个登录页面,一个用于管理员,另一个用于普通用户。登录后,用户将被重定向到他应该看到的页面。但是,如果用户尝试尝试禁止的位置。我希望能够阻止他(在我认为之前是过滤器+是授权的)
我怎样才能完成所有这些工作?
我不是cakephp的初学者,我已经使用Auth Component在anotehr应用程序中创建了一个身份验证系统,但它更容易,因为用户只需要一个表。
非常感谢您的帮助。
答案 0 :(得分:0)
假设如下:
User
和Admin
相关联的表格,其中:
User
包含idcard
和password
个字段。Admin
有login
和passowrd
字段。User::hasPassword
和Admin::hasPassword
函数对密码进行哈希处理。您的登录表单创建如下:
echo $ this-> Form-> create(null,''); echo $ this-> Form-> input(' login'); echo $ this-> Form-> input(' password'); echo $ this-> Form-> end(__(' Submit'));
您可以在Authenticate
下创建新的App/Controller/Component/Auth/MyAuthenticate.php
组件:
<?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 () ;
}
}