【问题标题】:CakePHP Auth component - isAuthorized() function issueCakePHP Auth 组件 - isAuthorized() 函数问题
【发布时间】:2011-10-08 01:07:29
【问题描述】:

我的学生控制器中有以下 isAuthorized() 函数:

function isAuthorized() {
    $studentId = $this->Auth->user('id');
    $studentEmail = $this->Auth->user('email');
    if ($this->Auth->user('active') == 1 && $this->Auth->user('level_complete') != 1) {
        $this->Auth->loginRedirect = '/classrooms/view';
        return true;
    } elseif (!$this->Student->hasPayed($studentId)) {
        $this->Session->write('Payment.student_id', $studentId);
        $this->Session->write('Payment.student_email', $studentEmail);
        $this->Session->write('Payment.examScore', $this->Student->getPlacementScore($studentId));
        $this->Auth->logout();
        $this->redirect(array('controller'=>'payments', 'action'=>'pay'));  
    } elseif ($this->Auth->user('level_complete') == 1) {
        $this->Session->write('Payment.student_id', $studentId);
        $this->Session->write('Payment.student_email', $studentEmail);
        $this->Auth->logout();
        $this->redirect(array('controller' => 'payments', 'action' => 'repay'));
    } else {
        $this->Auth->logout();
        $this->redirect(array('controller' => 'students', 'action' => 'disabled'));
    }


    return false;
}

这个方法基本上涵盖了四种可能的状态:

  1. 用户处于活动状态且尚未完成关卡 = 已授权
  2. 用户尚未付款 = 未授权
  3. 用户已完成一个关卡,必须再次付费 = 未授权
  4. 用户帐户未激活

我遇到的问题是我的标题中有一个登录表单,我可以从任何控制器登录。如果我从除 Student Controller 以外的其他控制器登录,则不会调用 isAuthorized() 方法,即使用户无法登录,也可以登录。

有什么想法吗?


编辑:在检查 API 对 isAuthorized() 方法的定义后,我认为该方法仅在学生控制器的操作被请求时才被调用。那我还能在哪里实现这个逻辑呢?谢谢

【问题讨论】:

  • 你在用beforeFilter()吗?
  • 是的,在 beforeFilter() 中设置 Auth 组件,但不适用于此逻辑。我虽然在用户尝试登录时调用了 isAuthorized() 方法。
  • 您在每个控制器中都有登录操作?

标签: php cakephp


【解决方案1】:

你把事情搞砸了。 isAuthorized() 方法仅在用户登录时调用。

这意味着 cake 将逻辑分为两部分:

1) 用户必须登录才能看到访问操作是由 $this->Auth->allow() 方法控制的(在控制器的 beforeFilter 内)。这告诉 cake 用户是否必须登录才能看到操作。

2) 用户必须通过 isAuthorized() 方法。仅当 $this->Auth->authorize 设置为“控制器”时。

因此,如果您希望用户必须登录才能从控制器 C 访问操作“X”,则必须在您的 C 控制器中输入以下代码:

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

之后,如果您想对此进行更多控制(例如,如果用户角色是“admin”),那么您必须在您的 isAuthorized() 方法中执行此操作。

希望对你有帮助。

【讨论】:

  • 这不是我想要的。我需要测试与用户相关的特定条件,例如,如果用户没有提交付款,他应该在尝试登录后被重定向到付款页面。
  • 那你要改变的是你的登录方式!你必须采取不同的行动。不要让他登录。
  • 我是否应该编写自己的 login() 函数,包括所有这些逻辑,然后如果他获得授权,则手动登录?
  • 不!首先检查您是否让他们登录。我确定您已经在 UsersController 中创建了一个 login() 方法,该方法在某处调用 $this->Auth->login()。在调用 Auth->login() 之前,检查这些条件,如果你愿意,不要记录他。
  • 没错。这就是我会尝试做的。格拉西亚斯
【解决方案2】:

我通常将这样的逻辑放在我的 Auth 控制器(即 UsersController)的 login() 方法中。

但是,我不认为您对isAuthorized() 的理解是错误的。不幸的是,我确实认为连接起来更困难。

例如:

  • 如 santiagobasulto 所述,您需要确保已配置 Auth->authorize = 'controller'。
  • 如果您使用 any beforeFilters(),请确保您拨打的是 parent::beforeFilter()。您可能在某个关键区域忘记了这一点,这使 Cake 无法在其他登录操作中访问您的功能。

【讨论】:

  • 你如何在 login() 方法中完成这个?您使用 $this->data 中的值通过电子邮件地址查找用户?谢谢
  • 当然。或者您可以先致电Auth->login(),使用上面的确切代码。在登录之前或之后执行此操作完全取决于您的天气。但是,在 登录 之后往往更有意义,因为您已经确保您拥有一个有效的用户。
猜你喜欢
  • 2012-03-20
  • 2011-05-09
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多