【问题标题】:Query regarding using Sentinel with Laravel and the $fillable array关于将 Sentinel 与 Laravel 和 $fillable 数组一起使用的查询
【发布时间】:2016-02-10 10:57:17
【问题描述】:

我在 Laravel 中使用 Cartalyst Sentinel 进行用户身份验证。 我已经创建了我的表单来添加一个新用户。 出于某种奇怪的原因,密码不会通过Sentinel::register() 传递,除非我将密码字段放入 User 类模型中的 $fillable 数组中。 这是一个潜在的安全问题。 我怎样才能解决这个问题?使用 Sentinel 创建新用户时,我一定缺少一些东西(而且 Sentinel 文档中的有用信息非常少)。

只是简要介绍一下我在代码方面所做的事情。我的数组中填充了创建用户所需的字段。这个数组被传递到Sentinel::register()。一切似乎都很好,但是当我去查看数据库时,密码字段是空白的。

$newUser = array(
    '_token' => Input::get('_token'),
    'email' => Input::get('email'),
    'password' => Input::get('password'),
    'first_name' => Input::get('first_name'),
    'middle_name' => Input::get('middle_name'),
    'last_name' => Input::get('last_name'));

$user = Sentinel::register($newUser);

附注:很遗憾,我无法切换身份验证系统。我需要使用 Sentinel。

【问题讨论】:

  • Sentinel::register 使用填充方法,因此如果您想批量分配,您必须在模型上的 $fillable 中提供 password 字段。

标签: laravel laravel-5.1 cartalyst-sentinel


【解决方案1】:

与杰夫的回答几乎相同的另一种方式。 这应该基于 Sentinel 代码工作,虽然我没有使用过 Sentinel。部署前进行测试。

$newUser = array(
    '_token' => Input::get('_token'),
    'email' => Input::get('email'),
    'password' => Input::get('password'),
    'first_name' => Input::get('first_name'),
    'middle_name' => Input::get('middle_name'),
    'last_name' => Input::get('last_name')
);

Sentinel::register($newUser, function($user) use ($newUser) {
    try {
        return $user->password = \Hash::make($newUser['password']);
    } catch(RuntimeException $e) {
        return false;
    }
});

回调在填充方法之后运行,因此它应该绕过 $fillable 限制,如果您的设计需要,您可以从可填充中删除密码。
如果回调中返回 false 则不会创建用户。

【讨论】:

  • 这种方法有效,我想我更喜欢这种方法,因为它可以保持在一起。此外,$user->hasher->hash() 不存在。相反,我使用了\Hash::make($newUser['password']);
  • @zetetic 哦,很酷,没有对代码进行太多的哈希调查 :) 如果它对你有用,那我猜没关系。
【解决方案2】:

如果您不想将其设置为可填充属性,则需要手动为新用户设置密码选项。

$newUser = array(
'_token' => Input::get('_token'),
'email' => Input::get('email'),
'first_name' => Input::get('first_name'),
'middle_name' => Input::get('middle_name'),
'last_name' => Input::get('last_name'));

$user = Sentinel::register($newUser);

$user->password = Input::get('password');

$user->save();

您可能也需要在设置密码之前对其进行哈希处理,对吧?类似于$user->password = \Hash::make(Input::get('password'));。除非 Sentinel 自动执行此操作。

【讨论】:

  • 如果密码在 $fillable 数组中,则 Sentinel 能够获取密码,对其进行哈希处理并将用户保存到数据库中。但似乎我可能不得不按照你建议的方式去做。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 2018-07-12
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多