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  :)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容