Laravel中Auth模块的详细说明
序
本文主要介绍Laravel中Auth模块的相关内容,并分享给大家参考和学习。下面就不多说了。我们来看看详细的介绍。
本文基于Laravel版本的本地化模块代码。
模块组成
认证模块分为两部分:用户认证和权限管理。在文件组成方面,光照\ auth \ passwords目录是一个用于密码重置或密码遗忘的小模块,光照\ auth是一个负责用户认证和权限管理的模块,光照\ foundation \ auth提供了登录、密码修改和密码重置等系统逻辑实现。
下图显示了Auth模块的各个文件之间的关系,并给出了简要说明;
用户认证
HTTP本身是无状态的,通常在系统交互过程中,使用账号或Token标识来确定认证用户;
配置文件的解释
返回[ 'defaults'=[ 'guard'='web ',],' guards '=[' web '=[' driver '=' session ',' provider'='users ',],' api'=[ 'driver'='token ',' provider'='users ',],],' provider '=[' users '=[' driver '=' enhanced ',' model '=App \ User:class,],],];自下而上,理解;
Providers是提供用户数据的接口,驱动对象和目标对象都要标记;这里,关键名称User是一组提供者的名称,由雄辩驱动,模态是App \ User:class;警卫部分是为认证管理部分配置的;认证方式有两种,一种叫web,一种叫api。Web认证基于Session交互,根据sessionId获取用户id,在用户提供者中查询该用户;Api认证基于令牌值交互,也使用用户作为提供者;默认值项显示默认情况下使用web身份验证;证明
会话绑定身份验证信息:
//$credentials数组存储身份验证条件,如邮箱或用户名和密码。//$ memory指示是否记住,并生成` memory _ token ` public function尝试(array $ credentials=[],$ memory=false)public function log in(authenticatablecontract $ user,$ memory=false)public function loginusingid($ id,$ memory=false)http基本身份验证,身份验证信息放在请求头中;以下访问请求通过sessionId;
public function basic($ field=' email ',$ extraconditions=[])仅在当前会话中进行身份验证,会话中不记录任何身份验证信息:
在public function once(array $ credentials=[])public function once using id($ id)public function once basic($ field=' email ',$ extra conditions=[])身份验证(包括注册和忘记密码)过程中,定义的事件如下:
事件名称描述了尝试身份验证事件已验证身份验证失败事件锁定失败次数超过限制,并锁定了再次访问事件的请求。当Logi通过“memory _ token”成功登录时,被调用的事件注销用户退出事件注册用户注册事件也有一些其他身份验证方法:
检查是否有经过身份验证的用户:授权:检查()获取当前经过身份验证的用户:授权:用户()退出系统:授权:登录()密码处理
配置解释
返回['默认值'=['密码'='用户',],' password '=[' users '=[' provider '=' users ',' table'=' password _ resets ',' expire'=60,],],] from
密码数组是重置密码的配置;Users是配置方案的别名,包含三个元素:provider(用于提供用户的方案,即上面的providers数组)、table(用于存储重置密码令牌的表)和expire(令牌到期时间)。默认项目将设置默认密码重置方案;重置密码的调用与实现
让我们来看看Laravel的密码重置功能是如何实现的:
公共函数reset (array $ credentials,closure $ callback){//验证用户名、密码和令牌是否有效$ user=$ this-validate reset($ credentials);if(!$ user instance of CanResetPasswordContract){ return $ user;} $ password=$ credentials[' password '];//回调函数执行密码修改,持久存储$callback($user,$ password);//删除令牌$ this-token-Delete($ user)重置密码时保存在永久存储中;返回static : password _ RESET;}看看由Foundation\Auth模块封装的密码重置模块是如何调用的:
//暴露的重置密码API公共函数重置(request $ request){//身份验证请求参数token,email,password _ confirmation $ this-validate($ request,$ this-rules(),$ this-validation errors());//调用重置密码的方法,第二个参数是回调,并做一些持久存储工作$ response=$ this-broker()-reset($ this-credentials($ request),function ($ user,$ password){ $ this-reset password($ user,$ password);} );//包响应返回$ response==password :3360 password _ reset?$ this-sendresseresponse($ response): $ this-sendressetfailedresponse($ request,$ response);}//重置密码时获取request参数保护的函数凭据(request $ request){ return $ request-only(' email ',' password ',' password _ confirmation ',' token ');}//在验证重置密码的真实性后执行的持久性工作($ user,$password) {//修改后的密码,重新生成memory _ token $ user-force fill([' password '=bcrypt($ password),' memory _ token '=str 33603360 random(60),])-save();//会话中的用户信息也被重新分配$ this-guard()-log in($ user);}忘记密码=发送邮件=重置密码一般流程如下:
点击“忘记密码”,通过路由配置跳转到“忘记密码”页面,其中有一个需要填写的“需要发送的邮箱”字段;验证数据库中是否存在“待发送邮箱”,如果存在,则向邮箱发送密码重置消息;密码重置邮件中有一个链接(点击后会携带令牌到密码更改页面),数据库会保存这个令牌的哈希加密值;填写“邮箱”、“密码”、“确认密码”三个字段后,携带令牌访问重置密码API,在首页判断邮箱、密码、确认密码三个字段,然后验证令牌是否有效;如果是,则复位成功;权限管理
权限管理由内存空间维护的数组变量能力维护。结构如下:
$ $abilities=array('定义的动作名称,如路线的as名称(常见。dashboard . list)'=function($user){//method参数,第一位数字为$ user,当前用户,以下参数可以自行决定返回true//返回true表示权限,返回false表示没有权限},);但是只使用$ $ abilities,把代码的定义部分一起使用太烦人了,所以有一个policy policy类;
策略策略类定义了一组实体和实体权限类之间的对应关系,例如,以文章为例:
有一个叫Post的Modal实体类,可以为这个实体类定义一个PostPolicy权限类,并在这个权限类中定义一些动作作为方法名;
Class PostPolicy {//更新权限,文章作者可以修改公共函数更新(user $ user,post $ post){ return $ user-id==$ post-user _ id;}}然后在ServiceProvider中注册,这样系统就知道如果你要检查的类是Post对象,再加上你给的动作名,系统就会找到PostPolicy类的对应方法;
受保护的$ policies=[post : class=post policy : class,];怎么称呼?
对于能力数组中定义的权限:
当前用户是否有权使用common.dashboard.list:gate :3360 allows(' common . dashboard . list ')是当前用户是否有权使用common . dashboard . list:gate : denies(' common.dashboard.list ')当前用户是否具有common.dashboard.list权限:$ request-user()-can(' common . dashboard . list ')当前用户是否具有common . dashboard . list权限:$ request-user()-不能(' common.dashboard.list ')指定用户是否具有common.dashboard.list:gate :3360 for user($ user)-允许(' common . dashboard . list ')调用策略策略类:
当前用户是否可以修改文章(Gate call):Gate :3360 allows(' update ',$post)当前用户是否可以修改文章(user call): $user-can('update ',$ post)当前用户是否可以修改文章(带帮助功能):policy ($ post)-update ($ user,$ post)当前用户是否可以修改文章(在Controller类方法中调用):$this-authorize('update ',$ post);当前用户是否可以修改文章(在与Controller类同名的方法中调用):$ this-authorize($ post);指定用户是否可以修改文章(在Controller类方法中调用):$ this-authorizeforuser ($ user,' update ',$ post);有用的技能
获取当前系统注册的权限,包括能力和策略数组两部分,代码如下:
$ gate=app(\ light \ Contracts \ Auth \ Access \ gate :3360 class);$ reflection _ gate=new ReflectionClass($ gate);$ policies=$ reflection _ gate-GetProperty(' policies ');$ policies-SetAccessable(true);//获取当前注册的策略数组dump($ policies-getValue($ gate));$ capabilities=$ reflection _ gate-getProperty(' capabilities ');$ abilities-setAccessible(true);//获取当前注册的功能数组dump($ capabilities-getvalue($ gate));摘要
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。
版权声明:Laravel中Auth模块的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。