Heim  >  Artikel  >  PHP-Framework  >  Teilen Sie 9 Tipps zum Laravel Auth-Gerüst

Teilen Sie 9 Tipps zum Laravel Auth-Gerüst

藏色散人
藏色散人nach vorne
2020-08-27 13:42:433069Durchsuche

. Ich hoffe, Freunden zu helfen, die es brauchen!

Teilen Sie 9 Tipps zum Laravel Auth-Gerüst verfügt über ein tolles vorgefertigtes Benutzerauthentifizierungssystem, natürlich müssen wir an einigen Stellen auch einige Konfigurationen anpassen. Für einige benutzerdefinierte Konfigurationen müssen wir kein Erweiterungspaket finden oder viel Code schreiben. Werfen wir einen Blick auf die interessanten Funktionen, die sich hinter diesem Authentifizierungssystem verbergen.

Teilen Sie 9 Tipps zum Laravel Auth-GerüstTipp 1. Auth::routes()-Parameter

Wir alle sollten die Methode Auth::routes() von Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI-Paket

(Vor Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 7 war es im Kernel enthalten).

Aber wussten Sie, dass es ein Array zum Aktivieren/Deaktivieren bestimmter Authentifizierungsrouten akzeptieren kann?

Auth::routes() 来自于 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI package (在Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 7之前, 它被包含在内核中)。

但你知道它可以接受一个数组来启用/禁用特定的认证路由吗?

对于Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 7,下面是可用的参数及其默认值:

Auth::routes([
    'login'    => true, 
    'logout'   => true, 
    'register' => true, 
    'reset'    => true,   // 用于重置密码
    'confirm'  => false,  // 用于额外的密码确认
    'verify'   => false,  // 用于邮箱认证
]);

这些参数仅启用或禁用某些路由。

要了解它们是如何工作的,可以查看文件Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 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();
    }
};

技巧 2. Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI: 仅生成控制器

官方文档指定了使用 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI 的主要方法:

php artisan ui vue --auth

但是,如果您不需要可视 UI,该怎么办?如果您创建的是一个仅基于 API 的项目,且在框架中没有任何前端呢?

您仍然可以使用 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst Auth 及其控制器。安装 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI 并运行以下命令:

php artisan ui:controllers

 它只会生成 app/Http/Controllers/Auth , 因此您不需要 Blade 或 Vue 文件即可使用它们。

请在 Github 存储库 中参阅这个 Artisan 命令的实现。


技巧 3. 对敏感操作重新认证密码

您是否曾经维护过 Github 存储库,并试图更改其访问设置?然后,Github 要求您再次输入密码,以确保确实是您在操作。

从 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 6.2 开始,框架中也集成了该功能。

Teilen Sie 9 Tipps zum Laravel Auth-Gerüst

您只需要向要保护的路由添加一个名为password.confirm的中间件即可。

Route::get('/secrets', 'SecretsController@show')->middleware('password.confirm');

Dries Vints 引用自官方功能发布文章

如果尝试访问该路由,将提示您确认密码,和在 GitHub 等其他应用程序上看到的一样。

确认密码后,默认情况下会在用户会话中存储一个时间戳。时间戳持续3个小时,因此用户在此期间不必再次输入密码。

您可以使用auth配置文件中的password_timeout配置选项来自定义此持续时间。


技巧 4. 注销其他设备

从 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 5.6 起,我们提供了一种单独的方法来自动注销使用我们的帐户登录的任何其他设备或浏览器:

Auth::logoutOtherDevices($password);

典型的用法是在当前设备成功登录后注销其他设备。为此,我们从 TraitAuthenticatesUsers.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,
    ],

登录/注册后的重定向:自定义逻辑

默认情况下,Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 的 LoginController 和 RegisterController 具有相同的属性:

