查询将Sentinel与Laravel和$ fillable数组一起使用

时间:2016-02-09 22:33:08

标签: laravel laravel-5.1 cartalyst-sentinel

我在Laravel中使用Cartalyst Sentinel进行用户身份验证。 我已创建表单以添加新用户。 由于某些奇怪的原因,除非我将密码字段放入User类模型中的Sentinel::register()数组中,否则密码不会通过$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。

2 个答案:

答案 0 :(得分:1)

如果您不想让新用户成为可填写的媒体资源,则需要手动设置密码选项。

$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自动执行此操作。

答案 1 :(得分: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限制,如果您的设计需要,您可以从fillable中删除密码。
如果在回调中返回false,则不会创建用户。