laravel JWT-auth 后台登录

21 阅读1分钟

获取登录用户时需要指定:Auth::guard('admin')->user();

  1. 创建路由
Route::prefix('admin')->namespace('Admin')->group(function(){

Route::get('/', 'HomeController@index');

Route::get('login', 'LoginController@showLoginForm')->name('admin.login');

Route::post('login', 'LoginController@login');

Route::post('logout', 'LoginController@logout')->name('admin.logout');

});
  1. 创建登录模型App\Models\Admin

image.png 同时设置数据表前缀:

image.png

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Notifications\Notifiable;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable{

use Notifiable;

protected $table = "own_admins";

protected $fillable = [

'name', 'email', 'password',

];

protected $hidden = [

'password', 'remember_token',

];

}
  1. 创建HomeController和LoginController

image.png

image.png 4. 修改Auth中间件:Authenticate和RedirectIfAuthenticated

RedirectIfAuthenticated:

image.png 重写Authenticate:

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\AuthenticationException;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware{

protected $redirectTo = '';

/**

     * Get the path the user should be redirected to when they are not authenticated.

     *

     * @param  \Illuminate\Http\Request  $request

     * @return string|null

     */

protected function redirectTo($request){

//        if (! $request->expectsJson()) {

//            return route('login');

//        }

return route('login');

}

protected function authenticate($request, array $guards){

if (empty($guards)) {

$guards = [null];

}

foreach ($guards as $guard) {

if ($this->auth->guard($guard)->check()) {

return $this->auth->shouldUse($guard);

}

}

// 这里我们以 guards 传入的第一个参数为准选择跳转到的登录页面

$guard = $guards[0];

if ($guard == 'admin') {

$this->redirectTo = route('admin.login');

}

throw new AuthenticationException(

'Unauthenticated.', $guards, $this->redirectTo ? : $this->redirectTo($request)

);

}

}

5.创建view:app、index和login

app.blade.php

<!DOCTYPE html>

<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- CSRF Token -->

<meta name="csrf-token" content="{{ csrf_token() }}">

<title>{{ config('app.name', 'Laravel') }} Admin</title>

<!-- Scripts -->

<script src="{{ asset('js/app.js') }}" defer></script>

<!-- Fonts -->

<link rel="dns-prefetch" href="https://fonts.gstatic.com">

<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css">

<!-- Styles -->

<link href="{{ asset('css/app.css') }}" rel="stylesheet">

</head>

<body>

<div id="app">

<nav class="navbar navbar-expand-md navbar-light navbar-laravel">

<div class="container">

<a class="navbar-brand" href="{{ url('/admin') }}">

{{ config('app.name', 'Laravel') }} Admin

</a>

<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">

<span class="navbar-toggler-icon"></span>

</button>

<div class="collapse navbar-collapse" id="navbarSupportedContent">

<!-- Left Side Of Navbar -->

<ul class="navbar-nav mr-auto">

<li class="nav-item">

<a class="nav-link" href="{{ url('/') }}">Home</a>

</li>

</ul>

<!-- Right Side Of Navbar -->

<ul class="navbar-nav ml-auto">

<!-- Authentication Links -->

                    @guest

<li class="nav-item">

<a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a>

</li>

<li class="nav-item">

                            @if (Route::has('admin.register'))

<a class="nav-link" href="{{ route('admin.register') }}">{{ __('Register') }}</a>

                            @endif

</li>

                    @else

<li class="nav-item dropdown">

<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>

{{ Auth::user('admin')->name }} <span class="caret"></span>

</a>

<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">

<a class="dropdown-item" href="{{ route('admin.logout') }}"

                                   onclick="event.preventDefault();

                                                     document.getElementById('logout-form').submit();">

{{ __('Logout') }}

</a>

<form id="logout-form" action="{{ route('admin.logout') }}" method="POST" style="display: none;">

                                    @csrf

</form>

</div>

</li>

                    @endguest

</ul>

</div>

</div>

</nav>

<main class="py-4">

        @yield('content')

</main>

</div>

</body>

</html>

index.blade.php

@extends('admin.app')

@section('content')

<div class="container">

<div class="row justify-content-center">

<div class="col-md-8">

<div class="card">

<div class="card-header">Admin Dashboard</div>

<div class="card-body">

                        @if (session('status'))

<div class="alert alert-success" role="alert">

{{ session('status') }}

</div>

                        @endif

                        You are logged in the admin dashboard!

</div>

</div>

</div>

</div>

</div>

@endsection

login.blade.php

@extends('admin.app')

@section('content')

<div class="container">

<div class="row justify-content-center">

<div class="col-md-8">

<div class="card">

<div class="card-header">{{ __('Admin Login') }}</div>

<div class="card-body">

<form method="POST" action="{{ route('admin.login') }}">

                            @csrf

<div class="form-group row">

<label for="email" class="col-sm-4 col-form-label text-md-right">{{ __('Email') }}</label>

<div class="col-md-6">

<input id="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>

                                    @if ($errors->has('email'))

<span class="invalid-feedback" role="alert">

<strong>{{ $errors->first('email') }}</strong>

</span>

                                    @endif

</div>

</div>

<div class="form-group row">

<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

<div class="col-md-6">

<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>

                                    @if ($errors->has('password'))

<span class="invalid-feedback" role="alert">

<strong>{{ $errors->first('password') }}</strong>

</span>

                                    @endif

</div>

</div>

<div class="form-group row">

<div class="col-md-6 offset-md-4">

<div class="form-check">

<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

<label class="form-check-label" for="remember">

{{ __('Remember Me') }}

</label>

</div>

</div>

</div>

<div class="form-group row mb-0">

<div class="col-md-8 offset-md-4">

<button type="submit" class="btn btn-primary">

{{ __('Login') }}

</button>

</div>

</div>

</form>

</div>

</div>

</div>

</div>

</div>

@endsection