真是被这个搞的头都大了.绕来绕去的,到现在AUTH和GUARD倒地是如何分工的,还是不太明白.算了先说怎么弄的吧.
解决方案一 简单粗暴
现在用的就是这个方法,也是很多无奈.因为用的JWT插件,一改的话得改很多,而且怎么都得动源代码,不是laravel就是JWT的 所以索性就最简单粗暴吧
Illuminate\Auth\EloquentUserProvider
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public function validateCredentials(UserContract $user, array $credentials) { $plain = $credentials['password']; return md5($plain) == $user->getAuthPassword(); }
|
解决方案二 看似高大上
第二种方法就是实现 Hasher 接口,然后替换掉原来的 BcryptHasher 这个类,用自己的加密解密方式.
这个方法的好处是哪天又要改回来很简单.
但有个问题,这TMD不是还是得该源代码,那天要升级 lumen 还是有问题,靠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| namespace Illuminate\Contracts\Hashing;
interface Hasher {
public function make($value, array $options = []);
public function check($value, $hashedValue, array $options = []);
public function needsRehash($hashedValue, array $options = []); }
public function validateCredentials(UserContract $user, array $credentials) { $plain = $credentials['password']; return $this->hasher->check($plain, $user->getAuthPassword()); }
|
解决方案三 完美解决 可惜我这次用不上
这个方法是自己写个服务提供者,继承于 EloquentUserProvider 然后修改 validateCredentials 方法,这样即使升级也不怕了.完美!
但是我用不了,靠.现在这个系统是结合了 dingo 和 jwt. 这个验证已经扩展了 jwt 已经没法再扩展了. 而且要改会改很多地方.唉….
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <?php namespace App\Providers;
use Illuminate\Auth\EloquentUserProvider as BaseEloquentUserProvider; use Illuminate\Contracts\Auth\Authenticatable;
class EloquentUserProvider extends BaseEloquentUserProvider { public function __construct($model) { $this->model = $model; }
public function validateCredentials(Authenticatable $user, array $credentials) { $plain = $credentials['password']; $authPassword = $user->getAuthPassword(); return $authPassword == md5($plain); } }
Auth::extend('custom', function() { return new EloquentUserProvider('User'); });
'guards' => [ 'api' => [ 'driver' => 'custom', 'provider' => 'users', ], ],
|
后记
真心被这个 Dingo 和 JWT 搞懵了, 有很多乱码七糟的配置不知道是干什么的.跳来跳去的,太复杂了.
下面这个就是, 看似是扩展驱动 jwt 但实际并不是. 扩展驱动,是在 Tymon\JWTAuth\Providers\LumenServiceProvider 这个里, 在注册的时候,同时自己注册了很多东西,其中就包括 guard 的扩展驱动.
至于下面那个 Dingo\Api\Auth\Auth 干什么用的,还是没搞懂.
1 2 3 4 5 6 7 8
| $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
$app->register(Illuminate\Mail\MailServiceProvider::class);
app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) { return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); });
|
最倒霉的是,做这个时候安装了一个 debugbar, 结果不报错 不显示.. 晕死了….
这次一点心得就是,看来md5加密被抛弃了,现在用的是下面这个很简单,而且好像也很强壮
1 2 3 4 5 6 7 8
|
$passwod = 123456;
password_hash($passwod, PASSWORD_DEFAULT);
password_verify($password, $hash)
|
参考文档