【问题标题】:Cakephp 2.x Authentication Prefix admin and agentCakephp 2.x 身份验证前缀管理员和代理
【发布时间】:2013-08-23 19:52:00
【问题描述】:

我正在用 cakephp 编写一个应用程序,在那里我将拥有管理员和代理,他们可以在其中登录系统。管理员将具有与代理不同的布局。我已经创建了用户表,我在其中添加了一个角色字段(管理员,代理),我在 core.php 中添加了前缀

Configure::write('Routing.prefixes', array('admin','agent'));

我设法为管理员创建了登录和注销,但我仍然很困惑我应该如何继续其余的工作。例如,我不明白 beforeFilter() 和 isAuthorized() 函数是如何工作的。我如何检查用户是否可以访问该功能。如果有人尝试访问此页面 domain.com/admin 以重定向到 admin/login page ,也会进行重定向。

谢谢。

【问题讨论】:

    标签: cakephp authentication routing prefix


    【解决方案1】:

    要检查每个角色的津贴,我认为最好在每个控制器的基础上使用 Auth->allow([...])。

    我发现最好在 Controller::beforeFilter() 中使用:

    switch ($role) {
      case 'admin': 
        $this->Auth->allow(...); //Allow delete
        //notice no break; statement, so next case will execute too if admin
      case 'manager':
        $this->Auth->allow(...); //Allow edit
      case default: 
        $this->Auth->allow(...); //Allow index
    }
    

    虽然您可以签入 AppController,但我不想记住在只编辑一个文件时更改两个文件。

    【讨论】:

      【解决方案2】:

      使用 beforeFilter() 来控制对每个操作的访问,下面的示例将只允许访问视图和索引操作 - 任何其他操作都将被阻止:

      $this->Auth->allow('view', 'index');
      

      如果您想允许访问控制器中的所有操作,请在您的前置过滤器中尝试此操作:

      $this->Auth->allow();
      

      要控制谁可以访问您可以使用应用控制器中的简单函数,如下所示:

      protected function _isAuthorized($role_required) {
                if ($this->Auth->user('role') != $role_required) {
                       $this->Session->setFlash("your message here...");
                       $this->redirect("wherever you want the user to go to...");
                  }
         }
      

      在您的控制器操作中,例如。 admin_delete 在第一行,您将执行以下操作:

      $this->_isAuthorized('admin');
      

      最后重定向是这样工作的:

      $this->redirect(array('controller' => 'home', 'action' => 'dashboard'));
      

      如果您在同一个控制器中进行重定向,只需执行以下操作:

      $this->redirect('dashboard');
      

      希望这会有所帮助。

      【讨论】:

      • 您好,感谢您的回答,我认为现在已经很清楚了。是否有更好的方法来检查用户是否具有权限而不是检查每个操作中的权限?
      【解决方案3】:

      我通常做的是将我的 App 控制器扩展为 AdminAppController 和 SiteController ,在 AdminAppController 我的 beforeFilter 中有以下代码:

      $controller = strtolower($this->params["controller"]);
      $action = strtolower($this->params["action"]);
      $crole = $this->Auth->user("role");
      $allowed = false;
      $roles = array(
      
         "all"=>array("user#login","user#register","user#forgot"),
         "admin"=>array("pages#index","pages#view")
      );
      
       if(in_array($controller."#".$action,$roles["all"])){
      
       $allowed = true;
      }else{
      
         if(in_array($controller."#".$action,$roles[$crole])){
             $allowed = true;
           }
      
      
      
      }
      
      
      if($allowed==false){
      $this->setFlash("Access denied message...");
      $this->redirect("...");
      }
      

      不知道这是否是最佳做法,但效果很好。我通常讨厌 CakePHP 内置的授权系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2011-11-09
        • 2011-09-18
        相关资源
        最近更新 更多