class RegisterController extends Controller
{
    protected $redirectTo = RouteServiceProvider::HOME;

因此,您可以指定成功登录/注册后重定向到的 URL。默认值在 app/Providers/RouteServiceProvider.php中:

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/home';

如何自定义它?

首先,您可以分别为登录和注册控制器的$redirectToFür Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 7 sind hier die verfügbaren Parameter und ihre Standardwerte:

class RegisterController extends Controller
{
    protected $redirectTo = RouteServiceProvider::HOME;

    protected function redirectTo()
    {
        if (auth()->user()->role_id == 1) {
            return '/admin';
        }
        return '/home';
    }

Diese Parameter aktivieren oder deaktivieren nur bestimmte Routen. Um zu verstehen, wie sie funktionieren, können Sie sich die Datei AuthRouteMethods in Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI

:🎜
php artisan tinker

🎜Tipp 2. Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI: Nur Controller generieren🎜🎜Offizielle Dokumentation spezifiziert die Hauptmethode zur Verwendung von Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI:🎜
\App\User::create(['name' => 'Admin', 'email' => 'admin@admin.com', 'password' => bcrypt('somesecurepassword')]);
🎜Wenn Sie dies jedoch nicht benötigen Was soll ich bei Visual UI tun? Was wäre, wenn Sie ein reines API-Projekt ohne Frontend im Framework erstellen würden? 🎜🎜Sie können Teilen Sie 9 Tipps zum Laravel Auth-Gerüst Auth und seine Controller weiterhin verwenden. Installieren Sie Teilen Sie 9 Tipps zum Laravel Auth-Gerüst UI und führen Sie den folgenden Befehl aus: 🎜
$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // 密码
        'remember_token' => Str::random(10),
    ];
});
🎜 Es ​​wird nur app/Http/Controllers/Auth generiert, Sie benötigen also keine Blade- oder Vue-Dateien, um sie zu verwenden. 🎜🎜Siehe im Github-Repository🎜 Implementierung von dieser Artisan-Befehl. 🎜
🎜Tipp 3. Passwörter für sensible Vorgänge erneut authentifizieren🎜🎜Haben Sie schon einmal ein Github-Repository verwaltet und versucht, dessen Zugriffseinstellungen zu ändern? Github fordert Sie dann auf, Ihr Passwort erneut einzugeben, um sicherzustellen, dass Sie es wirklich sind. 🎜🎜Ab Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 6.2 ist diese Funktion auch in das Framework integriert. 🎜🎜Enterprise WeChat Screenshot_1598506806701.png🎜 🎜Sie müssen lediglich eine Middleware namens password.confirm zu der Route hinzufügen, die Sie schützen möchten. 🎜
php artisan make:seeder UsersSeeder
🎜
Dries Vints🎜 Zitiert aus dem offiziellen Feature-Release-Artikel 🎜: 🎜
🎜Wenn Sie versuchen, auf diese Route zuzugreifen, werden Sie aufgefordert, Ihr Passwort zu bestätigen, genau wie Sie es bei anderen Anwendungen sehen wie GitHub. 🎜🎜Nach der Bestätigung des Passworts wird standardmäßig ein Zeitstempel in der Benutzersitzung gespeichert. Der Zeitstempel ist 🎜3 Stunden🎜 gültig, sodass der Benutzer in dieser Zeit sein Passwort nicht erneut eingeben muss. 🎜🎜Sie können diese Dauer mithilfe der Konfigurationsoption password_timeout in der Konfigurationsdatei auth anpassen. 🎜

🎜Tipp 4. Von anderen Geräten abmelden 🎜🎜Ab Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 5.6 bieten wir eine separate Methode zum automatischen Abmelden von jedem anderen Gerät oder Browser, bei dem Sie mit unserem Konto angemeldet sind: 🎜
public function run()
{
    // This will create 100 users
    factory(App\User::class, 100)->create(); 
}
🎜 Typisch Die Verwendung besteht darin, sich von anderen Geräten abzumelden, nachdem Sie sich erfolgreich am aktuellen Gerät angemeldet haben. Dazu überschreiben wir die Methode authenticated() aus Trait AuthenticatesUsers.php und fügen sie in app/Http/Controllers/Auth/LoginController.php ein. code>In: 🎜<pre class="brush:php;toolbar:false">php artisan db:seed --class=UsersSeeder</pre>🎜Vergessen Sie außerdem nicht, die Middleware <code>AuthenticateSession in der Datei app/Http/Kernel.php zu aktivieren, die bereits standardmäßig deaktiviert ist. Hinweis : 🎜
trait AuthenticatesUsers
{
    // ... 其他方法

