手机版

基于Laravel Auth自定义接口应用程序接口用户认证的实现方法

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

基于laravel默认的作家(作者的简写)实现美国石油学会(美国石油协会)认证

现在微服务越来越流行了。很多东西都拆分成独立的系统,各个系统之间没有直接的关系。这样我们如果做用户认证肯定是统一的做一个独立的用户认证系统,而不是每个业务系统都要重新去写一遍用户认证相关的东西。但是又遇到一个问题了laravel .默认的作家(作者的简写)认证是基于数据库做的,如果要微服务架构可怎么做呢?

实现代码如下:

用户提供者接口:

//通过唯一标示符获取认证模型公共函数retrieveById($标识符);//通过唯一标示符和记住令牌获取模型公共函数retrieveByToken($identifier,$ token);//通过给定的认证模型更新记住令牌公共函数updateRememberToken(可验证的$user,$ token);//通过给定的凭证获取用户,比如电子邮件或用户名等等公共函数retrieveByCredentials(数组$ credentials);//认证给定的用户和给定的凭证是否符合公共函数验证凭据(可验证的$user,数组$凭据);Laravel中默认有两个用户提供程序:数据库用户提供程序.

数据库用户提供程序

点亮\授权\数据库用户提供程序

直接通过数据库表来获取认证模型。

EloquentUserProvider

点亮\授权\运行用户提供程序

通过动人的模型来获取认证模型

根据上面的知识,可以知道要自定义一个认证很简单。

自定义供应者

创建一个自定义的认证模型,实现可认证的接口;

App\Auth\UserProvider.php

