사용자 인증


ㅋㅋ >
Views
소개

인용문

{tip} 빠르게 시작하고 싶으신가요? 새로운 Laravel 애플리케이션에서 php artisan make:authphp artisan migration을 실행하세요. 그런 다음 브라우저에서 http://your-app.test/register 또는 애플리케이션에 할당된 다른 URL로 이동하세요. 이 두 명령은 전체 인증 시스템 구축을 담당합니다! php artisan make:authphp artisan migrate 就可以了。 然后,把你的浏览器导航到 http://your-app.test/register 或者其他任意一个分配给你的程序的 URL。这两个命令将负责构建整个认证系统!

Laravel 使得实现身份验证非常简单。 事实上,几乎所有的配置都是现成的。 身份验证配置文件位于 config/auth.php, 其中包含几个有良好文档记录的选项,用于调整身份验证服务的行为。

在其核心,Laravel 的认证设施由 “警卫” 和 “提供者” 组成。守卫决定如何对每个请求的用户进行身份验证。比如,Laravel 带有一个 session 保护,它使用会话存储和 Cookies 来维护状态。

提供者决定如何从持久储存中检索用户。 Laravel 支持使用 Eloquent 和数据库查询生成器检索用户。但是,你可以根据应用程序的需要来自由定义其他提供者。

如果这些听起来让你很困惑,别担心!许多应用程序永远不需要修改默认的身份验证配置。

数据库注意事项

默认情况下, Laravel 包含一个 AppUser Eloquent model 在你的 app 目录下。 这个模型可与默认的 Eloquent 身份验证驱动程序一起使用。如果你的应用程序没有使用 Eloquent,你可以用 database 身份验证驱动程序,它用的是 Laravel 查询生成器。

当为 AppUser 模型生成数据库架构时,确保密码的长度至少为 60 个字符。保持默认的字符串长度为 255 个字符是一个不错的选择。

另外,你应该验证 “users”(或等效)表是否包含一个可空的,含有 100 个字符的 remember_token 字符串。此列将用于存储用户登录应用程序时选择 “记住我” 选项的令牌。

用户认证快速指南

Laravel 附带了几个预构建的身份验证控制器,它们位于 AppHttpControllersAuth 命名空间中。RegisterController 处理新的用户注册,LoginController 处理身份验证,ForgotPasswordController 处理用于重置密码的电子邮件链接,ResetPasswordController

Laravel을 사용하면 인증 구현이 매우 쉽습니다. 실제로 거의 모든 구성이 기성품입니다. 인증 구성 파일은 config/auth.php에 있으며 인증 서비스의 동작을 조정하기 위한 여러 잘 문서화된 옵션이 포함되어 있습니다.

기본적으로 Laravel의 인증 기능은 "Guards"와 "Providers"로 구성됩니다. 경비원은 각 요청에 대해 사용자를 인증하는 방법을 결정합니다. 예를 들어, Laravel에는 상태를 유지하기 위해 세션 저장소와 쿠키를 사용하는 session 가드가 함께 제공됩니다.

공급자는 영구 저장소에서 사용자를 검색하는 방법을 결정합니다. Laravel은 Eloquent 및 데이터베이스 쿼리 빌더를 사용하여 사용자 검색을 지원합니다. 그러나 애플리케이션의 요구 사항에 따라 다른 공급자를 자유롭게 정의할 수 있습니다.
이 말이 혼란스럽게 들린다면 걱정하지 마세요! 많은 애플리케이션은 기본 인증 구성을 수정할 필요가 없습니다. 🎜🎜🎜🎜
🎜

데이터베이스 고려 사항

🎜기본적으로 Laravel에는 < code>AppUser Eloquent 모델은 app 디렉터리에 있습니다. 이 모델은 기본 Eloquent 인증 드라이버와 함께 사용할 수 있습니다. 애플리케이션이 Eloquent를 사용하지 않는 경우 Laravel 쿼리 빌더를 사용하는 database 인증 드라이버를 사용할 수 있습니다. 🎜🎜 AppUser 모델에 대한 데이터베이스 스키마를 생성할 때 비밀번호 길이가 60자 이상인지 확인하세요. 기본 문자열 길이인 255자를 유지하는 것이 좋습니다. 🎜🎜또한 "users"(또는 이에 상응하는) 테이블에 null 허용 100자 remember_token 문자열이 포함되어 있는지 확인해야 합니다. 이 열은 사용자가 애플리케이션에 로그인할 때 "Remember Me" 옵션을 선택할 때 토큰을 저장하는 데 사용됩니다. 🎜🎜
🎜🎜
🎜🎜사용자 인증에 대한 빠른 가이드🎜🎜Laravel에는 여러 가지 사전 구축된 인증 컨트롤러가 함께 제공됩니다. AppHttpControllersAuth 네임스페이스에 있습니다. RegisterController는 새로운 사용자 등록을 처리하고, LoginController는 인증을 처리하고, ForgotPasswordController는 비밀번호 재설정을 위한 이메일 링크를 처리하고, ResetPasswordController는 비밀번호 재설정. 이러한 각 컨트롤러는 속성을 사용하여 필요한 메서드를 포함합니다. 많은 애플리케이션의 경우 이러한 컨트롤러를 전혀 수정할 필요가 없습니다. 🎜🎜🎜🎜🎜🎜🎜

Routing

Laravel은 하나의 간단한 명령으로 인증에 필요한 모든 경로와 보기를 빠르게 구성할 수 있는 방법을 제공합니다.

php artisan make:auth

