Laravel如何自动插入随机密码

时间:2017-06-15 14:14:04

标签: php laravel

使用Laravel 5.4,我有用户表

Users table:
- id
- email
- password
- created_at
- updated_at

然后当我插入新的用户数据时,我想自动生成随机密码(如9c41Mr2)。

例如,一旦我插入一个数据:

$data = [
    'email' => 'test@example.com',
];

DB::table('users')->insert($data);

我想在MySQL中使用这样的新行:

id: 1 (generated by autoincrement)
email: test@example.com
password: 9c41Mr2 (wow! automatic!)
created_at: 2017-06-14 01:00:00
updated_at: 2017-06-14 01:00:00

那么,有人能告诉我Laravel的最佳方式吗?感谢。

PS:不用担心密码散列问题,我的问题很简单。

5 个答案:

答案 0 :(得分:3)

在您的用户模型中:

public function setpasswordAttribute($value)
{
    $this->attributes['password'] = bcrypt($value ?: str_random(10));
}

答案 1 :(得分:2)

@Mathieu答案需要根据Laravel的一些新更改进行修改。现在,使用以下外观生成密码:

Hash::make(Str::random(10))

例如

use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

public function setpasswordAttribute($value)
{
    $this->attributes['password'] = Hash::make(Str::random(10));
}

答案 2 :(得分:1)

使用mutator方法设置密码。通过添加:

覆盖该方法
public function setPasswordAttribute($value)
{
    $this->attributes['password'] = 'some random password generator';
}

请参阅此处的文档:

https://laravel.com/docs/5.4/eloquent-mutators#defining-a-mutator

设置属性时,根本不需要使用$ value参数。

答案 3 :(得分:1)

所有其他答案都要求显式调用密码修改器(通过在模型属性中传递空密码或调用 $user->password = '';

如果 password 不在属性列表中,这将无法插入,如果 password 未填充,这是生成它所需的代码

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class User extends Model {

    protected $fillable = [
        //...
        'password',
    ];
    
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function save( array $options = [] ) {
        if ( ! $this->exists && empty( $this->getAttribute( 'password' ) ) ) {
            $this->password = Str::random( 16 );
        }
        return parent::save( $options );
    }

    public function setPasswordAttribute( $value ) {
        if ( ! empty( $value ) ) {
            $this->attributes['password'] = Hash::make( $value );
        }
    }
}

答案 4 :(得分:0)

简单来说,只需使用Mutator作为密码,但是,如果您的应用程序成长,则会考虑使用Observers