?phpnamespace App \ Auth使用应用程序\模型\用户;使用照明\合同\授权\可认证;使用照明\合同\授权\用户提供商作为提供商;类用户提供者实现提供商{ /** *通过用户的唯一标识符检索用户* @param混合$ identifier * @ return \ lightning \ Contracts \ Auth \ Authenticatable | null */public函数retrieveById($ identifier){ return app(user 3360:类): getuserbyguid($ identifier);} /** *通过用户的唯一标识符和"记住我"令牌来检索用户* @param混合$ identifier * @ param string $ token * @ return \ light \ Contracts \ Auth \ Authenticatable | null */public function retrieveByToken($ identifier,$ token){ return null;} /** *在存储中更新给定用户的"记住我"令牌* @ param \ lightning \ Contracts \ Auth \ authable $ user * @ param string $ token * @ return bool */public函数updateRememberToken(Authenticatable $ user,$ token){ return true;} /** *通过给定的凭据检索用户* @ param array $ credentials * @ return \ lightning \ Contracts \ Auth \ authable | null */public函数retrieveByCredentials(array $ credentials){ if(!isset($ credentials[' API _ token ']){返回null}返回app(用户:类):3360 getuserbytoken($凭据[' API _ token ']);} /** *根据给定的凭据管理用户* @ param \ lightning \ Contracts \ Auth \ authable $ user * @ param array $ credentials * @ return bool */public函数验证凭据(Authenticatable $ user,array $credentials) { if(!isset($ credentials[' API _ token ']){ return false;}返回真实} }可认证接口:

照亮\合同\授权\可认证可认证定义了一个可以被用来认证的模型或类需要实现的接口,也就是说,如果需要用一个自定义的类来做认证,需要实现这个接口定义的方法。

?服务器端编程语言(专业超文本预处理器的缩写).//获取唯一标识的,可以用来认证的字段名,比如id,uuidpublic函数getauthidentifier name();//获取该标示符对应的值公共函数getAuthIdentifier();//获取认证的密码公共函数getAuthPassword();//获取记住令牌公共函数getRememberToken();//设置记住令牌公共函数setRememberToken($ value);//获取记住令牌对应的字段名,比如默认的成员令牌名称();Laravel中定义的可认证的特征,也是Laravel auth默认的用户模型使用的特质,这个特点定义了用户模型默认认证标示符为' id ',密码字段为密码,记住令牌对应的字段为记住令牌等等。

通过重写用户模型的这些方法可以修改一些设置。

实现自定义认证模型

应用\模型\用户

?phpnamespace应用程序\模型使用应用程序\异常\重启异常;使用应用\模型\摘要\重启模型;使用照明\合同\授权\可认证;类用户扩展RestApiModel实现可验证的{ protected $ PrimaryKey=' guid public $递增=假受保护的$ keyType=' string/** *获取唯一标识的,可以用来认证的字段名,比如id,guid * @返回字符串*/public函数getauthidentifier name(){ return $ this-PrimaryKey;} /** * 获取主键的值* @返回混合*/public函数getAuthIdentifier(){ $ id=$ this-{ $ this-getAuthIdentifier name()};返回$ id}公共函数getAuthPassword(){ return " ";}公共函数getRememberToken(){ return " ";}公共函数setRememberToken($ value){ 0返回真}公共函数getRememberTokenName(){ 0返回"";}受保护的静态函数GetBaseuri(){返回配置(' API-host。用户');} public static $ APi map=[' getUserByToken '=[' method '=' GET ',' path'='login/user/token'],' getUserByGuId'=['method'='GET ',' path'='user/guid/:guid'],];/** * 获取用户信息(按guid)* @ param字符串$ guid * @返回用户| null */公共静态函数getUserByGuId(字符串$ guid){ try { $ response=self :3360 getitem(' getUserByGuId ',[' : guid '=$ guid]);} catch(restapeexception $ e){ return null;}返回$ response} /** *获取用户信息(通过标记)* @ param字符串$ token * @返回User | null */public static函数getUserByToken(string $ token){ try { $ response=self :3360 getitem(' getUserByToken ',[' Authorization '=$ token]);} catch(restapeexception $ e){ return null;}返回$ response}}上面RestApiModel是我们公司对狂饮的封装,用于服务器端编程语言(专业超文本预处理器的缩写)项目各个系统之间美国石油学会(美国石油协会)调用。代码就不方便透漏了。

防护装置接口

照明\合同\授权\保护

防护装置接口定义了某个实现了可认证的(可认证的)模型或类的认证方法以及一些常用的接口。

//判断当前用户是否登录公共函数check();//判断当前用户是否是游客(未登录)公共函数guest();//获取当前认证的用户公共函数用户();//获取当前认证用户的id,严格来说不一定是id,应该是上个模型中定义的唯一的字段名公共函数id();//根据提供的消息认证用户公共函数验证(array $ credentials=[]);//设置当前用户公共函数setUser(可认证的$ user);州卫队接口

点亮\合同\授权\状态保护

州卫队接口继承自防护装置接口,除了防护装置里面定义的一些基本接口外,还增加了更进一步、有状态的守卫。新添加的接口有这些:

//尝试根据提供的凭证验证用户是否合法公共函数尝试(数组$credentials=[],$ memory=false);//一次性登录,不记录会议或烹饪公共函数一次(数组$ credentials=[]);//登录用户,通常在验证成功后记录会议和甜饼干公共函数登录(可认证$user,$ memory=false);//使用用户编号登录公共函数loginUsingId($id,$ memory=false);//使用用户身份登录,但是不记录会议和烹饪公共函数一次使用id($ id);//通过甜饼干中的记住令牌自动登录公共函数via内存();//登出公共函数注销();Laravel中默认提供了3中守护:RequestGuard、TokenGuard、SessionGuard .

RequestGuard

点亮\授权\请求保护

RequestGuard是一个非常简单的守卫请求保护.是通过传入一个闭包来认证的。可以通过调用授权:请求添加一个自定义的RequestGuard .

SessionGuard

点亮\授权\会话uard

SessionGuard是Laravel网站认证默认的守卫。

令牌卫士

点亮\授权\令牌保护

令牌卫士适用于无状态美国石油学会(美国石油协会)认证,通过代币认证。

实现自定义防护装置

App\Auth\UserGuard.php

?phpnamespace App \ Auth使用照明\ Http \请求使用照明\授权\保护助手;使用照明\合同\授权\保护;使用照明\合同\授权\用户提供商;类用户保护实现了守卫{使用守卫助手受保护的$ user=null受保护的$请求;受保护的$ provider/** *来自包含应用程序接口令牌的请求的查询字符串项的名称* * @ var string */protected $ InputKey;/** *永久存储中令牌"列"的名称* * @ var string */protected $ storageKey;/** *我们上次尝试检索的用户* @var */受保护的$ last未遂;/** *用户保护构造函数* @ param用户提供程序$ provider * @ param Request $ Request * @ return void */public function _ _ construct(用户提供程序$ provider,Request $ Request=null){ $ this-Request=$ Request;$ this-provider=$ provider;$this-inputKey="授权";$ this-storageKey=' API _ token ';} /** *获取当前经过身份验证的用户* @ return \ light \ Contracts \ Auth \ Authenticatable | null */public function user(){ if(!is _ null($ this-user)){ return $ this-user;} $ user=null $ token=$ this-getTokenForRequest();if(!空($ token)){ $ user=$ this-provider-retrieveByCredentials([$ this-storageKey=$ token]);}返回$ this-user=$ user;} /** *规定用户的凭据* @ param array $ credentials * @ return bool */public function validate(array $ credentials=[]){ if(empty($ credentials[$ this-InputKey]){ return false;} $ credentials=[$ this-storageKey=$ credentials[$ this-inputKey]];$ this-lasterrent=$ user=$ this-provider-retrieveByCredentials($ credentials);返回$ this-hasValidCredentials($ user,$ credentials);} /** *确定用户是否与凭据匹配* @ param mixed $ user * @ param array $ credentials * @ return bool */protected function hasValidCredentials($ user,$credentials) { return!is _ null($ user)$ this-provider-validateCredentials($ user,$ credentials);} /** *获取当前请求的令牌。* @返回字符串*/public函数getTokenForRequest(){ $ token=$ this-request-header($ this-inputKey);返回$ token} /** *设置当前请求实例* * @ param \ Illuminate \ Http \ Request $ Request * @ return $ this */public函数setRequest(Request $ Request){ $ this-Request=$ Request;返回$ this}}在AppServiceProvider的靴子方法添加如下代码:

app \ Providers \ authservice provider。服务器端编程语言(Professional Hypertext Preprocessor的缩写)

?服务器端编程语言(专业超文本预处理器的缩写).//auth:api -令牌提供程序Auth:provider('token ',function(){ return app(用户提供程序3360:类);});//auth:api -令牌保护//@ throw \ exception auth : extend(' token ',function($app,$name,array $ config){ if($ name=' API '){ return app()-make(user guard 3360: class,[' provider '=auth :3360 create user provider($ config[' provider ']),' request'=$app-request,]);}抛出新的\异常('此保护只为“auth:api”服务');});在配置\auth.php的护卫队数组中添加自定义守卫,一个自定义防护装置包括两部分:驱动程序和提供商。

设置配置\auth.php的默认值。防护装置为api .

?phpreturn [ /* | - |身份验证默认值| - | |此选项控制应用程序的默认身份验证"保护"和密码|重置选项。您可以根据需要更改这些默认值,但它们是大多数应用程序的完美开始| */'defaults'=[ 'guard'='api ',' passwords '=' users ',],/* | - |身份验证保护| - | |接下来,您可以为应用程序定义每个身份验证保护。|当然,这里已经为您定义了一个很好的默认配置,它使用会话存储和雄辩的用户提供程序。| |所有身份验证驱动程序都有用户提供程序。这定义了|用户实际上是如何从数据库或其他存储中检索出来的|应用程序用来保存用户数据的机制| supported :“session”,“token”| */“guards”=[“web”=[“driver”=“session”,“provider”=“users”,],“API”=[“driver”=“token”,“provider”=“token”,],],/* | - | User Providers | - | |所有身份验证驱动程序都有一个用户提供程序。这定义了|用户实际上是如何从数据库或其他存储中检索出来的|应用程序用来保存用户数据的机制。| |如果您有多个用户表或模型,您可以配置代表每个模型/表的多个|源。然后,这些源可以被分配给您定义的任何额外的身份验证保护。| | Supported: 'database ',' enclosive ' | */' providers '=[' users '=[' driver '=' enclosive ',' model '=App \ Models \ user 3360 class,],' token'=[ 'driver'='token ',' model '=App \ Models \ user 3360: class,],/* | - |重置密码| - | |如果应用程序中有多个用户表或模型,并且您| |过期时间是重置令牌被视为有效的分钟数。此安全功能使令牌保持短暂,因此|它们被猜测的时间更少。您可以根据需要对此进行更改| */' password '=[' users '=[' provider '=' users ',' table'='password_resets ',' expire'=60,],],]; 使用方式:

参考文章:地址

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

版权声明:基于Laravel Auth自定义接口应用程序接口用户认证的实现方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。