이 명령은 새 애플리케이션에 사용해야 하며 레이아웃 보기, 등록 및 로그인 보기와 라우팅을 모두 설치합니다. 인증 끝점. 애플리케이션 대시보드에 대한 로그인 후 요청을 처리하기 위해 HomeController도 생성됩니다. HomeController 来处理应用程序仪表板的登录后请求。

{tip} 如果应用程序不需要注册,可以通过删除新创建的 RegisterController 并修改路由声明来禁用它: Auth::routes(['register' => false]);

视图

如前一节所述, php artisan make:auth 命令将创建认证所需的所有视图,并将它们放在 resources/views/auth 目录中。

make:auth 命令还将创建一个包含应用程序基本布局的 resources/views/layouts 目录。所有这些视图都使用了 Bootstrap CSS 框架,但是你可以自由地定制它们。

认证

现在已经给认证的控制器设置好了路由和视图,你可以在应用中注册和认证新用户了!因为控制器已经默认包含了验证用户是否存在和保存用户到数据库中的认证逻辑(通过 traits 实现的),现在你已经可以在浏览器中访问应用了。

自定义路径

当用户认证成功,他们会被重定向到 /home 这个 URI 下。你可以在 LoginControllerRegisterControllerResetPasswordController,还有 VerificationController 控制器中定义 redirectTo 属性来自定义验证后的重定向位置:

protected $redirectTo = '/';

接下,你应该修改 RedirectIfAuthenticated 中间件中的 handle 方法,以便在重定向用户时重定向到新的 URI。

如果重定向路径需要自定义生成逻辑,你可以定义 redirectTo 方法替代 redirectTo 属性:

protected function redirectTo(){ 
   return '/path';
 }

{提示}  redirectTo 方法优先于 redirectTo 属性。

自定义用户名

Laravel 默认使用 email 字段来认证。如果你想使用其他的字段,可以在 LoginController 控制器里面定义一个 username

{tip} 애플리케이션에 등록이 필요하지 않은 경우 새로 생성된 RegisterController를 삭제하고 경로 선언을 수정하여 비활성화할 수 있습니다: Auth::routes(['register ' = > 거짓]);.
🎜
🎜🎜Views🎜🎜이전 섹션에서 언급했듯이 php artisan make:auth 명령은 인증에 필요한 모든 보기를 생성하고 resources/views/auth 디렉토리에 배치합니다. 🎜🎜make:auth 명령은 애플리케이션의 기본 레이아웃이 포함된 resources/views/layouts 디렉터리도 생성합니다. 이러한 보기는 모두 Bootstrap CSS 프레임워크를 사용하지만 자유롭게 사용자 정의할 수 있습니다. 🎜🎜🎜
🎜🎜Authentication🎜🎜이제 인증된 컨트롤러에 대해 라우팅 및 보기가 설정되었습니다. , 앱에서 신규 사용자 등록 및 인증이 가능해요! 컨트롤러에는 기본적으로 사용자 존재를 확인하고 사용자를 데이터베이스에 저장하는 인증 로직이 이미 포함되어 있으므로(특성을 통해 구현됨) 이제 브라우저에서 애플리케이션에 액세스할 수 있습니다. 🎜
🎜

사용자 정의 경로

🎜사용자가 성공적으로 인증되면 /home URI로 리디렉션됩니다. 아래에. LoginController, RegisterController, ResetPasswordControllerVerificationController 컨트롤러에서 redirectTo 속성을 ​​사용하여 인증 후 리디렉션 위치를 맞춤설정합니다. 🎜
public function username(){  
  return 'username';
 }
🎜 다음으로 Direct를 새 URI로 리디렉션할 때 사용자를 리디렉션하도록 RedirectIfAuthenticated 미들웨어의 handle 메서드를 수정해야 합니다. . 🎜🎜리디렉션 경로에 사용자 정의 생성 로직이 필요한 경우 redirectTo 속성 대신 redirectTo 메서드를 정의할 수 있습니다. 🎜
use Illuminate\Support\Facades\Auth;protected function guard(){ 
   return Auth::guard('guard-name');
 }
🎜{Tip} directiveTo 메서드는 다음을 수행합니다. RedirectTo 속성보다 우선순위가 높습니다. 🎜
🎜

사용자 정의 사용자 이름

🎜Laravel은 기본적으로 인증을 위해 email 필드를 사용합니다. 다른 필드를 사용하려면 LoginController 컨트롤러에서 username 메서드를 정의할 수 있습니다. 🎜
use Illuminate\Support\Facades\Auth;
// 获取当前通过认证的用户...
$user = Auth::user();
// 获取当前通过认证的用户 ID...
$id = Auth::id();
🎜🎜

맞춤 감시자

사용자 인증 및 등록을 위한 "감시자"를 맞춤 설정할 수도 있습니다. 이 기능을 구현하려면 LoginController, RegisterControllerResetPasswordControllerguard 메서드를 정의해야 합니다. 이 메소드는 가드 인스턴스를 반환합니다: LoginController,RegisterControllerResetPasswordController 中定义 guard 方法。该方法会返回一个看守器实例:

<?php
   namespace App\Http\Controllers;
   use Illuminate\Http\Request;
   class ProfileController extends Controller{ 
    /**
     * 更新用户资料。
     *
     * @param  Request  $request
     * @return Response
     */  
   public function update(Request $request)  
     {       
      // $request->user() 返回一个认证用户实例...   
      }
  }

自定义验证 / 存储

为了修改新用户在注册时所需要填写的表单字段,或者自定义如何将新用户存储到数据库中,你可以修改  RegisterController 类。该类负责验证和创建新用户。

RegisterController 类的 validator 方法包含了验证新用户的规则,你可以随心所欲地自定义该方法。

