찾다
PHP 프레임워크LaravelLaravel의 인증 모듈 사용법

Laravel의 인증 모듈 사용법

May 02, 2020 am 11:29 AM
authlaravel

이 글은 Laravel 5.4 버전의 Auth 모듈 코드 분석 및 작성을 기반으로 합니다.

모듈 구성

Auth 모듈은 기능적으로 파일 구성 측면에서 사용자 인증과 권한 관리, IlluminateAuthPasswords 디렉토리는 비밀번호 재설치 모듈입니다. IlluminateAuth는 사용자 인증 및 권한 관리를 담당하는 모듈입니다. 로그인, 비밀번호 수정 및 비밀번호와 같은 일련의 특정 논리 구현을 제공합니다. 재설정 다음 그림은 인증 모듈의 다양한 파일 간의 관계를 보여줍니다.

Laravel의 인증 모듈 사용법

사용자 인증

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)

HTTP 기본 인증, 인증 정보는 요청 헤더 뒤에 있습니다.

public function basic($field = 'email', $extraConditions = [])
를 통해 요청됩니다.

현재 세션에서만 인증되며 해당 세션에는 인증 정보가 기록되지 않습니다.

public function once(array $credentials = [])
public function onceUsingId($id)
public function onceBasic($field = 'email', $extraConditions = [])

인증 과정(등록, 비밀번호 분실 포함) 중 정의된 이벤트는 다음과 같습니다.

Attempting Attempt to verify event

인증 통과 이벤트

Failed 인증 실패 이벤트

Lockout 실패 횟수가 한도를 초과하여 다시 접속 요청을 잠급니다.

remember_token을 통해 로그인 성공 시 호출되는 Logi 이벤트

로그아웃 사용자 종료 이벤트

등록됨 사용자 등록 이벤트

다른 인증 방법도 있습니다:

인증된 사용자가 있는지 확인: Auth::check()

현재 인증된 사용자 가져오기: Auth::user()

시스템 종료: Auth: :logout()

비밀번호 처리

구성 해석

return [
    'defaults' => [
        'passwords' => 'users',
        ...
    ],
    
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
]

아래에서 위로 구성을 살펴보세요.

passwords 배열은 비밀번호를 재설정하기 위한 구성이며 사용자는 구성 체계의 별칭이며 다음 세 가지 요소를 포함합니다. 공급자(위의 공급자 배열인 사용자 구성표 제공), 테이블(비밀번호 재설정 토큰을 저장하는 테이블), 만료(토큰 만료 시간)

기본 항목은 기본 비밀번호 재설정 구성표를 설정합니다.

비밀번호 재설정 호출 및 구현;

먼저 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;
}

그런 다음 FoundationAuth 모듈에 의해 캡슐화된 비밀번호 재설정 모듈이 어떻게 호출되는지 살펴보세요:

// 暴露的重置密码 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);
}

"비밀번호 찾기 => 이메일 보내기 => 비밀번호 재설정" 일반 프로세스는 다음과 같습니다.

"비밀번호 찾기"를 클릭하고 라우팅 구성을 통해 "비밀번호 찾기" 페이지로 이동하면 입력할 페이지에 "전송할 이메일" 필드가 있습니다. 전송될 "은 데이터베이스입니다. 존재하는 경우 비밀번호 재설정 이메일이 해당 사서함으로 전송됩니다.

비밀번호 재설정 이메일에 링크가 있습니다(클릭하면 토큰이 비밀번호 변경 페이지로 이동합니다).

"이메일", "비밀번호" 및 "비밀번호 확인"의 세 가지 필드를 입력한 후 홈페이지에서 비밀번호 재설정 API에 액세스하려면 토큰을 가져오세요. 이메일, 비밀번호 및 비밀번호 확인을 확인한 후 토큰이 유효한지 확인합니다. 그렇다면 재설정에 성공한 것입니다.

권한 관리

권한 관리는 메모리 공간에 의해 유지되는 배열 변수입니다. 구조는 다음과 같습니다.

$abilities = array(
    '定义的动作名,比如以路由的 as 名(common.dashboard.list)' => function($user) {
        // 方法的参数,第一位是 $user, 当前 user, 后面的参数可以自行决定
        return true;  // 返回 true 意味有权限, false 意味没有权限
    },
    ......
);
하지만 $ability만 사용하고, 코드에 정의된 부분만 사용하게 됩니다. 하나로 모으기가 너무 번거로워서 정책 전략 클래스가 나타납니다.

정책 클래스는 해당 관계를 정의합니다. 예를 들어 기사를 예로 들어 보겠습니다.

이를 위해 사용할 수 있는 Post라는 모달 엔터티 클래스가 있습니다. 엔터티 클래스는 PostPolicy 권한 클래스를 정의하고 일부 작업을 정의합니다.

class PostPolicy {
    // update 权限,文章作者才可以修改
    public function update(User $user, Post $post) {
        return $user->id === $post->user_id;
    }
}

그런 다음 ServiceProvider에 등록하면 확인하려는 클래스가 Post 개체인 경우 제공한 작업 이름을 추가하면 시스템이 해당 메서드를 찾을 수 있음을 알 수 있습니다. PostPolicy 클래스의

protected $policies = [
    Post::class => PostPolicy::class,
];

어떻게 호출하나요?

ability 배열에 정의된 권한의 경우:

현재 사용자에게 common.dashboard.list 권한이 있는지 여부: Gate::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()->cannot('common.dashboard.list')

指定用户是否具备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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
풀 스택 프로젝트에서 프론트 엔드 템플릿에 Laravel Blade 사용풀 스택 프로젝트에서 프론트 엔드 템플릿에 Laravel Blade 사용May 01, 2025 am 12:24 AM

