当前位置: 首页 > 后端技术 > PHP

Laravel-Auth验证流程和guard守卫和自定义驱动程序驱动程序,使用web-token验证

时间:2023-03-29 21:07:03 PHP

我们先看一下config/auth.phpproviderproviders数组,针对不同的认证方式,这样我们就可以配置一个provider,每个provider可以选择不同的driver。driver可以选择eloquent或者database,然后在对应的driver后面选择对应的配置项,eloquent:model,database:tableguard有了provider之后,我们可以配置guards守卫,guards可以配置一个driver和一个providerprovider就是我们上面配置的provider,driver有session(session为正),token(token为正)可以选择默认api使用token认证,web用户使用session认证。我们可以在认证时使用Auth::attempt(['email'=>$email,'password'=>$password].)方法,该方法会在认证成功后自动为用户设置一个认证会话,然后使用Auth::guard()->check()方法在识别用户登录成功后验证用户是否使用token登录。从积极的方面来说,laravel虽然提供了driver方法,但是并没有默认为authentication方法,也没有提供自动生成token的方法。使用该方法需要自定义登录方法,查看底层\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php方法,我们可以发现laravel5.5底层是token字段默认,我们这里也可以自定义这个字段,这里我使用web_token作为认证字段然后我们需要在数据库中创建对应的字段字段web_token注意:如果使用redis等nosql保存web_token,还需要web_token.为了让laravel自带的Auth门面可用,可以在创建字段后写登录方法:这里我们还是使用redis来保存token,方便设置token的过期时间至于为什么保存在数据库中,当token注销或过期时,需要更新数据库中的token,因为Auth的底层方法是从数据库中获取用户。贴上源码先看一波或者\vendor\laravel\framework\src\Illumina在此处插入te\Auth\TokenGuard.php文件。如果想把token放在header中传值,还需要在TokenGuard.php中添加这一段。如果不加这个section,只能从body中获取token,在header中传递。无法获取令牌。如果理解有误,还望指出,言归正传,还得说说Auth::user()这个方法。这个方法会先实例化一个守卫指定的驱动。如果未指定,它将是默认值。如果引用这段代码\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php,它会实例化指定的守卫,比如Auth::guard('user')->user(),就是这里默认守护adminToken的驱动就是token。当我们调用Auth::user()时,它会调用\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php然后我们在vendor\laravel\framework\src\Illuminate\Auth中找到retrieveByCredentials()方法\EloquentUserProvider.php可以看出这个方法是以token为条件在elquentModel中找出一个userObject返回给我们的,所以我们的Auth::user()获取到的user对象在model中是通过检测的token,所以如果要使用这个功能,数据库中的token字段必须保持更新。当然你也可以丢弃,或者改源码让他从redis中获取token和对应的id,然后用id去理解模型中的数据后,我们再写一个中间件来验证是否访问该网站时令牌是正确的。只需将新建的中间件添加到kernel.php中,最后在待验证方法的构造方法中调用这个中间件即可。您可以开启我们的令牌验证。如果你有一个不想使用验证的方法,你可以使用except()方法来排除它