CakePHP Auth有两个表(型号)

时间:2014-07-08 15:49:01

标签: cakephp authentication components

我的数据库中有两个表,一个用于管理员(名为Admins),另一个用于普通用户,名为:utilisateurs(法语)。我知道我必须使用cakePHP的约定,它说我必须创建一个名为users的表,其中包含用户名和密码字段。但问题是我有两张桌子,而不仅仅是一张桌子。每个人都有自己的特定领域,所以我真的需要他们保持分离。甚至登录所需的信息也因用户而异:

  • 管理员需要他们的登录名+密码

  • 普通用户需要特定ID(在他们的身份证中)+密码

我想要做的是创建两个登录页面,一个用于管理员,另一个用于普通用户。登录后,用户将被重定向到他应该看到的页面。但是,如果用户尝试尝试禁止的位置。我希望能够阻止他(在我认为之前是过滤器+是授权的)

我怎样才能完成所有这些工作?

我不是cakephp的初学者,我已经使用Auth Component在anotehr应用程序中创建了一个身份验证系统,但它更容易,因为用户只需要一个表。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

假设如下:

  • 您有2个与模型UserAdmin相关联的表格,其中:
    • User包含idcardpassword个字段。
    • Adminloginpassowrd字段。
  • 使用User::hasPasswordAdmin::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.');
        }
    }
}

然后,在beforeFilterisAuthorized中,您可以查看$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 () ;
    }

}