Laravel 5 4 实现前后台登录

724 阅读3分钟

在官网下载 Laravel 5.4 配置并能在访问

php artisan make:auth

生成后路由文件 routes/web.php ,自动有

Auth::routes();

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

运行

php artisan migrate

执行命令后会生成 users 表和 password_resets 表,既 用户表和密码重置表。可以测试用户登录,注册,找回密码功能。 ##自定义用户表登录 在 config/auth.php 配置如下:

  <?php
return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
           'expire' => 60,
        ],
    ],
];

认证是由 guardsproviders 两部分构成的, defaults 配置是默认选择一个 guard 认证驱动,所以我们在这两个配置项中分别添加一个 adminadmins 选项。

<?php
  'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
  'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],
    ],

创建后台用户表和model

  php artisan make:model Admin
  php artisan make:migration creaet_admins_table

在数据库迁移文件 _create_admins_table , 我们可以复制 users 迁移文件里的字段

  Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email');
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

执行php artisan migrate ###生成临时数据 在 database/factories/ModelFactory.php, 添加如下数据:

$factory->define(App\Admin::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'password' => $password ?: $password = bcrypt('123456'),
        'email' =>  $faker->email,
        'remember_token' => str_random(10),
    ];
});

打开命令行输入:

  php artisan tinker
  use App;
  factory(App\Admin::class,5)->create() 
  //生成5条测试数据,你要几条就输入多少(Class,num)

###更改 Admin 模型类

  <?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

###创建控制器

php artisan make:controller Admin/LoginController
php artisan make:controller Admin/AdminController

编辑 Admin/LoginController.php

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/admin/index';
    protected $username;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin', ['except' => 'logout']);
        $this->username = config('admin.global.username');
    }

    /**
     * 重写登录视图页面
     */
    public function showLogin()
    {
        return view('admin.login.index');
    }

    /**
     * 自定义认证驱动
     * @return mixed
     */
    protected function guard()
    {
        return auth()->guard('admin');
    }


}

修改 app\Http\Middleware\RedirectIfAuthenticated.php:

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            // 根据不同 guard 跳转到不同的页面
            $url = $guard ? 'admin/dash':'/home';
            return redirect($url);
        }

        return $next($request);
    }

编辑 Admin\AdminController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth.admin:admin');
    }
    //
    public function index()
    {
        dd('用户名:'.auth('admin')->user()->name);
    }
   php artisan make:middleware AdminAuthMiddleware

编辑 app\Http\Middleware\AdminAuthMiddleware.php

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('admin/login');
            }
        }
        return $next($request);
    }

app\Http\Kernel.php 中注册:

protected $routeMiddleware = [
       ··· ···
        'auth.admin' => \App\Http\Middleware\AdminAuthMiddleware::class,
    ];

###注册路由 编辑 routes/web.php

Route::group(['prefix' => 'admin','namespace' => 'Admin'],function ($router)
{
    $router->get('login', 'LoginController@showLogin')->name('admin.login');
    $router->post('login', 'LoginController@login');
    $router->post('logout', 'LoginController@logout');

    $router->get('index', 'AdminController@index');
});

###视图文件创建和修改 复制 resources\views\auth\login.blade.php,到 resources\views\admin\login\index.blade.php,修改表单提交地址

 {{ url('/login') }} 改成 {{ route('admin.login') }}

访问 你的站点/admin/login

###另外知识点:

发现后台经常是用用户名登录的,而不是邮箱。

更改LoginController.php添加:

/**
     * @return string
     */
    public function username()
    {
        return 'name';//登录名
    }

后修改 resources\views\admin\login\login.blade.php 把邮箱相关的html删除换成

<div class="form-group">
      <label for="name" class="col-md-4 control-label">Name</label>
      <div class="col-md-6">
        <input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}">
      </div>
</div>