laravelbladeenhancesfrontendtemplatinginfull-stackprojectsbyofferingcleansyntaxandpowerfulfeatures.1) itallowsforeasyvaribledisplayandcontrolstructures.2) bladesupportscreatingAndAndErscreatingCreatingScreatingAndErsingComponents, aidingininagingComplexUis.3) iteffort handleslyous

Laravel을 사용한 전체 스택 애플리케이션 구축 : 실용적인 튜토리얼Laravel을 사용한 전체 스택 애플리케이션 구축 : 실용적인 튜토리얼May 01, 2025 am 12:23 AM

laravelisidealforfull-stackapplicationsduetoitselegantsyntax, 포괄적 인 Cosystem 및 powerfulfeatures.1) audeeloquentormforintucive backenddatamanipulation, butavoidn 1queryisss.2) Employblatingforcleanfrontendviews, beencautiousofoversing@i

원격 역할을 유지하기 위해 어떤 종류의 도구를 사용 했습니까?원격 역할을 유지하기 위해 어떤 종류의 도구를 사용 했습니까?May 01, 2025 am 12:21 AM

FERREMOTWORK, IUSEZOOMFORVIDEOCALLS, SLACKFORMESSIGAGIGAGING, TRELLOFORPROJECTMENAGEMENT, 및 GITHUBFORCODECOLABORATION.1) ZOOMISRELIBLEFORLARGEMEETINGSBUTHIMELIMITSONTHEFREEVERSION.2) SlackIntegrateswellwellsButcanLeadtonoTificationWovernovernovernovernovernovernodificationwordnowload

원격 액세스 및 스크린 공유 : 기술 지원을위한 거리 브리징원격 액세스 및 스크린 공유 : 기술 지원을위한 거리 브리징May 01, 2025 am 12:07 AM

RemoteAccessandscreenshingshingworkSewestablishingAsecure, Real-TimeConnectionBetweNncomputerSusingProtocolslikerDP, vnc, orproprietarysolutions.bestPracticesInclude : 1) buildingtroustrhoughclearcommunication, 2) ensuringsecuritywithstrongtion-to-dat

최신 Laravel 버전으로 업그레이드 할 가치가 있습니까?최신 Laravel 버전으로 업그레이드 할 가치가 있습니까?May 01, 2025 am 12:02 AM

최신 Laravel 버전으로 업그레이드하는 것을 고려할 가치가 있습니다. 1) 익명 마이그레이션과 같은 새로운 기능 및 개선은 개발 효율성 및 코드 품질을 향상시킵니다. 2) 보안 개선 및 알려진 취약점이 수정되었습니다. 3) 커뮤니티 지원이 향상되어 더 많은 자원을 제공합니다. 4) 원활한 업그레이드를 보장하기 위해 호환성을 평가해야합니다.

Laravel 로그 및 오류 모니터링 : Sentry 및 Bugsnag 통합Laravel 로그 및 오류 모니터링 : Sentry 및 Bugsnag 통합Apr 30, 2025 pm 02:39 PM

Laravel에 Sentry와 Bugsnag를 통합하면 응용 프로그램 안정성과 성능이 향상 될 수 있습니다. 1. Composer.json에 Sentrysdk를 추가하십시오. 2. config/app.php에 센트리 서비스 제공 업체를 추가하십시오. 3. .env 파일에서 sentrydsn을 구성하십시오. 4. app \ exceptions \ handler.php에서 센트리 오류 보고서를 추가하십시오. 5. 센트리를 사용하여 예외를 잡고보고하고 추가 컨텍스트 정보를 추가하십시오. 6. app \ exceptions \ handler.php의 ugsnag 오류 보고서를 추가하십시오. 7. Bugsnag 모니터링을 사용하십시오

Laravel이 여전히 PHP 개발자에게 선호되는 프레임 워크 인 이유는 무엇입니까?Laravel이 여전히 PHP 개발자에게 선호되는 프레임 워크 인 이유는 무엇입니까?Apr 30, 2025 pm 02:36 PM

Laravel은 개발 경험, 커뮤니티 지원 및 생태계에서 뛰어난 PHP 개발자에게 선호되는 프레임 워크로 남아 있습니다. 1) Eloquentorm 및 Blade Template 엔진과 같은 우아한 구문 및 풍부한 기능 세트는 개발 효율성 및 코드 가독성을 향상시킵니다. 2) 거대한 커뮤니티는 풍부한 자원과 지원을 제공합니다. 3) 학습 곡선이 가파르고 프로젝트 복잡성을 증가시킬 수 있지만 Laravel은 합리적인 구성 및 최적화를 통해 응용 프로그램 성능을 크게 향상시킬 수 있습니다.

Laravel 라이브 채팅 응용 프로그램 : WebSocket 및 PusherLaravel 라이브 채팅 응용 프로그램 : WebSocket 및 PusherApr 30, 2025 pm 02:33 PM

Laravel에서 라이브 채팅 애플리케이션을 구축하려면 WebSocket 및 Pusher를 사용해야합니다. 특정 단계에는 다음이 포함됩니다. 1) .env 파일의 푸시어 정보 구성; 2) 방송 드라이버를 Broadcasting.php 파일에 Pusher로 설정합니다. 3) 푸셔 채널을 구독하고 Laravelecho를 사용한 이벤트를 듣습니다. 4) 푸셔 API를 통해 메시지를 보내십시오. 5) 개인 채널 및 사용자 인증 구현; 6) 성능 최적화 및 디버깅을 수행하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구