RegisterControllercreate 方法负责使用  Eloquent ORM 在数据库中创建新的 AppUser 记录。你可以根据数据库的需要自定义该方法。

检索认证用户

你可以通过 Auth facade 来访问已认证的用户:

use Illuminate\Support\Facades\Auth;
if (Auth::check()) {   
 // 用户已经登录了...
}

或者,你可以通过 IlluminateHttpRequest 实例来访问已认证的用户。别忘了,类型提示的类会被自动注入到你的控制器方法中:

Route::get('profile', function () {  
  // 只有认证过的用户可以进入...
 })->middleware('auth');

确定当前用户是否已经认证

你可以使用 Auth facade 的 check 方法来检查用户是否已认证。如果已认证,将会返回 true

public function __construct(){  
  $this->middleware('auth');
}

{提示} 虽然可以使用 check 方法确认用户是否被认证,但是在允许用户访问的某些路由 / 控制器之前,通常还是会使用中间件来验证用户是否进行过身份验证。想要了解更多信息,请查看有关 保护路由 的文档。

保护路由

路由中间件 可以用于只允许通过认证的用户访问给定的路由。Laravel 自带了一个 auth 中间件,它定义在 IlluminateAuthMiddlewareAuthenticate 中。由于这个中间件已经在 HTTP 内核中注册,你只需把这个中间件附加到路由定义中:

/**
 * Get the path the user should be redirected to.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 */
 protected function redirectTo($request){ 
    return route('login');
 }

当然,如果你使用 控制器,你可以在控制器的构造函数中调用  middleware

public function __construct(){ 
   $this->middleware('auth:api');
}

사용자 정의 유효성 검사/저장
🎜새 사용자가 등록할 때 작성해야 하는 양식 필드를 수정하려면, 또는 새 사용자가 데이터베이스에 저장되는 방식을 사용자 정의하려면 RegisterController 클래스를 수정할 수 있습니다. 이 클래스는 새로운 사용자를 검증하고 생성하는 일을 담당합니다. 🎜🎜RegisterController 클래스의 validator 메서드에는 새 사용자를 확인하기 위한 규칙이 포함되어 있습니다. 이 메서드를 원하는 대로 맞춤 설정할 수 있습니다. 🎜🎜RegisterControllercreate 메소드는 Eloquent ORM을 사용하여 데이터베이스에 새로운 AppUser 레코드를 생성하는 역할을 합니다. 데이터베이스의 필요에 따라 이 방법을 사용자 정의할 수 있습니다. 🎜🎜🎜
🎜

인증된 사용자 검색

🎜다음을 수행할 수 있습니다. Auth 파사드를 통해 인증된 사용자에 접근하세요: 🎜
<?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    class LoginController extends Controller{  
     /**
     * 处理身份验证尝试。
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return Response
     */   
    public function authenticate(Request $request)   
     {       
        $credentials = $request->only('email', 'password');      
        if (Auth::attempt($credentials)) {        
            // 身份验证通过...           
           return redirect()->intended('dashboard');    
             }   
           }
        }
🎜 또는 IlluminateHttpRequest 인스턴스를 통해 인증된 사용자에 접근할 수도 있습니다. 유형 힌트 클래스가 컨트롤러 메소드에 자동으로 삽입된다는 점을 잊지 마세요. 🎜
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {  
  // 用户存在,已激活且未被禁用。
 }
🎜🎜현재 사용자가 인증되었는지 확인하려면🎜🎜당신 Auth 파사드의 check 메소드는 사용자가 인증되었는지 확인합니다. 인증되면 true가 반환됩니다: 🎜
if (Auth::guard('admin')->attempt($credentials)) { 
   //
 }
🎜{Tip} check 방법을 사용하여 사용자가 인증되었는지 확인할 수 있지만, 일부 경로/컨트롤러 이전에는 미들웨어를 사용하여 사용자가 인증되었는지 확인하는 것이 일반적이었습니다. 자세한 내용은 보호 라우팅에 대한 설명서를 확인하세요. 🎜
🎜🎜
🎜

경로 보호

🎜라우팅 미들웨어 가능 인증된 사용자만 특정 경로에 액세스할 수 있도록 허용하는 데 사용됩니다. Laravel은 IlluminateAuthMiddlewareAuthenticate에 정의된 auth 미들웨어와 함께 제공됩니다. 이 미들웨어는 이미 HTTP 코어에 등록되어 있으므로 이 미들웨어를 경로 정의에 연결하기만 하면 됩니다: 🎜
Auth::logout();
🎜 물론 컨트롤러를 사용하는 경우 컨트롤러 생성자 /code>에서 미들웨어<를 호출할 수 있습니다. 경로 정의에 직접 추가하는 방법: 🎜
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { 
   // 用户被记住...
}
🎜🎜

인증되지 않은 사용자 리디렉션

auth 미들웨어가 인증되지 않은 사용자를 감지하면 사용자를 login이라는 명명된 경로로 리디렉션합니다.
app/Http/Middleware/Authenticate.php 파일의 redirectTo 함수를 수정하여 이 동작을 수정할 수 있습니다: auth 中间件检测到一个未认证用户时,它会把用户重定向到名为 login 的 命名路由上。
您可以通过修改 app/Http/Middleware/Authenticate.php 文件中的 redirectTo 函数来修改此行为:

if (Auth::viaRemember()) { 
   //
}

指定看守器

当你把 auth 中间件添加到路由中时,同时也能指定使用哪个看守器进行用户认证。指定的看守器应该对应 auth.php 配置文件中 guards 数组中的的一个键:

Auth::login($user);
// 登录并「记住」给定的用户...
Auth::login($user, true);

登录限流

