美文网首页
LarAvel(多用户认证,admin、user分表)

LarAvel(多用户认证,admin、user分表)

作者: 杰森跟班 | 来源:发表于2017-07-26 11:47 被阅读0次

    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  :)

    相关文章

      网友评论

          本文标题:LarAvel(多用户认证,admin、user分表)

          本文链接:https://www.haomeiwen.com/subject/udunkxtx.html