Laravel 5.6 - 서명된 경로 및 알림으로 사용자 활성화

우리는 앱에 사용자 활성화 기능을 쉽게 구현하는 데 도움이 되는 많은 패키지를 보았습니다.

음.. 라라벨 내부만 가지고 더 간단한 방법이 있습니다.

이 기사에서 다룰 내용:


  • Laravel 알림
  • Laravel 서명된 URL
  • 기본 미들웨어 사용

  • 시작하자!



    참고: 컴퓨터에 전역적으로 Laravel/installer가 설치되어 있다고 가정합니다.

    우선 깨끗한 애플리케이션이 필요합니다.laravel new my-project-name
    이제 선택한 IDE에서 새 프로젝트를 열 수 있습니다.
    프로젝트를 설정하면 실제 "마법"으로 바로 이동할 수 있습니다..!

    하지만 우선 애플리케이션에 basic-auth 항목을 추가해야 합니다.
    php artisan make:auth

    기다리다..! 우리는 무엇을 성취할 것인가?



    음.. 간단합니다. Laravel 알림 및 서명된 URL을 사용하여 사용자가 자신의 계정을 확인할 수 있는 간단한 방법을 제공하려고 합니다.

    우리가 여기서 하는 일을 더 이상 반복하지 마세요!



    부울을 제공하도록 사용자 마이그레이션을 설정하십시오. 나중에 다음 줄을 추가하여 사용자가 확인되었는지 여부를 확인할 수 있습니다.

    $table->boolean('is_activated')->default(false);
    

    그런 다음 사용자 마이그레이션은 다음과 같아야 합니다.

    <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateUsersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->string('email')->unique();
                $table->string('password');
                $table->boolean('is_activated')->default(false);
                $table->rememberToken();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('users');
        }
    }
    

    이제 다음과 같이 사용자 모델을 설정해야 합니다.

    ...
    protected $fillable = ['name', 'email', 'password', 'is_activated'];
    ...
    protected $casts = ['is_activated' => 'boolean'];
    ...
    

    따라서 사용자 모델은 다음과 같아야 합니다.

    <?php
    
    namespace App;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use Notifiable;
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name', 'email', 'password', 'is_activated'
        ];
    
        protected $casts = [
            'is_activated' => 'boolean'
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];
    }
    

    이제 is_activated 필드를 직접 업데이트할 수 있습니다.

    다음으로 새 알림이 필요합니다.php artisan make:notification Users/ActivateEmailNotification
    알림으로 이동하겠습니다..

    다음에 우리가 하고 싶은 것은 생성된 알림 클래스를 사용하여 사용자가 우리 애플리케이션을 사용하고 싶을 때 클릭해야 하는 링크를 보내는 것입니다(잠시 후에 보여줄 새 기능으로 보호됨). .

    이제 URL을 만들어 보겠습니다.

    <?php
    
    namespace App\Notifications\Users;
    
    use App\User;
    use Illuminate\Support\Facades\URL;
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Notifications\Messages\MailMessage;
    
    class ActivateEmailNotification extends Notification
    {
        use Queueable;
    
        /**
         * User Object
         *
         * @var App\User
         */
        public $user;
    
        /**
         * Create a new notification instance.
         *
         * @return void
         */
        public function __construct(User $user)
        {
            $this->user = $user;
        }
    
        /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return ['mail'];
        }
    
        /**
         * Get the mail representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return \Illuminate\Notifications\Messages\MailMessage
         */
        public function toMail($notifiable)
        {
            $url = URL::signedRoute('activate-email', ['user' => $this->user->id]);
    
            return (new MailMessage)
                        ->subject('Activate your email address')
                        ->line('In order to use the application, please verify your email address.')
                        ->action('Activate your account', $url)
                        ->line('Thank you for using our application!');
        }
    
        /**
         * Get the array representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function toArray($notifiable)
        {
            return [
                //
            ];
        }
    }
    

    Laravel Signed URL Feature을 사용하여 사용자의 URL을 생성합니다. 이를 통해 이메일이 전송된 사용자만 자신의 이메일 주소를 확인할 수 있습니다.

    또한 URL은 지정된 시간 동안만 유효하다고 말할 수 있습니다.

    이를 위해 URL을 다음에서 변경해야 합니다.

    $url = URL::signedRoute('activate-email', ['user' => $this->user->id]);
    

    에게

    $url = URL::temporarySignedRoute('activate-email', now()->addMinutes(30), ['user' => $this->user->id]);
    

    이제 URL은 생성 후 30분 동안만 유효합니다.

    다음으로 Auth\RegisterController 를 수정해야 합니다.
    컨트롤러 하단의 'is_active' => false, 메서드에 create를 추가하기만 하면 됩니다. 같은 방법으로 사용자에게 알릴 것입니다.

    컨트롤러는 다음과 같이 표시됩니다.

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\User;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    use Illuminate\Foundation\Auth\RegistersUsers;
    
    class RegisterController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Register Controller
        |--------------------------------------------------------------------------
        |
        | This controller handles the registration of new users as well as their
        | validation and creation. By default this controller uses a trait to
        | provide this functionality without requiring any additional code.
        |
        */
    
        use RegistersUsers;
    
        /**
         * Where to redirect users after registration.
         *
         * @var string
         */
        protected $redirectTo = '/home';
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest');
        }
    
        /**
         * Get a validator for an incoming registration request.
         *
         * @param  array  $data
         * @return \Illuminate\Contracts\Validation\Validator
         */
        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',
            ]);
        }
    
        /**
         * Create a new user instance after a valid registration.
         *
         * @param  array  $data
         * @return \App\User
         */
        protected function create(array $data)
        {
            $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'is_activated' => false,
                'password' => Hash::make($data['password']),
            ]);
    
            $user->notify(new \App\Notifications\Users\ActivateEmailNotification($user));
    
            return $user;    }
    }
    

    또한 사용자가 활성화되었는지 여부를 결정하기 위해 미들웨어가 필요합니다.

    다음 명령을 사용하여 생성합니다.php artisan make:middleware CheckUserActivated
    다음과 같이 미들웨어를 수정합니다.

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class CheckUserActivated
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!$request->user()->is_activated) {
                return redirect('/not-enabled'); // You can add a route of your choice
            }
    
            return $next($request);
        }
    }
    

    이제 새로운 미들웨어를 커널에 등록해야 합니다.App\Http\Kernel.php를 열고 클래스 맨 아래에 있는 routeMiddleware에 다음을 추가합니다.

    'active' => \App\Http\Middleware\CheckUserActivated::class,
    

    이 파일에 다른 클래스를 추가해야 합니다.

    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    

    이제 사용자가 활성 상태인지 여부를 확인할 수 있습니다. 그가 활성 상태가 아닌 경우 다른 페이지로 리디렉션하여 사용자에게 이메일에 있는 링크를 사용하여 자신의 계정을 활성화해야 한다는 메모를 추가할 수 있습니다.

    알림에서 사용자가 자신의 이메일 주소를 확인할 수 있는 URL을 추가했습니다.
    링크를 사용하려면 웹 경로 파일에 이 경로를 추가해야 합니다.

    Route::get('/activate-email/{user}', function (Request $request) {
        if (!$request->hasValidSignature()) {
            abort(401, 'This link is not valid.');
        }
    
        $request->user()->update([
            'is_activated' => true
        ]);
    
        return 'Your account is now activated!';
    })->name('activate-email');
    

    원하는 경우 이 메서드를 별도의 컨트롤러에 넣을 수 있습니다. 하지만 여기서는 간단하게 유지하고 싶습니다.

    이 경로는 사용자를 활성화하고 애플리케이션을 사용할 수 없음을 알려줍니다.

    결론



    Laravel에서 직접 간단한 도우미를 사용한 사용자 활성화에 대한 이 짧은 튜토리얼이 마음에 드셨기를 바랍니다.

    그렇다면 언제든지 이 기사를 공유하고 사랑을 전해주세요 ❤️

    그리고 물론 당신이 나를 팔로우하는지 확인하십시오

    이 기사의 출처는 GitHub에서 볼 수 있습니다 😺

    좋은 웹페이지 즐겨찾기