如果你使用 Laravel 内置的 LoginController 类,IlluminateFoundationAuthThrottlesLogins trait 已经包含在该控制器中了。默认情况下,如果用户多次尝试却无法提供正确的登录凭据,那么该用户在一分钟内将不能再次尝试登录。这种限流策略基于用户的用户名 / 邮箱地址及其 IP 地址的唯一性。

手动验证用户

不一定非要在 Lavarel 中使用验证控制器。如果选择删除这些控制器,就需要直接使用 Lavarel 验证类。别担心,很容易!

可以借助 Auth facade 访问 Laravel 服务,因此需要在类的开头导入  Auth 。下面来看看 attempt 方法:

Auth::guard('admin')->login($user);

attempt 方法的每个参数是一个关联数组。数组值用于在数据库中查找用户。在上面的例子中,将通过 email 列的值查找用户。如果找到该用户,将用存储在数据库中的哈希密码与数组中的 password 值做比较。不需要对 password 做哈希运算,框架在与数据库中的哈希密码做比较前自动对此值做哈希运算。如果两个哈希值匹配,将为该用户建立验证通过的 session。

如果验证成功, attempt 方法返回  true ,否则返回 false

重定向中的 intended 方法将经由身份验证中间件将用户重定向到身份验证前截获的 URL 。如果预期目标不存在,可以为此方法指定一个回退 URI 。

指定额外条件

除了用户的电子邮件和密码之外,还可以向身份验证查询添加其他条件。例如, 我们可以验证用户是不是已经被标记为 「激活」:

Auth::loginUsingId(1);
// 登录并「记住」给定用户...
Auth::loginUsingId(1, true);

{note} 在这些例子中, email

if (Auth::once($credentials)) {
    //
  }

감시자 지정
경로에 auth 미들웨어를 추가할 때 사용자 인증에 사용할 감시자를 지정할 수도 있습니다. 지정된 가드는 auth.php 구성 파일의 guards 배열에 있는 키와 일치해야 합니다: 🎜
Route::get('profile', function () { 
   // 只有认证过的用户可以进入...
 })->middleware('auth.basic');
🎜🎜
🎜

로그인 제한

🎜Laravel의 내장 LoginController 클래스를 사용하는 경우 IlluminateFoundationAuthThrottlesLogins< /code> 특성은 이 컨트롤러에 이미 포함되어 있습니다. 기본적으로 사용자가 여러 번 시도한 후에도 올바른 로그인 자격 증명을 제공하지 못하면 사용자는 1분 동안 다시 로그인을 시도할 수 없습니다. 이 제한 정책은 사용자의 사용자 이름/이메일 주소 및 IP 주소의 고유성을 기반으로 합니다. 🎜🎜🎜
🎜

수동으로 사용자 인증

🎜Lavarel에서 반드시 필요한 것은 아님 유효성 검사 사용 컨트롤러. 이러한 컨트롤러를 제거하기로 선택한 경우 Lavarel 유효성 검사 클래스를 직접 사용해야 합니다. 걱정하지 마세요. 쉽습니다! 🎜🎜Auth 파사드를 통해 Laravel 서비스에 접근할 수 있으므로, 수업 시작 시 Auth를 가져와야 합니다. attempt 메서드를 살펴보겠습니다. 🎜
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
🎜 attempt 메서드의 각 매개변수는 연관 배열입니다. 배열 값은 데이터베이스에서 사용자를 찾는 데 사용됩니다. 위의 예에서 사용자는 email 열의 값으로 검색됩니다. 사용자를 찾으면 데이터베이스에 저장된 해시된 비밀번호를 배열의 password 값과 비교합니다. password를 해시할 필요가 없습니다. 프레임워크는 값을 데이터베이스의 해시된 비밀번호와 비교하기 전에 자동으로 해시합니다. 두 해시가 일치하면 사용자에 대해 인증된 세션이 설정됩니다. 🎜🎜확인에 성공하면 attempt 메서드는 true를 반환하고, 그렇지 않으면 false를 반환합니다. 🎜🎜리디렉션의 의도 방법은 인증 미들웨어를 통해 인증 전에 가로채는 URL로 사용자를 리디렉션합니다. 예상 대상이 존재하지 않는 경우 이 메서드에 대한 대체 URI를 지정할 수 있습니다. 🎜
🎜🎜추가 조건 지정 🎜🎜사용자의 이메일 및 비밀번호 외에도 인증 쿼리에 추가 조건을 추가할 수 있습니다. 예를 들어, 사용자가 "활성화됨"으로 표시되었는지 확인할 수 있습니다. 🎜
<?php
  namespace App\Http\Middleware;
  use Illuminate\Support\Facades\Auth;
  class AuthenticateOnceWithBasicAuth{   
       /**
     * 处理传入的请求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */  
  public function handle($request, $next)  
    {       
       return Auth::onceBasic() ?: $next($request);  
     }
   }
🎜{note} 이 예에서 email은 필수 옵션이 아니며 데모 목적으로 사용됩니다. 오직. 데이터베이스에서 "username"에 해당하는 열 이름을 사용해야 합니다. 🎜🎜🎜🎜

지정된 가드 인스턴스에 액세스

Auth 파사드의 guard 메소드를 사용하여 사용하려는 가드 인스턴스를 지정할 수 있습니다. 이를 통해 완전히 독립적이고 검증 가능한 모델이나 사용자 테이블을 사용하여 애플리케이션의 다양한 부분에 대한 검증을 관리할 수 있습니다. Auth facade 的 guard 方法指定想要使用的看守器实例。这允许你使用完全独立的可验证模型或用户表来管理应用程序各个部分的验证。

