Laravel: 관리자로부터 신규 등록 사용자 승인

14839 단어 laravelphp
Laravel 프레임워크에는 내장된 Auth 시스템이 포함되어 있어 좋습니다.그러나 이것은 모든 상황을 포함하지 않는다. 가장 흔히 볼 수 있는 것은 관리자가 모든 새로운 등록 사용자에 대한 승인이다.본고에서, 나는fresh Laravel 5.7 프로젝트에서 이 점을 실현하는 방법을 보여 드리겠습니다.
우리가 포괄할 내용:
  • 준비DB구조: 이동, 모형 및 파종기
  • 새 사용자 액세스 제한 대시보드
  • 관리자에게 새 사용자
  • 알림
  • 관리자가 새 사용자 승인
  • 먼저 새로운 Laravel 프로젝트를 만듭니다.
    laravel new laravel
    
    그리고 저희를 설정해야 합니다.데이터베이스 인증서가 있는 env 파일입니다.
    이제 로그인/등록 링크를 생성합니다.
    php artisan make:auth
    
    따라서 다음 양식을 사용하여 로그인할 수 있습니다.
    users DB 테이블의 경우 다음 두 필드를 추가해야 합니다.
  • admin(부울, 0/1) - 더 복잡한 역할/권한 논리
  • 이 있을 수 있습니다.
  • approved_at(타임 스탬프, 비어 있음) -
  • 을 승인할 때 현재 타임 스탬프로 설정합니다.
    따라서
    php artisan make:migration add_admin_to_users_table
    
    그리고 마이그레이션 자체:
    Schema::table('users', function (Blueprint $table) {
        $table->boolean('admin')->default(false);
        $table->timestamp('approved_at')->nullable();
    });
    
    
    또한 $fillable 모델의 app/User.php 그룹에 이 필드를 추가해야 합니다.
    protected $fillable = [
        'name', 'email', 'password', 'admin', 'approved_at'
    ];
    

    피드 설정 관리자 사용자


    이 명령은 다음과 같은 작업을 지원합니다.
    php artisan make:seeder AdminSeeder
    
    database/seeds 폴더에 새 파일이 생성되며 다음과 같이 채워집니다.
    class AdminSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            \App\User::create([
                'name' => 'Admin',
                'email' => '[email protected]',
                'email_verified_at' => now(),
                'password' => bcrypt('verysafepassword'),
                'admin' => 1,
                'approved_at' => now(),
            ]);
        }
    }
    
    
    마지막으로, 이 클래스를 주 database/seeds/DatabaseSeeder.php 파일에 추가해야 합니다.
    public function run()
    {
        $this->call(AdminSeeder::class);
    }
    
    이제 DB 구조를 실행할 준비가 되었습니다.
    php artisan migrate --seed
    
    이때 인증서 [email protected]-verysafepassword으로 로그인하면 기본 Laravel의 빈 메인 대시보드를 볼 수 있습니다.

    대시보드에서 새 사용자 제한


    네, 지금 우리는 새로운 사용자를 등록할 수 있지만, 비준을 받지 않을 것입니다.우리는 그들이 실제 계기판에 접근하는 것을 제한할 것이다.
    우선, "승인 대기"와 같은 텍스트가 포함된 별도의 Blade 파일을 만듭니다.이것은 승인되지 않은 모든 사용자의 요청을 위한 페이지입니다.
    따라서 resources/views/approval.blade.php:
    @extends('layouts.app')
    
    @section('content')
        <div class="container">
            <div class="row justify-content-center">
                <div class="col-md-8">
                    <div class="card">
                        <div class="card-header">Waiting for Approval</div>
    
                        <div class="card-body">
                            Your account is waiting for our administrator approval.
                            <br />
                            Please check back later.
                        </div>
                    </div>
                </div>
            </div>
        </div>
    @endsection
    
    
    다음으로, 우리는 컨트롤러를 만들어서 그것을 가리킨다.또는, 사실 우리는 같은 HomeController에서 하나의 방법을 만들었다.
    public function approval()
    {
        return view('approval');
    }
    
    
    다음은 모양입니다.

    마지막으로, 우리는 하나의 노선이 필요하다.auth 중간부품에 넣겠습니다. routes/web.php은 다음과 같습니다.
    Route::middleware(['auth'])->group(function () {
        Route::get('/approval', 'HomeController@approval')->name('approval');
        Route::get('/home', 'HomeController@index')->name('home');
    });
    
    
    승인되지 않은 사용자의 액세스 권한을 /home URL로 제한해야 합니다.우리는 새로운 중간부품을 만들었다.
    php artisan make:middleware CheckApproved
    
    app/Http/Middleware/CheckApproved.php 파일을 생성합니다.
    namespace App\Http\Middleware;
    
    use Closure;
    
    class CheckApproved
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!auth()->user()->approved_at) {
                return redirect()->route('approval');
            }
    
            return $next($request);
        }
    }
    
    이 미들웨어는 app/Http/Kernel.php 어레이의 $routeMiddleware에 등록해야 합니다.
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        // ...
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'approved' => \App\Http\Middleware\CheckApproved::class,
    ];
    
    
    마지막으로, 우리는 home 루트를 이 중간부품 아래의 블록에 추가합니다. 따라서 routes/web.php은 이렇게 보입니다.
    Route::middleware(['auth'])->group(function () {
        Route::get('/approval', 'HomeController@approval')->name('approval');
    
        Route::middleware(['approved'])->group(function () {
            Route::get('/home', 'HomeController@index')->name('home');
        });
    });
    
    
    따라서 현재 모든 새 사용자는 로그인하거나 어떤 작업을 수행한 후에 approval page으로 리디렉션됩니다.

    관리자에게 새 사용자를 알립니다.


    우리는 프레임에 첨부된 Laravel Notifications 함수를 사용할 것이다.
    새로운 알림 클래스를 생성합니다.
    php artisan make:notification NewUser
    
    그리고 새로 생성된 app/Notifications/NewUser.php을 기입합니다.
    namespace App\Notifications;
    
    use App\User;
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Notifications\Messages\MailMessage;
    
    class NewUser extends Notification
    {
        use Queueable;
    
        private $new_user;
    
        /**
         * Create a new notification instance.
         *
         * @return void
         */
        public function __construct(User $new_user)
        {
            $this->new_user = $new_user;
        }
    
    
        /**
         * Get the mail representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return \Illuminate\Notifications\Messages\MailMessage
         */
        public function toMail($notifiable)
        {
            return (new MailMessage)
                ->line('New user has registered with email ' . $this->new_user->email)
                ->action('Approve user', route('admin.users.approve', $this->new_user->id));
        }
    
    }
    
    
    여기에서는 다음 사항에 유의해야 합니다.
  • 우리는 __construct() 방법을 통해 새로운 등록 사용자를 대상으로 전달한 다음에 이를 국부적인 개인 변수로 전환할 것이다. 우리는 toMail() 방법에서 이 변수를 $this->new_user으로 사용할 것이다.
  • 은 사용자를 승인하는 경로를 지정했습니다. 잠시 후에 아래에서 이 기능을 만들 것입니다.
  • 이제 이 알림을 사용하기 위해 컨트롤러 app/Http/Controllers/Auth/RegisterController.php, 특히 방법 create()을 확장합니다.
    // Don't forget to add this
    use App\Notifications\NewUser;
    
    // ...
    
    /**
     * 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'],
            'password' => Hash::make($data['password']),
        ]);
    
        $admin = User::where('admin', 1)->first();
        if ($admin) {
            $admin->notify(new NewUser($user));
        }
    
        return $user;
    }
    
    
    이메일 발송을 테스트하기 위해 MailTrap을 사용하고 Laravel .env 파일에 인증서를 넣는 것을 추천합니다.
    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.mailtrap.io
    MAIL_PORT=2525
    MAIL_USERNAME=54043xxxxxxxxxx
    MAIL_PASSWORD=a7d17xxxxxxxxx
    MAIL_ENCRYPTION=null
    
    따라서 모든 새 사용자에게 관리자는 다음과 같은 결과를 얻을 수 있다.

    관리자가 새 사용자 승인


    이전 단계에서, 우리는 route('admin.users.approve', $this->new_user->id)의 경로를 사용했는데, 지금 우리는 그것을 실제적으로 실현할 수 있다.
    실제로 사용자를 열거하고 그 중 하나를 승인하는 두 가지 방법이 필요합니다.
    또한 관리자 사용자만 사용할 수 있기 때문에 다른 중간부품을 생성해야 합니다.
    php artisan make:middleware CheckAdmin
    
    우리는 새 파일 app/Http/Middleware/CheckAdmin.php을 작성합니다.
    namespace App\Http\Middleware;
    
    use Closure;
    
    class CheckAdmin
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!auth()->user()->admin) {
                return redirect()->route('home');
            }
    
            return $next($request);
        }
    }
    
    또한 app/Http/Kernel.php 어레이에 추가해야 합니다.
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        // ...
        'approved' => \App\Http\Middleware\CheckApproved::class,
        'admin' => \App\Http\Middleware\CheckAdmin::class,
    ];
    
    마지막으로, 이것은 우리의 최종 routes/web.php 버전입니다.
    Route::middleware(['auth'])->group(function () {
        Route::get('/approval', 'HomeController@approval')->name('approval');
    
        Route::middleware(['approved'])->group(function () {
            Route::get('/home', 'HomeController@index')->name('home');
        });
    
        Route::middleware(['admin'])->group(function () {
            Route::get('/users', 'UserController@index')->name('admin.users.index');
            Route::get('/users/{user_id}/approve', 'UserController@approve')->name('admin.users.approve');
        });
    });
    
    우리가 해야 할 마지막 일은 실제 비준을 실시하는 것이다.
    php artisan make:controller UserController
    
    다음은 app/Http/Controllers/UserController.php의 코드입니다.
    namespace App\Http\Controllers;
    
    use App\User;
    
    class UserController extends Controller
    {
    
        public function index()
        {
            $users = User::whereNull('approved_at')->get();
    
            return view('users', compact('users'));
        }
    
        public function approve($user_id)
        {
            $user = User::findOrFail($user_id);
            $user->update(['approved_at' => now()]);
    
            return redirect()->route('admin.users.index')->withMessage('User approved successfully');
        }
    
    }
    
    따라서 방법 approve()은 사용자를 승인하고 목록으로 다시 정합니다.resources/views/users.blade.php에서 구현:
    @extends('layouts.app')
    
    @section('content')
        <div class="container">
            <div class="row justify-content-center">
                <div class="col-md-8">
                    <div class="card">
                        <div class="card-header">Users List to Approve</div>
    
                        <div class="card-body">
    
                            @if (session('message'))
                                <div class="alert alert-success" role="alert">
                                    {{ session('message') }}
                                </div>
                            @endif
    
                            <table class="table">
                                <tr>
                                    <th>User name</th>
                                    <th>Email</th>
                                    <th>Registered at</th>
                                    <th></th>
                                </tr>
                                @forelse ($users as $user)
                                    <tr>
                                        <td>{{ $user->name }}</td>
                                        <td>{{ $user->email }}</td>
                                        <td>{{ $user->created_at }}</td>
                                        <td><a href="{{ route('admin.users.approve', $user->id) }}"
                                               class="btn btn-primary btn-sm">Approve</a></td>
                                    </tr>
                                @empty
                                    <tr>
                                        <td colspan="4">No users found.</td>
                                    </tr>
                                @endforelse
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    @endsection
    
    최종 시각적 결과:

    따라서 이것은 Laravel에서 새로운 사용자를 승인하는 가장 빠른 방법일 수 있습니다.간단하죠?

    좋은 웹페이지 즐겨찾기