使用laravel-csv-seeder导入CSV时如何哈希密码?
解决Laravel CSV Seeder中密码哈希的问题
我之前用这个包的时候也碰到过密码哈希的困扰,Hashable trait有时候容易用错,不过有两种可靠的方法能解决这个问题:
方法一:重写processRow方法(最直接可控)
这个包允许你重写processRow方法,在每一行数据插入到数据库之前对字段进行自定义处理。你只需要在Seeder类里添加这个方法,专门处理密码字段的哈希:
use Illuminate\Support\Facades\Hash; class SociosTableSeeder extends CsvSeeder { public function __construct() { $this->filename = base_path('database\seeds\data\t0.csv'); $this->table = 'users'; } // 重写processRow方法处理密码哈希 protected function processRow($row) { // 对密码字段进行哈希处理 if (isset($row['password'])) { $row['password'] = Hash::make($row['password']); } return $row; } public function run() { $this->mapping = [ 0 => 'name', 1 => 'email', 2 => 'password', ]; parent::run(); } }
方法二:正确使用Hashable trait
如果你还是想尝试Hashable trait,可能是之前的实现步骤有误,正确的用法是这样的:
- 在Seeder类中引入Hashable trait
- 定义
$hashable属性,指定需要哈希的字段名
修改后的代码如下:
use AndyCrockett\LaravelCsvSeeder\Traits\Hashable; class SociosTableSeeder extends CsvSeeder { use Hashable; // 引入Hashable trait protected $hashable = ['password']; // 指定要哈希的字段 public function __construct() { $this->filename = base_path('database\seeds\data\t0.csv'); $this->table = 'users'; } public function run() { $this->mapping = [ 0 => 'name', 1 => 'email', 2 => 'password', ]; parent::run(); } }
这种方式下,包会自动帮你对$hashable数组里的字段进行哈希处理,不需要手动写逻辑。
验证效果
不管用哪种方法,运行seeder之后,你可以去数据库的users表查看password字段,应该已经是BCrypt哈希后的字符串,而不是CSV里的明文了。
内容的提问来源于stack exchange,提问作者Esteban Cajina
相关产品推荐
相关产品推荐