传递给 guard 方法的看守器名称需要与 auth.php 配置中的配置项之一相匹配:

Route::get('api/user', function () {  
  // 只有认证过的用户可以进入...
})->middleware('auth.basic.once');

登出

用户登出需要使用 Auth facade 的 logout 方法。它会清除用户会话(session)中的用户验证信息:

use Illuminate\Support\Facades\Auth;Auth::logout();

记住用户

如果想在应用中提供 「记住我」功能,可以给 attempt 方法传递一个布尔值作为其第二个参数,这会无限期保持用户身份验证,直到用户手动登出。用户表需要包含字符串类型的 remember_token 列用于存储令牌。

'web' => [   
    // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,  
    // ...
  ],

{tip} 如果使用了 Laravel 内置的 LoginController,「记住」用户的正确逻辑已经由控制器所用的 traits 实现。

如果启用了「记住用户」,可以使用 viaRemember 方法判断是否使用了「记住我」cookie 对用户做身份验证:

use Illuminate\Support\Facades\Auth;
Auth::logoutOtherDevices($password);

其它身份验证方法

验证用户实例

如果要将已经存在的用户登入应用,可以调用 login 方法,并以用户实例作为其参数 。该对象必须实现 IlluminateContractsAuthAuthenticatable 契约 。Laravel 自带的 AppUser 模型已经实现了这个接口:

<?php
  namespace App\Providers;
  use App\Services\Auth\JwtGuard;
  use Illuminate\Support\Facades\Auth;
  use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
  class AuthServiceProvider extends ServiceProvider{   
      /**
     * 注册任意应用认证/授权服务。
     *
     * @return void
     */   
  public function boot()  
   {      
     $this->registerPolicies();        
     Auth::extend('jwt', function ($app, $name, array $config) {         
       // 返回一个 Illuminate\Contracts\Auth\Guard 实例...           
        return new JwtGuard(Auth::createUserProvider($config['provider']));     
         });   
    }}

使用如下方式指定想要的看守器实例:

'guards' => [  
  'api' => [     
     'driver' => 'jwt',        
     'provider' => 'users',    
     ],
  ],

通过 ID 验证用户身份

可以使用 loginUsingId 方法通过 ID 将用户登录到应用。这个方法接受希望验证身份用户的主键:

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
  /**
 * 注册任意应用认证/授权服务。
 *
 * @return void
 */
 public function boot(){  
   $this->registerPolicies();  
    Auth::viaRequest('custom-token', function ($request) {     
       return User::where('token', $request->token)->first();  
       });
     }

仅验证一次用户身份

可以使用 once

guard 메소드에 전달된 가드 이름은 auth.php 구성의 구성 항목 중 하나와 일치해야 합니다:

'guards' => [   
 'api' => [      
   'driver' => 'custom-token',  
   ],
 ],
Logout

사용자는 로그아웃하려면 Auth 파사드의 logout 메소드를 사용해야 합니다. 사용자 세션에서 사용자 인증 정보를 지웁니다:
<?php
    namespace App\Providers;
    use Illuminate\Support\Facades\Auth;
    use App\Extensions\RiakUserProvider;
    use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
    class AuthServiceProvider extends ServiceProvider{   
        /**
     * 注册任意应用身份验证 / 授权服务Register any application authentication / authorization services.
     *
     * @return void
     */   
      public function boot()   
       {      
         $this->registerPolicies();       
         Auth::provider('riak', function ($app, array $config) {         
            // 返回 Illuminate\Contracts\Auth\UserProvider 实例...            
            return new RiakUserProvider($app->make('riak.connection'));       
           });   
        }}
🎜🎜🎜
🎜

사용자 기억

🎜애플리케이션에 "기억하기" 기능을 제공하려는 경우 부울 값을 attempt 메소드에 두 번째 매개변수로 전달할 수 있습니다. 그러면 사용자가 로그인할 때까지 사용자가 무기한 인증됩니다. 수동으로 꺼냅니다. 토큰을 저장하려면 사용자 테이블에 문자열 유형의 remember_token 열이 포함되어야 합니다. 🎜
'providers' => [  
  'users' => [      
    'driver' => 'riak',  
      ],
  ],
🎜{tip} Laravel의 내장 LoginController를 사용하는 경우 사용자를 "기억"하는 올바른 논리는 컨트롤러에서 사용하는 특성에 의해 이미 구현되어 있습니다. 🎜
🎜"사용자 기억하기"가 활성화된 경우 viaRemember 메서드를 사용하여 "기억하기" 쿠키가 사용자를 인증하는 데 사용되는지 확인할 수 있습니다: 🎜
'guards' => [   
    'web' => [     
       'driver' => 'session',        
       'provider' => 'users',    
     ],
  ],
🎜
🎜🎜
🎜

기타 인증 방법

🎜🎜사용자 인스턴스 확인🎜🎜기존 사용자를 애플리케이션에 로그인하려면 login 메소드를 호출하고 사용자 인스턴스를 매개변수로 사용할 수 있습니다. 객체는 IlluminateContractsAuthAuthenticatable 계약을 구현해야 합니다. Laravel과 함께 제공되는 AppUser 모델은 이 인터페이스를 구현했습니다: 🎜
<?php
    namespace Illuminate\Contracts\Auth;
    interface UserProvider {  
      public function retrieveById($identifier);    
      public function retrieveByToken($identifier, $token);    
      public function updateRememberToken(Authenticatable $user, $token);    
      public function retrieveByCredentials(array $credentials);    
      public function validateCredentials(Authenticatable $user, array $credentials);
     }
