LarAvel(多用戶認證,admin、user分表)

1. 目的

本文來簡單的講解 laravel 中guard 用法,實現 admin 和 user 多表登陸(只講了登陸功能,其它的功能都一樣,不多贅述)

2. 配置

首先需要在 <code>auth.php</code> 中配置 admin 的 <code>guards</code> 和 <code>providers</code>

什么是 guard 呢?在我看來它就像是部落,user 就像是部落的人,想找部落里的人就要指定部落,\Auth::guard('admin')->user(),不加guard默認取'web'部落中的人

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

  // providers 中的這個模型將使用默認的 Eloquent 認證來驅動。
  // 如果你的應用程序沒有使用 Eloquent,請選擇使用 Laravel 查詢構造器的 database 認證驅動。
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

3. 創建相關文件

  1. 首先 art make:auth 創建 laravel 自帶的登陸界面,并且創建 Admin Model 及其遷移文件
art make:model Admin -m
  • 修改 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',
          ];
      }
    
  • 修改 Admin 的遷移文件 ,后臺采用 namepassword 驗證,修改完成后 art migrate 生成數據表

   public function up()
   {
       Schema::create('admins', function (Blueprint $table) {
           $table->increments('id');
           $table->string('name')->unique();
           $table->string('password');
           $table->rememberToken();
           $table->timestamps();
       });
  • 視圖 因為要實現前后臺用戶的不同登陸,所以首先需要 2 組視圖界面
    • 復制 layouts 下面的 app.blade.php,改名為 admin.blade.php 并對該文件做出修改
    // 將路由指向 admin.login
    // 將 Auth::guest() 改為 Auth::guard('admin')->guest()
    <!-- Right Side Of Navbar -->
    

<ul class="nav navbar-nav navbar-right">

@if (Auth::guard('admin')->guest())
<li><a href="{{ route('admin.login') }}">Login</a></li>
{{-- <li><a href="{{ route('register') }}">Register</a></li> --}}
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::guard('admin')->user()->name }} <span class="caret"></span>
</a>


  - 復制 __auth__ 下面的 `login.blade.php`  到  __views__ 文件夾下面的 __admin__ 文件夾(這個需要手動創建下)

// 將路由改為 admin.login
// 將 email 全部改為 name 因為本文后臺登陸是用 name 和 password 登陸
<form class="form-horizontal" method="POST" action="{{ route('admin.login') }}">
{{ csrf_field() }}

<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
    <label for="name" class="col-md-4 control-label">AdminName</label>

    <div class="col-md-6">
        <input id="name" type="name" class="form-control" name="name" value="{{ old('name') }}" required autofocus>

        @if ($errors->has('name'))
            <span class="help-block">
                <strong>{{ $errors->first('name') }}</strong>
            </span>
        @endif
    </div>
</div>

 - 復制 `home.blade.php` 到 __admin__ 下并且改名` index.blade.php` ,然后做出如下修改

<div class="panel-body text-success">
You are logged in, Admin!
</div>

- __控制器__
  - 復制 __Auth__ 下面的 `LoginController.php` 到 admin 文件夾下(手動創建),并且做出以下修改

// 登陸成功后的跳轉頁面
protected $redirectTo = '/admin/index';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest')->except('logout');
}

// 后臺登陸頁面
public function showLoginForm()
{
    return view('admin.login');
}

// 指定 guard
protected function guard()
{
    return \Auth::guard('admin');
}

// 將登陸驗證的字段 email 改為 name
public function username()
{
    return 'name';
}
  - 將 `HomeController.php` 復制到 __admin__ 文件夾下,并且做出修改

// 只是簡單的添加了登陸成功后跳轉的視圖路徑
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}

/**
 * Show the application dashboard.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    return view('admin.index');
}

- 修改 __Middleware__ 中的 `RedirectIfAuthenticated.php`

// 因為前后臺的控制器用的是 guest 中間件,所以這里需要做出判斷,跳轉不同頁面
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
$url = $guard ? '/admin/index' : '/home';
return redirect($url);
}

    return $next($request);
}

#4. 生成測試數據
  - 用 __factory__ 生成一些后臺測試用戶,怎么生成就不說了,詳見 [創建模型工廠](http://d.laravel-china.org/docs/5.4/database-testing#writing-factories)

#5. 最后一步就是修改 __routes.php__ 文件啦
- 添加 __admin__ 路由

Route::group(['prefix'=>'admin'],function(){
Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login');
Route::post('login', 'Admin\LoginController@login');
});


---------------

# end  :)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容