【问题标题】:CakePHP 2.x Auth ConditionCakePHP 2.x 认证条件
【发布时间】:2012-09-11 19:09:50
【问题描述】:

在我的用户身份验证中,我需要为登录设置一个条件(已验证 = 1)。我知道我应该可以这样做:

$this->Auth->userScope = array('User.verified' => '1');

我在 AppController 和我的 UsersController beforeFilter 函数中尝试了这个,但它没有做任何事情。我还需要为此配置什么吗?

我最终做了(AppController):

public function isAuthorized($user) {

if ($user['verified'] == '0') { 
$this->Session->setFlash('You need to verify your Account first.');
return false;
}

return false;
}

这似乎不优雅,因为应该有正确的 (userScope) 方法来执行此操作,而且我现在在验证 = 0 时得到两个 Flash:第一个是上面的 setFlash,第二个是常规身份验证错误。

我检查了 Docs 和 stackoverflow,但我发现关于这个主题的信息很少。

【问题讨论】:

标签: cakephp authentication login conditional-statements


【解决方案1】:

CakePHP 2.x:

public $components = array(
    'Auth' => array(
        'loginAction' => array(
            'controller'    => 'users',
            'action'        => 'login'
        ),
        'authError' => 'Je hebt geen toegang tot dit gedeelte',
        'authenticate' => array(
            'Form' => array(
                'fields' => array('username' => 'email'),
                'scope' => array('is_admin' => '1')
            ),

        )
    ),
    'Session'
);

更新:对于 cakePHP 3.1 finder option 自 3.1 起可用。在此之前,您可以使用scopecontain 选项来修改查询。

http://book.cakephp.org/3.0/en/controllers/components/authentication.html#customizing-find-query

【讨论】:

  • 范围需要在 'auth'=>'authenticate'=>'Form' 数组内。那是对我有用的解决方案。回答您的问题:否。
  • 啊,好吧,我很困惑,因为问题是verified,但你的答案是is_admin
  • +1 - 对于仅具有基于表单的身份验证的应用程序(大多数情况),这似乎是正确的解决方案。如果您碰巧有多个身份验证处理程序(表单/基本/摘要/自定义),那么@tigrang 的解决方案将允许您将范围应用于所有处理程序。
【解决方案2】:
$this->Auth->authenticate = array(
    AuthComponent::ALL => array(
        'scope' => array('User.verified' => '1'),
   ),
);

【讨论】:

  • 验证什么类型的字段?尝试true1
  • 试过 true 和 1,但没有改变。验证的字段是 tinyint(1)
  • sql 转储为空……但 isAuthorized 函数中的 if 子句也是如此。我看错了吗?
  • 如果它锁定了每个用户,那么用户没有在表中设置为 1 的验证值。此外 isAuthorized() 仅对登录用户调用(因此登录实际有效),因此请确保 isAuthorized 也返回 true。
【解决方案3】:
$this->Auth->authenticate = array(
      'Form' => array(
                'scope' => array('User.verified' => '1')
      )
);

【讨论】:

    【解决方案4】:

    假设 CakePHP 文档是正确的,Auth::userScope 被重命名为 Auth::scope,所以现在你可以这样做:

    $this->Auth->scope = array ('User.active' => '1');
    

    Configuring Auth in CakePHP 2.x

    希望这会有所帮助。

    【讨论】:

    【解决方案5】:

    试试这个:

    $this->Auth->userScope = array('User.verified = 1');

    【讨论】:

    • 这一行类似于我拥有的工作应用程序(仅更改字段名称)。我很确定这种格式有效,所以你的问题可能出在另一个配置上。
    • 你在 2.x 上吗?你知道什么配置可能是错误的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多