🎜원하는 가드 인스턴스를 지정하려면 다음 방법을 사용하십시오: 🎜
<?php
   namespace Illuminate\Contracts\Auth;
   interface Authenticatable {   
      public function getAuthIdentifierName();    
      public function getAuthIdentifier();    
      public function getAuthPassword();    
      public function getRememberToken();    
      public function setRememberToken($value);    
      public function getRememberTokenName();
     }
🎜🎜ID로 사용자 신원을 확인🎜🎜loginUsingId 메소드를 사용하여 ID로 사용자를 애플리케이션에 로그인할 수 있습니다. 이 방법은 인증하려는 사용자의 기본 키를 허용합니다: 🎜
/**
 * 应用的事件监听器映射。
 *
 * @var array
 */
 protected $listen = [   
    'Illuminate\Auth\Events\Registered' => [     
       'App\Listeners\LogRegisteredUser',  
       ],  
     'Illuminate\Auth\Events\Attempting' => [     
        'App\Listeners\LogAuthenticationAttempt', 
         ],  
      'Illuminate\Auth\Events\Authenticated' => [    
         'App\Listeners\LogAuthenticated',   
        ],  
      'Illuminate\Auth\Events\Login' => [     
         'App\Listeners\LogSuccessfulLogin',   
        ],  
      'Illuminate\Auth\Events\Failed' => [     
         'App\Listeners\LogFailedLogin',   
        ], 
      'Illuminate\Auth\Events\Logout' => [      
           'App\Listeners\LogSuccessfulLogout',  
           ],   
       'Illuminate\Auth\Events\Lockout' => [     
         'App\Listeners\LogLockout',   
         ],  
       'Illuminate\Auth\Events\PasswordReset' => [     
         'App\Listeners\LogPasswordReset',   
         ],
      ];
🎜🎜사용자를 한 번만 인증하세요🎜🎜한 번 메서드 요청 중에 사용자를 애플리케이션에 로그인합니다. 이렇게 하면 세션이나 쿠키가 사용되지 않습니다. 즉, 이 방법은 상태 비저장 API를 구축하는 데 도움이 됩니다. 🎜rrreee🎜🎜🎜🎜🎜🎜

HTTP 기본 인증

HTTP 기본 인증은 전용 "로그인" 페이지를 설정하지 않고도 애플리케이션에서 사용자를 인증하는 빠른 방법을 제공합니다. 시작하기 전에 auth.basic 미들웨어를 경로에 연결하세요. auth.basic 미들웨어는 이미 Laravel 프레임워크에 포함되어 있으므로 정의할 필요가 없습니다. auth.basic 中间件 附加到你的路由中。auth.basic 中间件已包含在 Laravel 框架中,所以你不需要定义它:

rrreee

将中间件附加到路由后,在浏览器中访问此路由时将自动提示您输入凭据。默认的,auth.basic 中间件把用户记录上的 email 字段 作为「用户名」。

FastCGI 的注意事项

如果你正使用 PHP FastCGI 模式,HTTP 基础认证可能无法正常工作。需要把下面几行添加到你的 .htaccess 文件中:

rrreee

无状态 HTTP 基础认证

你也可以使用 HTTP 基础身份验证,而无需在会话中设置用户标识符 cookie,这对 API 的身份验证特别有用。为此 ,请定义一个中间件 它将调用 onceBasic 方法。如果 onceBasic 方法没有返回任何响应,那么请求就可以进一步传递到应用程序中:

rrreee

接着, 注册路由中间件 并将它附加到路由:

rrreee

退出

要手动把用户从应用中退出登录,你可以使用 Auth facade 上的 logout 方法。这将清除用户会话中的身份认证信息:

rrreee

让其它设备上的 Session 失效

Laravel 还提供了一种机制,用于将其它设备上的用户 Session 失效和「注销」,而不会使其当前设备上的 Session 失效。首先,你需要保证 IlluminateSessionMiddlewareAuthenticateSession 中间件在你的 app/Http/Kernel.php 类中的 web 中间件组中,并且没有被注释掉:

rrreee

然后, 你就可以使用 Auth facade 上的 logoutOtherDevices 方法。此方法要求用户提供其当前密码,你的应用程序应通过输入表单接受该密码:

rrreee

{note} 当调用 logoutOtherDevicesrrreee

미들웨어를 경로에 연결한 후 경로에 액세스할 때 자동으로 입력하라는 메시지가 표시됩니다. 브라우저 자격 증명에서 이 경로를 확인하세요. 기본적으로 auth.basic 미들웨어는 사용자 기록의 email 필드를 "사용자 이름"으로 사용합니다.

FastCGI 참고 사항

PHP FastCGI 모드를 사용하는 경우 HTTP 기본 인증이 제대로 작동하지 않을 수 있습니다. .htaccess 파일에 다음 줄을 추가해야 합니다: rrreee

🎜

상태 비저장 HTTP 기본 인증

🎜세션에서 사용자 식별자 쿠키를 설정하지 않고도 HTTP 기본 인증을 사용할 수도 있는데, 이는 특히 API 인증에 유용합니다. 이렇게 하려면 onceBasic 메서드를 호출하는 미들웨어를 정의하세요. onceBasic 메서드가 응답을 반환하지 않으면 요청을 애플리케이션에 추가로 전달할 수 있습니다: 🎜rrreee🎜 다음으로 라우팅 미들웨어를 등록하고 이를 경로에 연결합니다: 🎜rrreee🎜
🎜🎜
🎜🎜Logout🎜🎜사용자를 애플리케이션에서 수동으로 로그아웃하려면 인증을 사용하세요. 파사드 logout 메소드. 이렇게 하면 사용자 세션의 인증 정보가 지워집니다. 🎜rrreee🎜🎜🎜
🎜

