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. 创建相关文件
- 首先
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
的迁移文件 ,后台采用name
和password
验证,修改完成后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 :)