在 CakePHP 中使用不同的用户角色登录?

Posted

技术标签:

【中文标题】在 CakePHP 中使用不同的用户角色登录?【英文标题】:Logging in using different user roles in CakePHP? 【发布时间】:2013-07-22 11:06:15 【问题描述】:

我正在使用 Cakephp 制作一个系统,其中用户可以是 A、B 或 C。比如学生、教师和其他角色。是否可以让他们都通过 1 个链接登录?所以不是 /students/login 和 /teachers/login,而是像 www.somewebsite/login 这样的东西?

【问题讨论】:

【参考方案1】:

Read this tutorial,它完全涵盖了您的要求。还有read this section。

为不同类型的用户设置不同的控制器根本没有任何意义,你只会重复代码。如果您需要根据角色采取不同的操作,您可以在您的登录方法中执行此操作,方法是在您的 login() 方法中调用另一个方法,如 afterStudentLogin() 并在那里执行角色特定的操作。这样做的原因是单个方法应该始终只执行一项任务,因此您可以在单独的方法中将角色特定代码与其分离。

public function login() 
    if ($this->Auth->user()) 
        /* ... */
        $callback = 'after' . $this->Auth->user('role') . 'Login');
        $this->$callback($this->Auth->user());
        /* ... */
    

即使用户类型非常不同,他们都有一个共同点:登录。在这种情况下,有一个用户表,例如 student_profils 表和 teacher_profiles 表。如果差异只是几个字段,我会将它们全部放在一个表中,例如 profiles

如果您想使用 /login 而不是 /users/login,您应该使用 routing。

Router::connect(
    '/login',
    array(
        'controller' => 'users',
        'action' => 'login'
    )
);

您还可以选择look at this Users plugin,它涵盖了许多与用户相关的常见任务。还有here is a simple multi-role authorization adapter。

【讨论】:

您也可以使用TinyAuth 作为身份验证适配器。如果你只有这 3 个角色,那将是小菜一碟。【参考方案2】:

一个基于用户组的简单基本登录功能如下所示

<?php
public function login()        

        //if user already logged in call routing function...
        if($this->Session->read('Auth.User')) 
            $this->routing();
        

        if ($this->request->is('post')) 

            if ($this->Auth->login())  

                //if user status is active...
                if ($this->Auth->user('status') == 1) 

                    //redirect users based on his group id...
                    if($this->Auth->User('group_id')==1)
                        $this->redirect($this->Auth->redirect('/admins/dashboard'));
                     
                    else if($this->Auth->User('group_id')==2)
                        $this->redirect($this->Auth->redirect('/teachers/dashboard'));
                     
                    else if($this->Auth->User('group_id')==3)
                        $this->redirect($this->Auth->redirect('/students/dashboard'));
                    
                 
                else

                    $this->Session->delete('User');
                    $this->Session->destroy();
                    $this->Session->setFlash('Your account is not yet activated. Please activate your account to login.', 'warning');
                

             
            else 
                $this->Session->setFlash('Your username or password was incorrect.', 'error');
            
        
    

//just route the loggedin users to his proper channel...
public function routing() 

        if($this->Session->read('Auth.User.Group.id') == 1) 
            $this->redirect('/admins/dashboard');
         
        else if($this->Session->read('Auth.User.Group.id') == 2) 
            $this->redirect('/teachers/dashboard');
        
        else if($this->Session->read('Auth.User.Group.id') == 3) 
            $this->redirect('/students/dashboard');
         
        else 
            $this->Session->destroy();
            $this->redirect('/');
        
       
?>

【讨论】:

以上是关于在 CakePHP 中使用不同的用户角色登录?的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 从不同视图登录

Cakephp - 多个视图一个控制器-功能

CakePHP Auth 组件中的角色

cakephp 避免登录用户访问其他用户的帐户

用户角色的不同目标 URL

Cakephp 3 - 如何在验证过程中检索“表”类中的当前登录用户?