【问题标题】:Deny certain controller action permission in CakePHP在 CakePHP 中拒绝某些控制器操作权限
【发布时间】:2010-10-25 07:43:33
【问题描述】:

这个想法很简单。如果您没有登录,您将无法访问注册和登录页面旁边的任何页面。如果您已登录,则可以访问除注册页面之外的所有页面。

现在,其中一半是通过使用 CakePHP 的 Auth 组件实现的。这会在未登录时限制访问,并在登​​录时允许访问。

我在这样做时偶然发现的问题是在登录时限制对注册页面的访问。我尝试了不同的方法,结果都一样:注册页面仍然可以访问。

需要一些帮助,因为我遇到了这个问题。

这是我的部分代码(UsersController 类中的 beforeFilter();register() 将是此控制器中的操作):

function beforeFilter(){
    parent::beforeFilter();

    $this->Auth->allow("register");

    if($this->Auth->user()){//if user is logged in...
        $this->Auth->deny("register");//...deny his access to register and login page
    }
}

【问题讨论】:

    标签: authentication cakephp permissions


    【解决方案1】:
    function register()
    {
        if ($this->Auth->user())
        {
            $this->redirect('someOtherPage');
            // or exit;
        }
        //other stuff
    }
    

    【讨论】:

    • 感谢您的回答。它有效,但我正在寻找一个更优雅的解决方案。当我想允许/拒绝权限时,我不想弄乱所有控制器操作。我更喜欢在 beforeFilter() 方法中定义所有内容,使用 Auth 提供的 allow() 和 deny() 方法。
    • 我的理解是这仅适用于一个操作/页面。如果您需要对更多页面进行更多控制,则应查看 ACL。一旦你了解它,它真的没有那么难。
    • 我发现有时最好选择可行的方法并继续做其他事情,而不是追求更优雅的解决方案。但是,我确实记得 deny() 函数存在问题,即它不起作用。
    • 我看的越多,我就越不同意在前置过滤器中执行它是一个优雅的解决方案 - 当您只想过滤一个操作时,该控制器上的每个操作都将针对该条件进行测试.我认为我的解决方案是一种优雅的解决方案,尤其是在它有效的时候;)
    • +1 我也认为 this 是最优雅的解决方案。您只需将您的想法从“如果用户已经注册,我想拒绝用户访问注册操作”转换为“如果用户已经注册,我们将把他扔回主页。”这对用户来说也更有意义。 拒绝一个动作意味着用户将被重定向到登录页面,这根本没有任何意义,因为用户已经登录了。
    【解决方案2】:

    尝试这样做:

    function beforeFilter() {
        $this->Auth->authorize = 'controller';
        $this->Auth->allow('register');
    }
    
    function isAuthorized() {
        if ($this->Auth->user()) {
            $this->Auth->deny('register');
        }
    }
    

    更新:可能更清洁的解决方案是

    function beforeFilter() {
        $this->Auth->authorize = 'controller';
        if(is_null($this->Auth->user())) {
            $this->Auth->allow('register');
        }
    }
    

    【讨论】:

    • 也试过了。很遗憾,没有变化。
    • 查看了那个,没有任何帮助。我已经有了 parent::beforeFilter() 并调用了 isAuthorized() 方法。任何其他想法,因为我开始对这个问题发脾气......
    • 把上面的代码放到app_controller.php中,在UsersController中注释beforeFilter()方法
    • 这样做了,问题只解决了一半。也就是说,只有注册页面在未登录时可用(好),而注册页面在登录时仍然可用(坏)。
    猜你喜欢
    • 2013-08-15
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多