다른 장치의 세션 무효화

🎜Laravel은 또한 현재 장치의 세션을 무효화하지 않고 다른 장치의 사용자 세션을 무효화하고 "로그아웃"하는 메커니즘을 제공합니다. 먼저, IlluminateSessionMiddlewareAuthenticateSession 미들웨어가 app/Http/Kernel.php 클래스의 web 미들웨어 그룹에 있는지 확인해야 합니다. 주석 처리됨: 🎜rrreee🎜 그런 다음 Auth 파사드에서 logoutOtherDevices 메소드를 사용할 수 있습니다. 이 메소드를 사용하려면 사용자가 현재 비밀번호를 제공해야 하며, 애플리케이션은 입력 양식을 통해 이를 허용해야 합니다. 🎜rrreee
🎜{note} logoutOtherDevices 메소드가 호출되면 사용자의 다른 세션은 완전히 비활성화됩니다. 이는 이전에 인증된 모든 감시자를 "종료"한다는 의미입니다. 🎜🎜🎜🎜🎜🎜🎜🎜

사용자 정의 감시자 추가

Auth 파사드의 extend 메소드를 사용하여 자신만의 인증 감시자를 정의할 수 있습니다. 서비스 제공자에서 extend 메소드를 호출해야 합니다. Laravel은 이미 AuthServiceProvider와 함께 제공되므로 해당 공급자에 코드를 넣을 수 있습니다: Auth facade 的 extend 方法来定义自己的身份验证看守器。你应该在 服务提供器 中调用  extend 方法。由于 Laravel 已经附带了 AuthServiceProvider,我们可以将代码放在该提供器中:

rrreee

正如你在上面的示例中所看到的,传递给 extend 方法的回调应该返回一个实现 IlluminateContractsAuthGuard 接口的实例。这个接口包含了一些你需要在自定义的看守器中实现的方法。当你的自定义看守器定义完成之后,你可以在 auth.php 配置文件的 guards 配置中使用这个看守器:

rrreee

请求闭包看守器

实现基于 HTTP 请求的自定义身份验证系统的最简单方法,是使用 Auth::viaRequest 方法。此方法允许您使用单个闭包来快速定义身份验证过程。

首先,在 AuthServiceProviderboot 方法中调用 Auth::viaRequest 方法。viaRequest 方法接受一个看守器名称作为其第一个参数。此名称可以是描述你自定义看守器的任何字符串。传递给该方法的第二个参数应该是一个闭包函数,它接收传入的 HTTP 请求并返回一个用户实例,或者,如果验证失败,则为 null

rrreee

当你完成了自定义看守器后,就可以在 auth.php 配置文件的 guards 配置中使用这个看守器:

rrreee

添加自定义用户提供器

如果不使用传统的关系数据库存储用户,就需要使用自己的身份验证用户提供器扩展 Lavarel。可以使用 Auth facade 的 provider 方法自定义用户提供器:

rrreee

一旦使用 provider 方法注册完毕,就可以在 auth.php 配置文件中切换到新的用户提供器。先定义一个使用新驱动的 provider

rrreee

随后就可以在 guardsrrreee

위의 예에서 볼 수 있듯이 extend에 전달합니다. 메서드의 콜백이 반환되어야 합니다. IlluminateContractsAuthGuard 인터페이스를 구현하는 인스턴스입니다. 이 인터페이스에는 사용자 정의 감시자에서 구현해야 하는 몇 가지 메서드가 포함되어 있습니다. 사용자 정의 가드가 정의된 후 auth.php 구성 파일의 guards 구성에서 이 가드를 사용할 수 있습니다:

rrreee

클로저 가드 요청

HTTP 요청을 기반으로 사용자 정의 인증 시스템을 구현하는 가장 좋은 방법 간단한 방법은 다음과 같습니다. Auth::viaRequest 메소드를 사용하세요. 이 방법을 사용하면 단일 클로저를 사용하여 인증 프로세스를 빠르게 정의할 수 있습니다. 🎜🎜먼저 AuthServiceProviderboot 메서드에서 Auth::viaRequest 메서드를 호출하세요. viaRequest 메소드는 첫 번째 매개변수로 감시자 이름을 허용합니다. 이 이름은 사용자 정의 감시자를 설명하는 문자열일 수 있습니다. 이 메소드에 전달된 두 번째 매개변수는 들어오는 HTTP 요청을 수신하고 사용자 인스턴스를 반환하는 클로저 함수이거나 검증에 실패할 경우 null이어야 합니다. 🎜rrreee🎜가드 사용자 정의를 완료한 후에는 auth.php 구성 파일의 guards 구성에서 사용할 수 있습니다: 🎜rrreee🎜🎜🎜
🎜🎜사용자 지정 사용자 공급자 추가🎜🎜기존 관계형 데이터베이스를 사용하여 사용자를 저장하지 않는 경우 자체 ID 인증 사용자 공급자 확장 Lavarel을 사용해야 합니다. 사용자 공급자는 Auth 파사드의 provider 메소드를 사용하여 사용자 정의할 수 있습니다. 🎜rrreee🎜provider 메소드를 사용하여 등록한 후에는 < code> auth.php 구성 파일을 사용하여 새 사용자 공급자로 전환합니다. 먼저 새 드라이버를 사용하는 provider를 정의합니다: 🎜rrreee🎜 그런 다음 guards 구성에서 이 공급자를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜

User Provider Contract

IlluminateContractsAuthUserProvider 구현은 MySQL, Riak 등과 같은 영구 저장 시스템에서 IlluminateContractsAuthAuthenticatable 구현을 추출하는 역할만 담당합니다. 두 인터페이스 모두 Laravel의 인증 메커니즘이 사용자가 저장되는 방식 및 이를 표현하는 데 사용되는 클래스 유형에 관계없이 계속 작동하도록 허용합니다. IlluminateContractsAuthUserProvider 实现仅负责从 MySQL、Riak 等持久化存储系统中提取 IlluminateContractsAuthAuthenticatable 实现。无论用户如何存储及用于表示它的类是什么类型,这两个接口都允许 Laravel 身份验证机制继续运行:

我们来看看 IlluminateContractsAuthUserProvider 契约:

rrreee

retrieveById 函数通常接受用于表示类的 key(如 MySQL 数据库中自动递增的 ID)作为参数,并获取和返回与这个 ID 匹配的 Authenticatable 实现。

retrieveByToken 函数通过用户的唯一 $identifier 和存储在 remember_token 列的 「记住我」 令牌获取用户。与前一方法相同,它返回 Authenticatable 实现。

updateRememberToken 方法用新  $token 更新  $userremember_token 列。在「记住我」登录校验成功或者用户登出时分配「刷新令牌」。

在尝试登录到应用时,retrieveByCredentials 方法接受凭证数组传递给 Auth::attempt 方法。此方法在底层持久化存储中「查询」与这些凭证匹配的用户。通常,此方法运行一个基于 $credentials['username'] 的 「where」 条件,它应该返回一个 Authenticatable 实现。此方法不就尝试进行任何密码校验或身份验证。

validateCredentials 方法应该比较给定的 $user$credentials 来验证用户身份。例如,此方法或许应该使用 Hash::check 来比较 $user->getAuthPassword() 的值与 $credentials['password'] 的值。它应该返回 truefalse

IlluminateContractsAuthUserProvider 계약을 살펴보겠습니다.

rrreee retrieveById 함수는 일반적으로 클래스를 나타내는 데 사용되는 키(예: MySQL 데이터베이스의 자동 증가 ID)를 매개변수로 받아들이고, 이와 일치하는 인증 가능 구현을 가져와 반환합니다. ID.

retrieveByToken 함수는 고유한 $identifierremember_token 열에 저장된 "remember me" 토큰을 통해 사용자를 검색합니다. 이전 방법과 마찬가지로 인증 가능 구현을 반환합니다.
updateRememberToken 메소드는 $userremember_token 열을 새로운 $token으로 업데이트합니다. "Remember Me" 로그인 확인이 성공하거나 사용자가 로그아웃하면 "새로 고침 토큰"이 할당됩니다. 🎜🎜 retrieveByCredentials 메소드는 애플리케이션에 로그인을 시도할 때 Auth::attempt 메소드에 전달된 자격 증명 배열을 허용합니다. 이 방법은 이러한 자격 증명과 일치하는 사용자에 대한 기본 지속성 저장소를 "쿼리"합니다. 일반적으로 이 메서드는 인증 가능 구현을 반환해야 하는 $credentials['username']을 기반으로 "where" 조건을 실행합니다. 이 방법은 비밀번호 확인이나 인증을 시도하지 않습니다. 🎜🎜validateCredentials 메소드는 주어진 $user$credentials와 비교하여 사용자의 신원을 확인해야 합니다. 예를 들어, 이 메소드는 $user->getAuthPassword() 값을 $credentials['password']와 비교하기 위해 Hash::check를 사용해야 합니다. 값. 사용자의 비밀번호가 유효한지 여부를 나타내려면 true 또는 false를 반환해야 합니다. 🎜🎜🎜🎜🎜🎜🎜

인증 계약

UserProvider의 각 메소드를 분석했습니다. 인증 가능 계약을 살펴보겠습니다. 사용자 공급자의 retrieveById, retrieveByTokenretrieveByCredentials 메서드는 이 인터페이스의 인스턴스를 반환한다는 점을 기억하세요. UserProvider 的每个方法。下面再来看看 Authenticatable 契约。切记,用户提供器的 retrieveByIdretrieveByTokenretrieveByCredentials 方法将返回此接口的实例:

rrreee

这个接口很简单。 getAuthIdentifierName 方法应该返回用户 「主键」 列的名字, getAuthIdentifier 方法则返回用户 「主键」。在 MySQL 后台,它会是自增主键。 getAuthPassword 方法应该返回用户的哈希密码。此接口允许身份验证系统与任一 User 类一直工作,不管使用的是哪种 ORM 或抽象存储层。默认情况下,Laravel 的 app 目录会包含一个实现了此接口的 User 类,你可以以这个实现示例作为参考。

事件

在身份验证处理过程中 Laravel 引发了多种 事件 。 可以在  EventServiceProviderrrreee

이 인터페이스는 간단합니다. getAuthIdentifierName 메서드는 사용자의 "기본 키" 열 이름을 반환해야 하며, getAuthIdentifier 메서드는 사용자의 "기본 키"를 반환해야 합니다. MySQL 백엔드에서는 자동 증가 기본 키가 됩니다. getAuthPassword 메소드는 사용자의 해시된 비밀번호를 반환해야 합니다. 이 인터페이스를 사용하면 어떤 ORM 또는 추상화 저장소 계층이 사용되는지에 관계없이 인증 시스템이 항상 모든 User 클래스에서 작동할 수 있습니다. 기본적으로 Laravel의 app 디렉토리에는 이 인터페이스를 구현하는 User 클래스가 포함됩니다. 이 구현 예제를 참조로 사용할 수 있습니다.

이벤트

🎜Laravel은 인증 프로세스 중에 다양한 이벤트를 발생시킵니다. 이러한 이벤트에 대한 리스너는 EventServiceProvider에 첨부할 수 있습니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