사용자 인증
ㅋㅋ >
- 데이터베이스 노트
- 라우팅
- 보기 인증
- 인증된 사용자 검색
- 경로 보호
- 로그인 제한
- 사용자 수동 확인
사용자 기억 -
- 기타 인증 방법
- HTTP 기본 인증
상태 비저장 HTTP 기본 인증 - 다른 기기에 대한 잘못된 세션
- 사용자 지정 보호 추가
- 요청 보호 닫기
- 사용자 공급자 계약
- 인증 가능한 계약
- event
인용문
{tip} 빠르게 시작하고 싶으신가요? 새로운 Laravel 애플리케이션에서
php artisan make:auth
및php artisan migration
을 실행하세요. 그런 다음 브라우저에서http://your-app.test/register
또는 애플리케이션에 할당된 다른 URL로 이동하세요. 이 두 명령은 전체 인증 시스템 구축을 담당합니다!php artisan make:auth
和php 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
config/auth.php
에 있으며 인증 서비스의 동작을 조정하기 위한 여러 잘 문서화된 옵션이 포함되어 있습니다. 공급자는 영구 저장소에서 사용자를 검색하는 방법을 결정합니다. Laravel은 Eloquent 및 데이터베이스 쿼리 빌더를 사용하여 사용자 검색을 지원합니다. 그러나 애플리케이션의 요구 사항에 따라 다른 공급자를 자유롭게 정의할 수 있습니다. 이 말이 혼란스럽게 들린다면 걱정하지 마세요! 많은 애플리케이션은 기본 인증 구성을 수정할 필요가 없습니다. 🎜🎜🎜🎜데이터베이스 고려 사항
🎜기본적으로 Laravel에는 < code>AppUser Eloquent 모델은app
디렉터리에 있습니다. 이 모델은 기본 Eloquent 인증 드라이버와 함께 사용할 수 있습니다. 애플리케이션이 Eloquent를 사용하지 않는 경우 Laravel 쿼리 빌더를 사용하는 database
인증 드라이버를 사용할 수 있습니다. 🎜🎜 AppUser
모델에 대한 데이터베이스 스키마를 생성할 때 비밀번호 길이가 60자 이상인지 확인하세요. 기본 문자열 길이인 255자를 유지하는 것이 좋습니다. 🎜🎜또한 "users"(또는 이에 상응하는) 테이블에 null 허용 100자 remember_token
문자열이 포함되어 있는지 확인해야 합니다. 이 열은 사용자가 애플리케이션에 로그인할 때 "Remember Me" 옵션을 선택할 때 토큰을 저장하는 데 사용됩니다. 🎜🎜🎜🎜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 下。你可以在 LoginController
,RegisterController
, ResetPasswordController
,还有 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
,ResetPasswordController
및VerificationController
컨트롤러에서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은 기본적으로 인증을 위해LoginController
컨트롤러에서username
메서드를 정의할 수 있습니다. 🎜use Illuminate\Support\Facades\Auth; // 获取当前通过认证的用户... $user = Auth::user(); // 获取当前通过认证的用户 ID... $id = Auth::id();🎜🎜맞춤 감시자
사용자 인증 및 등록을 위한 "감시자"를 맞춤 설정할 수도 있습니다. 이 기능을 구현하려면
LoginController
,RegisterController
및ResetPasswordController
에guard
메서드를 정의해야 합니다. 이 메소드는 가드 인스턴스를 반환합니다:LoginController
,RegisterController
和ResetPasswordController
中定义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
方法包含了验证新用户的规则,你可以随心所欲地自定义该方法。
RegisterController
的create
方法负责使用 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
메서드에는 새 사용자를 확인하기 위한 규칙이 포함되어 있습니다. 이 메서드를 원하는 대로 맞춤 설정할 수 있습니다. 🎜🎜RegisterController
의create
메소드는 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
方法的每个参数是一个关联数组。数组值用于在数据库中查找用户。在上面的例子中,将通过password
值做比较。不需要对password
做哈希运算,框架在与数据库中的哈希密码做比较前自动对此值做哈希运算。如果两个哈希值匹配,将为该用户建立验证通过的 session。如果验证成功,
attempt
方法返回true
,否则返回false
。重定向中的
intended
方法将经由身份验证中间件将用户重定向到身份验证前截获的 URL 。如果预期目标不存在,可以为此方法指定一个回退 URI 。指定额外条件
除了用户的电子邮件和密码之外,还可以向身份验证查询添加其他条件。例如, 我们可以验证用户是不是已经被标记为 「激活」:
Auth::loginUsingId(1); // 登录并「记住」给定用户... Auth::loginUsingId(1, true);{note} 在这些例子中,
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
메서드의 각 매개변수는 연관 배열입니다. 배열 값은 데이터베이스에서 사용자를 찾는 데 사용됩니다. 위의 예에서 사용자는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} 이 예에서지정된 가드 인스턴스에 액세스
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', ], ];🎜🎜사용자를 한 번만 인증하세요🎜🎜한 번을 사용할 수 있습니다 단일 패스의 code> 메서드 요청 중에 사용자를 애플리케이션에 로그인합니다. 이렇게 하면 세션이나 쿠키가 사용되지 않습니다. 즉, 이 방법은 상태 비저장 API를 구축하는 데 도움이 됩니다. 🎜rrreee🎜🎜🎜🎜🎜🎜
HTTP 기본 인증
HTTP 기본 인증은 전용 "로그인" 페이지를 설정하지 않고도 애플리케이션에서 사용자를 인증하는 빠른 방법을 제공합니다. 시작하기 전에
rrreeeauth.basic
미들웨어를 경로에 연결하세요.auth.basic
미들웨어는 이미 Laravel 프레임워크에 포함되어 있으므로 정의할 필요가 없습니다.auth.basic
中间件 附加到你的路由中。auth.basic
中间件已包含在 Laravel 框架中,所以你不需要定义它:将中间件附加到路由后,在浏览器中访问此路由时将自动提示您输入凭据。默认的,
auth.basic
中间件把用户记录上的FastCGI 的注意事项
如果你正使用 PHP FastCGI 模式,HTTP 基础认证可能无法正常工作。需要把下面几行添加到你的
rrreee.htaccess
文件中:无状态 HTTP 基础认证
你也可以使用 HTTP 基础身份验证,而无需在会话中设置用户标识符 cookie,这对 API 的身份验证特别有用。为此 ,请定义一个中间件 它将调用
rrreeeonceBasic
方法。如果onceBasic
方法没有返回任何响应,那么请求就可以进一步传递到应用程序中:接着, 注册路由中间件 并将它附加到路由:
rrreee退出
要手动把用户从应用中退出登录,你可以使用
rrreeeAuth
facade 上的logout
方法。这将清除用户会话中的身份认证信息:让其它设备上的 Session 失效
Laravel 还提供了一种机制,用于将其它设备上的用户 Session 失效和「注销」,而不会使其当前设备上的 Session 失效。首先,你需要保证
rrreeeIlluminateSessionMiddlewareAuthenticateSession
中间件在你的app/Http/Kernel.php
类中的web
中间件组中,并且没有被注释掉:然后, 你就可以使用
rrreeeAuth
facade 上的logoutOtherDevices
方法。此方法要求用户提供其当前密码,你的应用程序应通过输入表单接受该密码:{note} 当调用
미들웨어를 경로에 연결한 후 경로에 액세스할 때 자동으로 입력하라는 메시지가 표시됩니다. 브라우저 자격 증명에서 이 경로를 확인하세요. 기본적으로logoutOtherDevices
rrreeeauth.basic
미들웨어는 사용자 기록의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
메소드가 호출되면 사용자의 다른 세션은 완전히 비활성화됩니다. 이는 이전에 인증된 모든 감시자를 "종료"한다는 의미입니다. 🎜🎜🎜🎜🎜🎜🎜🎜사용자 정의 감시자 추가
rrreee
Auth
파사드의extend
메소드를 사용하여 자신만의 인증 감시자를 정의할 수 있습니다. 서비스 제공자에서extend
메소드를 호출해야 합니다. Laravel은 이미AuthServiceProvider
와 함께 제공되므로 해당 공급자에 코드를 넣을 수 있습니다:Auth
facade 的extend
方法来定义自己的身份验证看守器。你应该在 服务提供器 中调用extend
方法。由于 Laravel 已经附带了AuthServiceProvider
,我们可以将代码放在该提供器中:正如你在上面的示例中所看到的,传递给
rrreeeextend
方法的回调应该返回一个实现IlluminateContractsAuthGuard
接口的实例。这个接口包含了一些你需要在自定义的看守器中实现的方法。当你的自定义看守器定义完成之后,你可以在auth.php
配置文件的guards
配置中使用这个看守器:请求闭包看守器
实现基于 HTTP 请求的自定义身份验证系统的最简单方法,是使用
Auth::viaRequest
方法。此方法允许您使用单个闭包来快速定义身份验证过程。首先,在
rrreeeAuthServiceProvider
的boot
方法中调用Auth::viaRequest
方法。viaRequest
方法接受一个看守器名称作为其第一个参数。此名称可以是描述你自定义看守器的任何字符串。传递给该方法的第二个参数应该是一个闭包函数,它接收传入的 HTTP 请求并返回一个用户实例,或者,如果验证失败,则为null
:当你完成了自定义看守器后,就可以在
rrreeeauth.php
配置文件的guards
配置中使用这个看守器:添加自定义用户提供器
如果不使用传统的关系数据库存储用户,就需要使用自己的身份验证用户提供器扩展 Lavarel。可以使用
rrreeeAuth
facade 的provider
方法自定义用户提供器:一旦使用
rrreeeprovider
方法注册完毕,就可以在auth.php
配置文件中切换到新的用户提供器。先定义一个使用新驱动的provider
:随后就可以在
위의 예에서 볼 수 있듯이guards
rrreeeextend
에 전달합니다. 메서드의 콜백이 반환되어야 합니다.IlluminateContractsAuthGuard
인터페이스를 구현하는 인스턴스입니다. 이 인터페이스에는 사용자 정의 감시자에서 구현해야 하는 몇 가지 메서드가 포함되어 있습니다. 사용자 정의 가드가 정의된 후auth.php
구성 파일의guards
구성에서 이 가드를 사용할 수 있습니다:HTTP 요청을 기반으로 사용자 정의 인증 시스템을 구현하는 가장 좋은 방법 간단한 방법은 다음과 같습니다.클로저 가드 요청
Auth::viaRequest
메소드를 사용하세요. 이 방법을 사용하면 단일 클로저를 사용하여 인증 프로세스를 빠르게 정의할 수 있습니다. 🎜🎜먼저AuthServiceProvider
의boot
메서드에서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 身份验证机制继续运行:我们来看看
rrreeeIlluminateContractsAuthUserProvider
契约:
retrieveById
函数通常接受用于表示类的 key(如 MySQL 数据库中自动递增的 ID)作为参数,并获取和返回与这个 ID 匹配的Authenticatable
实现。
retrieveByToken
函数通过用户的唯一$identifier
和存储在remember_token
列的 「记住我」 令牌获取用户。与前一方法相同,它返回Authenticatable
实现。
updateRememberToken
方法用新$token
更新$user
的remember_token
列。在「记住我」登录校验成功或者用户登出时分配「刷新令牌」。在尝试登录到应用时,
retrieveByCredentials
方法接受凭证数组传递给Auth::attempt
方法。此方法在底层持久化存储中「查询」与这些凭证匹配的用户。通常,此方法运行一个基于$credentials['username']
的 「where」 条件,它应该返回一个Authenticatable
实现。此方法不就尝试进行任何密码校验或身份验证。
validateCredentials
方法应该比较给定的$user
与$credentials
来验证用户身份。例如,此方法或许应该使用Hash::check
来比较$user->getAuthPassword()
的值与$credentials['password']
的值。它应该返回true
或false
IlluminateContractsAuthUserProvider
계약을 살펴보겠습니다.retrieveByToken
함수는 고유한$identifier
와remember_token
열에 저장된 "remember me" 토큰을 통해 사용자를 검색합니다. 이전 방법과 마찬가지로인증 가능
구현을 반환합니다.updateRememberToken
메소드는$user
의remember_token
열을 새로운$token
으로 업데이트합니다. "Remember Me" 로그인 확인이 성공하거나 사용자가 로그아웃하면 "새로 고침 토큰"이 할당됩니다. 🎜🎜retrieveByCredentials
메소드는 애플리케이션에 로그인을 시도할 때Auth::attempt
메소드에 전달된 자격 증명 배열을 허용합니다. 이 방법은 이러한 자격 증명과 일치하는 사용자에 대한 기본 지속성 저장소를 "쿼리"합니다. 일반적으로 이 메서드는인증 가능
구현을 반환해야 하는$credentials['username']
을 기반으로 "where" 조건을 실행합니다. 이 방법은 비밀번호 확인이나 인증을 시도하지 않습니다. 🎜🎜validateCredentials
메소드는 주어진$user
를$credentials
와 비교하여 사용자의 신원을 확인해야 합니다. 예를 들어, 이 메소드는$user->getAuthPassword()
값을$credentials['password']와 비교하기 위해
Hash::check
를 사용해야 합니다. 코드> 값. 사용자의 비밀번호가 유효한지 여부를 나타내려면true
또는false
를 반환해야 합니다. 🎜🎜🎜🎜🎜🎜🎜인증 계약
rrreee
UserProvider
의 각 메소드를 분석했습니다.인증 가능
계약을 살펴보겠습니다. 사용자 공급자의retrieveById
,retrieveByToken
및retrieveByCredentials
메서드는 이 인터페이스의 인스턴스를 반환한다는 점을 기억하세요.UserProvider
的每个方法。下面再来看看Authenticatable
契约。切记,用户提供器的retrieveById
、retrieveByToken
和retrieveByCredentials
方法将返回此接口的实例:这个接口很简单。
getAuthIdentifierName
方法应该返回用户 「主键」 列的名字,getAuthIdentifier
方法则返回用户 「主键」。在 MySQL 后台,它会是自增主键。getAuthPassword
方法应该返回用户的哈希密码。此接口允许身份验证系统与任一 User 类一直工作,不管使用的是哪种 ORM 或抽象存储层。默认情况下,Laravel 的app
目录会包含一个实现了此接口的User
类,你可以以这个实现示例作为参考。事件
在身份验证处理过程中 Laravel 引发了多种 事件 。 可以在
이 인터페이스는 간단합니다.EventServiceProvider
rrreeegetAuthIdentifierName
메서드는 사용자의 "기본 키" 열 이름을 반환해야 하며,getAuthIdentifier
메서드는 사용자의 "기본 키"를 반환해야 합니다. MySQL 백엔드에서는 자동 증가 기본 키가 됩니다.getAuthPassword
메소드는 사용자의 해시된 비밀번호를 반환해야 합니다. 이 인터페이스를 사용하면 어떤 ORM 또는 추상화 저장소 계층이 사용되는지에 관계없이 인증 시스템이 항상 모든 User 클래스에서 작동할 수 있습니다. 기본적으로 Laravel의app
디렉토리에는 이 인터페이스를 구현하는User
클래스가 포함됩니다. 이 구현 예제를 참조로 사용할 수 있습니다.이벤트
🎜Laravel은 인증 프로세스 중에 다양한 이벤트를 발생시킵니다. 이러한 이벤트에 대한 리스너는EventServiceProvider
에 첨부할 수 있습니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