이 글은 Laravel 5.4 버전의 Auth 모듈 코드 분석 및 작성을 기반으로 합니다.
모듈 구성
Auth 모듈은 기능적으로 파일 구성 측면에서 사용자 인증과 권한 관리, IlluminateAuthPasswords 디렉토리는 비밀번호 재설치 모듈입니다. IlluminateAuth는 사용자 인증 및 권한 관리를 담당하는 모듈입니다. 로그인, 비밀번호 수정 및 비밀번호와 같은 일련의 특정 논리 구현을 제공합니다. 재설정 다음 그림은 인증 모듈의 다양한 파일 간의 관계를 보여줍니다.
사용자 인증
HTTP 자체는 일반적으로 시스템 상호 작용 과정에서 상태가 없습니다. 식별은 인증된 사용자를 결정하는 데 사용됩니다.
구성 파일 해석
return [ 'defaults' => [ 'guard' => 'web', ... ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ], ], ];
아래에서 올라가서 이해하세요.
providers는 사용자 데이터를 제공하는 인터페이스이며 여기에 드라이버 개체와 대상 개체가 표시되어야 합니다. name users는 eloquent에 의해 구동되는 공급자 집합의 이름이고 modal은 AppUser::class입니다.
guards 구성의 일부는 인증 관리 부분에 대한 것입니다. 하나는 웹이라고 하며, 다른 하나는 API입니다. 웹 인증은 세션 상호 작용을 기반으로 하며, 사용자 ID는 sessionId에 따라 획득되며, API 인증은 토큰 값 상호 작용을 기반으로
사용됩니다. defaults 항목은 웹 인증이 기본적으로 사용됨을 나타냅니다.
세션 바인딩 인증 정보:
// $credentials数组存放认证条件,比如邮箱或者用户名、密码 // $remember 表示是否要记住,生成 `remember_token` public function attempt(array $credentials = [], $remember = false) public function login(AuthenticatableContract $user, $remember = false) public function loginUsingId($id, $remember = false)
public function basic($field = 'email', $extraConditions = [])
public function once(array $credentials = []) public function onceUsingId($id) public function onceBasic($field = 'email', $extraConditions = [])
인증 통과 이벤트 Failed 인증 실패 이벤트 Lockout 실패 횟수가 한도를 초과하여 다시 접속 요청을 잠급니다. remember_token을 통해 로그인 성공 시 호출되는 Logi 이벤트 로그아웃 사용자 종료 이벤트 등록됨 사용자 등록 이벤트다른 인증 방법도 있습니다: 인증된 사용자가 있는지 확인: Auth::check()현재 인증된 사용자 가져오기: Auth::user()시스템 종료: Auth: :logout() 비밀번호 처리구성 해석
return [ 'defaults' => [ 'passwords' => 'users', ... ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, ], ], ]
비밀번호 재설정 호출 및 구현;
먼저 Laravel의 비밀번호 재설정 기능이 어떻게 구현되는지 살펴보세요:
public function reset(array $credentials, Closure $callback) { // 验证用户名、密码和 token 是否有效 $user = $this->validateReset($credentials); if (! $user instanceof CanResetPasswordContract) { return $user; } $password = $credentials['password']; // 回调函数执行修改密码,及持久化存储 $callback($user, $password); // 删除重置密码时持久化存储保存的 token $this->tokens->delete($user); return static::PASSWORD_RESET; }
// 暴露的重置密码 API public function reset(Request $request) { // 验证请求参数 token、email、password、password_confirmation $this->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); } // 获取重置密码时的请求参数 protected function credentials(Request $request) { return $request->only( 'email', 'password', 'password_confirmation', 'token' ); } // 重置密码的真实性验证后,进行的持久化工作 protected function resetPassword($user, $password) { // 修改后的密码、重新生成 remember_token $user->forceFill([ 'password' => bcrypt($password), 'remember_token' => Str::random(60), ])->save(); // session 中的用户信息也进行重新赋值 $this->guard()->login($user); }
권한 관리
권한 관리는 메모리 공간에 의해 유지되는 배열 변수입니다. 구조는 다음과 같습니다.$abilities = array( '定义的动作名,比如以路由的 as 名(common.dashboard.list)' => function($user) { // 方法的参数,第一位是 $user, 当前 user, 后面的参数可以自行决定 return true; // 返回 true 意味有权限, false 意味没有权限 }, ...... );
class PostPolicy { // update 权限,文章作者才可以修改 public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
protected $policies = [ Post::class => PostPolicy::class, ];
指定用户是否具备common.dashboard.list权限:Gate::forUser($user)->allows('common.dashboard.list')
对于policy策略类调用的权限:
当前用户是否可以修改文章(Gate 调用):Gate::allows('update', $post)
当前用户是否可以修改文章(user 调用):$user->can('update', $post)
当前用户是否可以修改文章(用帮助函数):policy($post)->update($user, $post)
当前用户是否可以修改文章(Controller 类方法中调用):$this->authorize('update', $post);
当前用户是否可以修改文章(Controller 类同名方法中调用):$this->authorize($post);
指定用户是否可以修改文章(Controller 类方法中调用):$this->authorizeForUser($user, 'update', $post);
有用的技巧
获取当前系统注册的权限,包括两部分abilities和policies数组内容,代码如下:
$gate = app(\Illuminate\Contracts\Auth\Access\Gate::class); $reflection_gate = new ReflectionClass($gate); $policies = $reflection_gate->getProperty('policies'); $policies->setAccessible(true); // 获取当前注册的 policies 数组 dump($policies->getValue($gate)); $abilities = $reflection_gate->getProperty('abilities'); $abilities->setAccessible(true); // 获取当前注册的 abilities 数组 dump($abilities->getValue($gate));
推荐教程:《Laravel教程》
위 내용은 Laravel의 인증 모듈 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!