Laravel中的Auth模块详解
前言本文主要给大家介绍的是关于Laravel中Auth模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 本文是基于Laravel 5.4 版本的本地化模块代码进行分析书写; 模块组成Auth模块从功能上分为用户认证和权限管理两个部分;从文件组成上,IlluminateAuthPasswords目录下是密码重置或忘记密码处理的小模块,IlluminateAuth是负责用户认证和权限管理的模块,IlluminateFoundationAuth提供了登录、修改密码、重置密码等一系统列具体逻辑实现; 下图展示了Auth模块各个文件的关系,并进行简要说明;用户认证HTTP本身是无状态,通常在系统交互的过程中,使用账号或者Token标识来确定认证用户; 配置文件解读 [
'guard' => 'web',...
],'guards' => [
'web' => [
'driver' => 'session','provider' => 'users',],'api' => [
'driver' => 'token','providers' => [
'users' => [
'driver' => 'eloquent','model' => AppUser::class,];
从下往上,理解;
认证Session绑定认证信息: public function login(AuthenticatableContract $user,$remember = false)
public function loginUsingId($id,$remember = false) HTTP基本认证,认证信息放在请求头部;后面的请求访问通过sessionId; 只在当前会话中认证,session中不记录认证信息: public function onceUsingId($id)
public function onceBasic($field = 'email',$extraConditions = []) 认证过程中(包括注册、忘记密码),定义的事件有这些:
还有一些其他的认证方法:
密码处理配置解读 [
'passwords' => 'users','passwords' => [
'users' => [
'provider' => 'users','table' => 'password_resets','expire' => 60,]
从下往上,看配置;
重置密码的调用与实现先看看Laravel的重置密码功能是怎么实现的: validateReset($credentials);
if (! $user instanceof CanResetPasswordContract) { $password = $credentials['password']; return static::PASSWORD_RESET; 再看看FoundationAuth模块封装的重置密码模块是怎么调用的: validate($request,$this->rules(),$this->validationErrorMessages());
// 调用重置密码的方法,第二个参数是回调,做一些持久化存储工作
$response = $this->broker()->reset(
$this->credentials($request),function ($user,$password) {
$this->resetPassword($user,$password);
}
);
// 封装 Response
return $response == Password::PASSWORD_RESET
? $this->sendResetResponse($response)
: $this->sendResetFailedResponse($request,$response);
}
// 获取重置密码时的请求参数 // 重置密码的真实性验证后,进行的持久化工作 “忘记密码 => 发邮件 => 重置密码” 的大体流程如下:
权限管理权限管理是依靠内存空间维护的一个数组变量abilities来维护,结构如下: function($user) {
// 方法的参数,第一位是 $user,当前 user,后面的参数可以自行决定
return true; // 返回 true 意味有权限, false 意味没有权限
},......
);
但只用 $abilities,会使用定义的那部分代码集中在一起太烦索,所以有policy策略类的出现; policy策略类定义一组实体及实体权限类的对应关系,比如以文章举例: 有一个 Modal实体类叫 Post,可以为这个实体类定义一个PostPolicy权限类,在这个权限类定义一些动作为方法名; id === $post->user_id;
}
}
然后在ServiceProvider中注册,这样系统就知道,如果你要检查的类是Post对象,加上你给的动作名,系统会找到PostPolicy类的对应方法; PostPolicy::class,];
怎么调用呢?对于定义在abilities数组的权限:
对于policy策略类调用的权限:
有用的技巧获取当前系统注册的权限,包括两部分abilities和policies数组内容,代码如下: $policies = $reflection_gate->getProperty('policies');
$policies->setAccessible(true); // 获取当前注册的 policies 数组 dump($policies->getValue($gate)); $abilities = $reflection_gate->getProperty('abilities'); 总结以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |