【问题标题】:CakePHP Auth Deny Admin Routing PagesCakePHP Auth 拒绝管理员路由页面
【发布时间】:2011-11-05 10:59:59
【问题描述】:

我整个下午都在阅读 Stack Overflow 问题,试图弄清楚这一点..

我有一个具有索引/登录/注销/注册功能的用户控制器,但也有 admin_index/admin_add/admin_edit/admin_delete 等。

我启用了 Auth 组件,并且在我的 users_controller 中,如果 Auth.User.role != 'admin',我试图拒绝访问 admin_* 页面,当我启用 $this->Auth->authorize = 'controller'; 时,它拒绝访问 site.com/admin/users/ 页面即使我的帐户的角色设置为管理员,似乎也终止了注销功能。

但是,如果我输入网址,我会被重定向回主页。

users_controller.php

<?php
class UsersController extends AppController {

    var $name = 'Users';

    function beforeFilter(){
        parent::beforeFilter();
        $this->Auth->authorize = 'controller';
        $this->Auth->allow('register');
    }

    function isAuthorized() {
        if ($this->Auth->user('role') != 'admin') {
            $this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
        }
    }

app_controller.php

<?php
class AppController extends Controller {

    var $components = array('Auth', 'Session');

    function beforeFilter() {
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login', 'admin'=>false);
        $this->Auth->logoutRedirect = array('controller'=>'users','action'=>'logout');
        $this->Auth->loginRedirect = array('controller'=>'shows', 'action'=>'index');
        $this->Auth->autoRedirect = false;
        $this->Auth->allow('home');
    }

我的第二个问题与 $this-&gt;Auth-&gt;deny('page'); 重定向用户的方式有关,据我所知它重定向到 / 但我需要它重定向回用户控制器。

希望这一切都有意义,我已经提供了足够的信息..

【问题讨论】:

    标签: cakephp roles authentication


    【解决方案1】:

    问题的根源可能是您的 isAuthorized() 方法。这应该只返回 true 或 false,并指示经过身份验证的用户是否有权访问特定操作。

    很难说为什么您会被重定向到主页而不是登录页面。但也有可能你在某处有其他代码搞砸了。

    尝试如下修改您的代码,看看这是否有助于使事情正常运行:

    app_controller.php

    <?php 
    class AppController extends Controller {
        var $components = array('Session', 'Auth' => array(
            'loginAction' => array('controller'=>'users','action'=>'login', 'admin'=>false),
            'logoutRedirect' => array('controller'=>'users','action'=>'logout'),
            'loginRedirect' => array('controller'=>'shows', 'action'=>'index'),
            'autoRedirect' => false,
            'authorize' => 'controller'
        );
    
    function beforeFilter() {
        $this->Auth->allow('home');
    }
    
    function isAuthorized() {
        if (!empty($this->params['prefix']) && $this->params['prefix'] == 'admin') {
            if ($this->Auth->user('role') != 'admin') {
                return false;
            }
        }
        return true;
    }
    ?>
    

    users_controller.php

    <?php
    class UsersController extends AppController {
    
    var $name = 'Users';
    
    function beforeFilter(){
        parent::beforeFilter();
        $this->Auth->allow('register');
    }
    ?>
    

    我将所有 Auth 设置移至 $components 变量中的声明,因为它看起来更简洁,并且在那里声明默认值更有意义。但这更多是个人喜好问题,它不应该对代码的功能产生真正的影响。

    另外,请注意,如果您将 autoRedirect 设置为 false,则必须在您的 Users::login() 操作中手动重定向已登录的用户,并通过 $this-&gt;Auth-&gt;redirect() 获取 loginRedirect 值。

    当您未登录并尝试访问被阻止的操作时,我看不出您应该被发送到 / 的任何原因,但在您解决上述问题后可能会更容易弄清楚。 **

    【讨论】:

    • 作品请客!!!谢谢!我确实以用户身份测试了登录并尝试转到 site.com/admin/users/ 它拒绝了我,但仍然将我重定向回 / 而不是显示/索引 ...有什么想法吗?还是我应该提出一个新问题?
    • 您是以管理员用户身份登录的用户,角色 == 'admin'?如果您希望用户在登录时被重定向到 site.com/shows/,请从 AuthComponent 配置中删除读取 'autoRedirect' => false 的行。另外,我刚刚注意到您的 logoutRedirect 很奇怪。这应该是用户在注销后被重定向到的位置。也许尝试删除 AppController 中的 autoRedirect 和 logoutRedirect 行,然后看看事情是如何工作的。
    • 如果普通用户尝试访问/admin/ 页面,则无法正确重定向。关于如何解决这个问题的任何想法?
    • @waspinator - 没有看到你的代码很难说。我建议创建一个新问题并包含您遇到问题的代码,而不是尝试在这些 cmets 中解决它。
    【解决方案2】:

    你应该这样做......

           function beforeFilter()
            {
            if($this->Auth->user('role')=='admin'){
             $this->Auth->allow('admin_view','admin_controls');//put your all admin actions separated by comma
    
             }
    else
    {
    $this->Auth->allow('home');//put your all non-admin actions separated by comma
    }
    
    
        }
    

    希望它会起作用...如果有任何问题请告诉我...

    【讨论】:

    • 我刚刚尝试了这个解决方案,现在如果没有经过身份验证,我将无法注册页面,并且登录后无法访问任何 admin_ 页面。
    • 如果用户以任何其他角色登录,他也可以看到此页面。如果用户没有管理员角色,我发现的方法是使用重定向。 Auth->allow 或 Auth->deny 都失败
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多