ホームページ > 記事 > PHPフレームワーク > Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する
次は、Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する Auth スキャフォールディングに関連する 9 つのヒントを共有する Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する チュートリアル コラムです。友人の役に立てば幸いです。必要としている!
#Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する には優れた既製のユーザー認証システムがありますが、もちろん、場所によっては設定をカスタマイズする必要もあります。一部のカスタム構成では、拡張パックを見つけたり、大量のコードを記述したりする必要はありません。この認証システムの背後に隠された興味深い機能を見てみましょう。
メソッド Auth::routes()
は Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する UI パッケージ## から来ていることを誰もが知っておくべきです。 # (Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する 7 より前は、カーネルに含まれていました)。
Auth::routes([ 'login' => true, 'logout' => true, 'register' => true, 'reset' => true, // 用于重置密码 'confirm' => false, // 用于额外的密码确认 'verify' => false, // 用于邮箱认证 ]);これらのパラメータは、特定のルートのみを有効または無効にします。 これらがどのように機能するかを理解するには、ドキュメント
Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する UI の AuthRouteMethods:
return function ($options = []) { // 登录路由... if ($options['login'] ?? true) { $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); } // 登出路由... if ($options['logout'] ?? true) { $this->post('logout', 'Auth\LoginController@logout')->name('logout'); } // 注册路由... if ($options['register'] ?? true) { $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); } // 密码重设路由... if ($options['reset'] ?? true) { $this->resetPassword(); } // 密码确认路由... if ($options['confirm'] ?? class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))) { $this->confirmPassword(); } // 邮箱验证路由... if ($options['verify'] ?? false) { $this->emailVerification(); } };
php artisan ui vue --authしかし、ビジュアル UI が必要ない場合はどうすればよいでしょうか?フレームワークにフロントエンドを含まない API のみのプロジェクトを作成した場合はどうなるでしょうか? Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する Auth とそのコントローラーは引き続き使用できます。 Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する UI をインストールし、次のコマンドを実行します。
php artisan ui:controllers生成されるのは
app/Http/Controllers/Auth だけなので、それらを使用するために Blade または Vue ファイルは必要ありません。
Github リポジトリ を参照してください。
password.confirmというミドルウェアを保護したいルートに追加するだけです。
Route::get('/secrets', 'SecretsController@show')->middleware('password.confirm');
このルートにアクセスしようとすると、プロンプトが表示されますパスワードを確認します。GitHub などの他のアプリケーションで見られるものと同じです。 パスワードを確認すると、デフォルトでタイムスタンプがユーザー セッションに保存されます。タイムスタンプは3 時間 継続するため、この期間中、ユーザーはパスワードを再度入力する必要はありません。
この期間は、auth
構成ファイルの
password_timeout構成オプションを使用してカスタマイズできます。
Auth::logoutOtherDevices($password);通常の使用法は、現在のデバイスに正常にログインした後に他のデバイスからログアウトすることです。これを行うには、Trait
AuthenticatesUsers.php のメソッド
authenticated() をオーバーライドし、それを
app/Http/Controllers/Auth/LoginController.php中:
protected function authenticated(Request $request, $user) { \Auth::logoutOtherDevices(request('password')); }また、
app/Http/Kernel.php ファイル内のミドルウェア
AuthenticateSession をアクティブ化することを忘れないでください。これはデフォルトでコメントアウトされています:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
class RegisterController extends Controller { protected $redirectTo = RouteServiceProvider::HOME;したがって、リダイレクトする URL を指定できます。ログイン/登録が成功した後。デフォルト値は
app/Providers/RouteServiceProvider.php にあります:
class RouteServiceProvider extends ServiceProvider { public const HOME = '/home';これをカスタマイズするにはどうすればよいですか? まず、ログイン コントローラーと登録コントローラーの
$redirectTo プロパティにそれぞれ他の値を指定できます。
動的 リダイレクト ロジックがある場合はどうなるでしょうか?
您可以在身份验证控制器中创建一个redirectTo()
方法,然后在其中指定条件。该方法将覆盖$ redirectTo
属性的任何值。
参见示例:
class RegisterController extends Controller { protected $redirectTo = RouteServiceProvider::HOME; protected function redirectTo() { if (auth()->user()->role_id == 1) { return '/admin'; } return '/home'; }
如果您需要创建一个新用户,但还没有准备好注册页面该怎么办?
只需在您的终端中打开 Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する Tinker:
php artisan tinker
如果您不熟悉 Tinker,需要知道它是能够执行任何 Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する / PHP 代码的命令行工具。因此,在其中,您可以轻松创建用户,键入此 Eloquent 命令并按 Enter:
\App\User::create(['name' => 'Admin', 'email' => 'admin@admin.com', 'password' => bcrypt('somesecurepassword')]);
但是,如果您需要创建许多用户进行测试,例如10、100或1000,该怎么办?没问题,我们可以在database / factories / UserFactory.php
中使用 Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する 默认提供的 Factory 类:
$factory->define(User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // 密码 'remember_token' => Str::random(10), ]; });
这些是我们创建的“假”用户的默认值。为此,我们将生成一个 Seeder 文件:
php artisan make:seeder UsersSeeder
然后,我们打开生成的文件database / seeds / UsersSeeder.php
,并用以下代码填充run()
方法:
public function run() { // This will create 100 users factory(App\User::class, 100)->create(); }
要运行它,我们需要执行以下命令:
php artisan db:seed --class=UsersSeeder
您可以在Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する官方文档中了解更多有关数据库种子的信息。
默认情况下,Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する用户使用邮箱和密码进行身份验证。但是,如果您的用户标识不使用邮箱怎么办?例如,使用用户名作为标识。
您可以通过覆盖 traitAuthenticatesUsers.php
中的一种方法来轻松更改它。
这是默认值:
trait AuthenticatesUsers { // ... 其他方法 public function username() { return 'email'; }
您可以将其复制到您的LoginController.php
中,只需更改值即可:
class LoginController extends Controller { use AuthenticatesUsers; // ... 其他方法 public function username() { return 'username'; } }
让我们更进一步。如果您想让用户可以使用邮箱或用户名登录怎么办?这样的话,用户可以在“邮箱/用户名”字段中选择其中一个填写。
让我们向上面的username()
方法添加一个判断。我们检查输入的字符串是否是电子邮件,若不是,则将其视为用户名。这是一个 PHP 函数,甚至不是 Laravel Auth スキャフォールディングに関する 9 つのヒントを共有する 函数。
class LoginController extends Controller { // ... public function username() { return filter_var(request('email'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; } }
注意: 别忘了把登录表单的
input type="email"
改成type="text"
如果您尝试在同一分钟内使用无效凭据登录五次以上,则请求会被拦截,并显示一条消息尝试登录的次数过多。 请在X秒后重试。
该拦截操作将持续1分钟,并且对于用户的用户名/电子邮件及其IP地址是唯一的。
您可以自定义这些参数:
这两个参数在TraitThrottlesLogins
内部:
trait ThrottlesLogins { // ... other methods /** * Get the maximum number of attempts to allow. * * @return int */ public function maxAttempts() { return property_exists($this, 'maxAttempts') ? $this->maxAttempts : 5; } /** * Get the number of minutes to throttle for. * * @return int */ public function decayMinutes() { return property_exists($this, 'decayMinutes') ? $this->decayMinutes : 1; } }
因此,要覆盖这些属性,可以在 LoginController
内部指定属性:
class LoginController extends Controller { protected $maxAttempts = 3; // Default is 5 protected $decayMinutes = 2; // Default is 1 // ... }
默认情况下,新注册的用户将自动登录并重定向到主页。
如果您需要禁用该功能并改为显示注册成功页面,而不自动登录的话,可以执行以下操作。
原始注册方法位于 Trait RegistersUsers
的内部:
trait RegistersUsers { public function register(Request $request) { $this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); $this->guard()->login($user); if ($response = $this->registered($request, $user)) { return $response; } return $request->wantsJson() ? new Response('', 201) : redirect($this->redirectPath()); }
因此,您的目标是在RegisterController
中覆盖它,然后重定向到新页面,而不是登录:
class RegisterController extends Controller { use RegistersUsers; public function register(Request $request) { $this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); return redirect()->route('your_success_page_route_name'); }
如果除了默认的电子邮件和密码外,还需要进行其他检查,该怎么办? 例如,您要检查用户是否处于活动状态或未被禁止。
您可以添加额外的字段 credentials
到定义在 AuthenticatesUsers
trait 的鉴权数组中:
trait AuthenticatesUsers { // ... protected function credentials(Request $request) { return $request->only($this->username(), 'password'); }
然后只需要重写 LoginController
即可:
class LoginController extends Controller { // ... protected function credentials(Request $request) { return $request->only($this->username(), 'password') + ['is_active' => 1]; }
注意: 这是一个很有趣的便捷提示,但是我建议您在单独的中间件中执行这种额外的检查,然后向用户提供更明确的错误消息,而不是默认的凭证错误。
就是这些,都是一些便捷提示,但是自定义代码和外部扩展包还有很多可以发挥的地方。 因此,可以继续关注有关该主题的更多文章!
原文地址:https://laravel-news.com/laravel-auth-tips
译文地址:https://learnku.com/laravel/t/48905
以上がLaravel Auth スキャフォールディングに関する 9 つのヒントを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。