    public function username()
    {
        return &#39;email&#39;;
    }

🎜Weiterleitung nach Anmeldung/Registrierung: benutzerdefinierte Logik 🎜🎜Standardmäßig haben LoginController und RegisterController von Teilen Sie 9 Tipps zum Laravel Auth-Gerüst die gleichen Eigenschaften: 🎜
class LoginController extends Controller
{
    use AuthenticatesUsers;

    // ... 其他方法

    public function username()
    {
        return &#39;username&#39;;
    }
}
🎜Sie können also eine Weiterleitung nach erfolgreicher Anmeldung/Registrierung angeben. Die URL, zu der weitergeleitet werden soll. Der Standardwert ist in app/Providers/RouteServiceProvider.php: 🎜
class LoginController extends Controller
{
    // ...

    public function username()
    {
        return filter_var(request(&#39;email&#39;), FILTER_VALIDATE_EMAIL) ? &#39;email&#39; : &#39;username&#39;;
    }
}
🎜Wie kann ich ihn anpassen? 🎜🎜Zunächst können Sie andere Werte für das Attribut $redirectTo der Anmelde- und Registrierungscontroller angeben. 🎜🎜Aber was ist, wenn Sie über eine komplexere 🎜dynamische🎜Weiterleitungslogik verfügen, die beispielsweise anhand der Benutzerrolle beurteilt werden muss? 🎜

您可以在身份验证控制器中创建一个redirectTo()方法,然后在其中指定条件。该方法将覆盖$ redirectTo属性的任何值。

参见示例:

class RegisterController extends Controller
{
    protected $redirectTo = RouteServiceProvider::HOME;

    protected function redirectTo()
    {
        if (auth()->user()->role_id == 1) {
            return &#39;/admin&#39;;
        }
        return &#39;/home&#39;;
    }

技巧 5. 快速创建新用户

如果您需要创建一个新用户,但还没有准备好注册页面该怎么办?

只需在您的终端中打开 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst Tinker

php artisan tinker

如果您不熟悉 Tinker,需要知道它是能够执行任何 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst / PHP 代码的命令行工具。因此,在其中,您可以轻松创建用户,键入此 Eloquent 命令并按 Enter:

\App\User::create([&#39;name&#39; => &#39;Admin&#39;, &#39;email&#39; => &#39;admin@admin.com&#39;, &#39;password&#39; => bcrypt(&#39;somesecurepassword&#39;)]);

但是,如果您需要创建许多用户进行测试,例如10、100或1000,该怎么办?没问题,我们可以在database / factories / UserFactory.php中使用 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 默认提供的 Factory 类:

$factory->define(User::class, function (Faker $faker) {
    return [
        &#39;name&#39; => $faker->name,
        &#39;email&#39; => $faker->unique()->safeEmail,
        &#39;email_verified_at&#39; => now(),
        &#39;password&#39; => &#39;$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi&#39;, // 密码
        &#39;remember_token&#39; => 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

您可以在Teilen Sie 9 Tipps zum Laravel Auth-Gerüst官方文档中了解更多有关数据库种子的信息。


Tip 6. 使用邮箱和/或用户名登录

默认情况下,Teilen Sie 9 Tipps zum Laravel Auth-Gerüst用户使用邮箱密码进行身份验证。但是,如果您的用户标识不使用邮箱怎么办?例如,使用用户名作为标识。

您可以通过覆盖 traitAuthenticatesUsers.php中的一种方法来轻松更改它。

这是默认值:

trait AuthenticatesUsers
{
    // ... 其他方法

    public function username()
    {
        return &#39;email&#39;;
    }

您可以将其复制到您的LoginController.php中,只需更改值即可:

class LoginController extends Controller
{
    use AuthenticatesUsers;

    // ... 其他方法

    public function username()
    {
        return &#39;username&#39;;
    }
}

让我们更进一步。如果您想让用户可以使用邮箱或用户名登录怎么办?这样的话,用户可以在“邮箱/用户名”字段中选择其中一个填写。

让我们向上面的username()方法添加一个判断。我们检查输入的字符串是否是电子邮件,若不是,则将其视为用户名。这是一个 PHP 函数,甚至不是 Teilen Sie 9 Tipps zum Laravel Auth-Gerüst 函数。

class LoginController extends Controller
{
    // ...

    public function username()
    {
        return filter_var(request(&#39;email&#39;), FILTER_VALIDATE_EMAIL) ? &#39;email&#39; : &#39;username&#39;;
    }
}

注意: 别忘了把登录表单的  input type="email" 改成 type="text"


Tip 7.登录请求频繁:自定义参数

如果您尝试在同一分钟内使用无效凭据登录五次以上,则请求会被拦截,并显示一条消息尝试登录的次数过多。 请在X秒后重试。

该拦截操作将持续1分钟,并且对于用户的用户名/电子邮件及其IP地址是唯一的。

您可以自定义这些参数:

  • 一分钟内的无效尝试次数(默认为五次尝试)
  • 阻止登录的分钟数(默认为1分钟)

这两个参数在TraitThrottlesLogins内部:

trait ThrottlesLogins
{
    // ... other methods

    /**
     * Get the maximum number of attempts to allow.
     *
     * @return int
     */
    public function maxAttempts()
    {
        return property_exists($this, &#39;maxAttempts&#39;) ? $this->maxAttempts : 5;
    }

    /**
     * Get the number of minutes to throttle for.
     *
     * @return int
     */
    public function decayMinutes()
    {
        return property_exists($this, &#39;decayMinutes&#39;) ? $this->decayMinutes : 1;
    }
}

因此,要覆盖这些属性,可以在 LoginController 内部指定属性:

class LoginController extends Controller
{
    protected $maxAttempts = 3;  // Default is 5
    protected $decayMinutes = 2; // Default is 1

    // ...
}

Tip 8. 注册: 禁用自动登录

默认情况下,新注册的用户将自动登录并重定向到主页。

如果您需要禁用该功能并改为显示注册成功页面,而不自动登录的话,可以执行以下操作。

原始注册方法位于 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(&#39;&#39;, 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(&#39;your_success_page_route_name&#39;);
    }

Tip 9. 登录: 通过电子邮件/密码进行附加检查

如果除了默认的电子邮件和密码外,还需要进行其他检查,该怎么办? 例如,您要检查用户是否处于活动状态或未被禁止。

您可以添加额外的字段 credentials 到定义在 AuthenticatesUsers trait 的鉴权数组中:

trait AuthenticatesUsers
{
    // ...

    protected function credentials(Request $request)
    {
        return $request->only($this->username(), &#39;password&#39;);
    }

然后只需要重写 LoginController 即可:

class LoginController extends Controller
{
    // ...

    protected function credentials(Request $request)
    {
        return $request->only($this->username(), &#39;password&#39;) + [&#39;is_active&#39; => 1];
    }

注意: 这是一个很有趣的便捷提示,但是我建议您在单独的中间件中执行这种额外的检查,然后向用户提供更明确的错误消息,而不是默认的凭证错误。


就是这些,都是一些便捷提示,但是自定义代码和外部扩展包还有很多可以发挥的地方。 因此,可以继续关注有关该主题的更多文章!

原文地址:https://laravel-news.com/laravel-auth-tips

译文地址:https://learnku.com/laravel/t/48905

Das obige ist der detaillierte Inhalt vonTeilen Sie 9 Tipps zum Laravel Auth-Gerüst. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen