32
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GameWithAdvent Calendar 2018

Day 19

Laravelの認証機能のかゆいところに手が届く小技集

Posted at

はじめに

Laravelにはデフォルトで認証機能が用意されています。

認証

php artisan make:authコマンド一発でビューもルートも全部定義できて、とても便利なので自分もよく使っています。

この記事では、デフォルトの認証機能をいくつかカスタマイズしていきたいと思います。

前提

  • Laravel version 5.7

ログイン後のリダイレクト先のカスタマイズ

デフォルトではログインに成功すると、/homeにリダイレクトします。

なぜデフォルトが/homeになっているのか不明ですが(/のほうが一般的ではと思うけど)

リダイレクト先を変更する場合はLoginController.phpRegisterController.phpResetPasswordController.php$redirectToを修正すれば変更できます。

app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    protected $redirectTo = '/home';
}

リダイレクト先をユーザー情報などによって制御したい場合はredirectTo()を作成する必要があります。

app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    protected function redirectTo()
    {
        if () {
           return '/path1';
        }
        return '/path';
    }
}

redirectTo()$redirectToよりも優先されます。

バリデーションのカスタマイズ

新規登録時のバリデーションはRegisterController.phpに記述されています。

そのため修正箇所はわかりやすいです。

app/Http/Controllers/Auth/RegisterController.php
class RegisterController extends Controller
{
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }
}

しかし、ログイン時のバリデーションはAuthenticatesUsers.phpに記述されています(なぜなのだろう)

Illuminate\Foundation\Auth\AuthenticatesUsers.php
trait AuthenticatesUsers
{
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string',
            'password' => 'required|string',
        ]);
    }
}

そのため、ログイン時のバリデーションのカスタマイズをする場合は、LoginController.phpvalidateLogin()を定義する必要があります。

app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string|min:10',
            'password' => 'required|string',
        ]);
    }
}

パスワードリセットメールのカスタマイズ

デフォルトの認証機能にはパスワードをリセットする機能もついています。

しかし、送信されてくるメールは激しめの英文です。

このメールをカスタマイズするためには、まずは通知クラスを作る必要があります。

通知

php artisan make:notification CustomPasswordReset コマンドで通知クラスを作成したらメール送信処理を記述します。

app/Notifications/CustomPasswordReset.php
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class CustomPasswordReset extends Notification
{
    use Queueable;
    public $token;

    public function __construct($token)
    {
        $this->token = $token;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('パスワードリセット')
            ->view('mail.passwordReset')
            ->action('Reset Password', url(route('password.reset', $this->token, false)));
    }

    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

作成したら、User.phpsendPasswordResetNotification()を定義し、作成した通知クラスを呼ぶよう記述します。

app/User.php
class User extends Authenticatable
{
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new CustomPasswordReset($token));
    }
}

あとは、メール用のbladeを作成して完成です。

resources/views/mail/passwordReset.blade.php
<p>パスワードリセットメールです</p>
<a href="{{ $actionUrl }}">{{ $actionUrl }}</a>

おわりに

デフォルトの認証機能には他にも○○回パスワードを間違えたらロックする機能などもあるそうです(使ったことないですが)

32
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?