https://blog.csdn.net/kevinbai_cn/article/details/54341779

概述

在开发中,我们经常会遇到多种类型的用户的认证问题,比如后台的管理员和前台的普通用户。Laravel 5.3 内置的 Auth 组件已经能很好的满足这项需求,下面大概记录下使用方法。 
另外,后台页面常常需要登录才能访问,为了完成类似的功能,大家一般都习惯创建新的中间件来实现。但是 Auth 组件已经存在类似的中间件,我们可以在已有的基础上进行完善,具体请看 后台认证 -> 登陆才能访问后台的功能的一种实现方法。 
注意:这里我们只考虑管理员和普通用户存放在不同的表中的情况

创建项目

创建项目 E:\PhpStormProjects>composer create-project --prefer-dist laravel/laravel blog 
进入项目 E:\PhpStormProjects>cd blog 
运行项目 E:\PhpStormProjects\blog>php arstisan serve 
看看效果 浏览器访问http://localhost:8000

项目配置

数据库配置 .env 中配置 DB 相关选项即可

前台认证

数据库迁移 E:\PhpStormProjects\blog>php artisan migrate 
生成 Auth E:\PhpStormProjects\blog>php artisan make:auth

该命令应该在新安装的应用下使用,它会生成 layout 布局视图,注册和登录视图,以及所有的认证路由,同时生成 HomeController ,用来处理登录成功后会跳转到该控制器下的请求。

浏览器访问 http://localhost:8000 
我们看到右上角多了 LOGIN 和 REGISTER 的链接,我们可以试着注册和登陆。 
至此,前台认证完成。

后台认证

后台首页显示

生成后台首页控制器 E:\PhpStormProjects\blog>php artisan make:controller Admin/IndexController 
建立后台首页的视图 resources/views/admin/index.blade.php

<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>首页 | 后台系统</title>
</head>
<body>
<h3>首页</h3>
</body>
</html>

后台首页控制器 app/Http/Controllers/Admin/IndexController.php 添加方法

public function index()
{
return view('admin/index');
}

路由文件 routes/web.php 添加路由组

Route::group(['prefix' => 'admin'], function () {
Route::get('/', 'Admin\IndexController@index');
});

浏览器访问 http://localhost:8000/admin 可看到后台首页 
后台首页显示完成

管理员数据表生成、数据表模型建立以及数据表填充

生成管理员数据表迁移文件 E:\PhpStormProjects\blog>php artisan make:migration create_administrators_table 
修改 database/migrations/*_create_administrators_table.php 中的 up() 与 down() 方法

public function up()
{
Schema::create('administrators', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
} public function down()
{
Schema::drop('administrators');
}

生成数据表 E:\PhpStormProjects\blog>php artisan migrate 
至此,数据表建立 
生成数据表模型 E:\PhpStormProjects\blog>php artisan make:model Models/Administrator 
修改 app/Models/Administrator.php

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; class Administrator 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',
];
}

提示:该模型根据app/User.php 修改 
至此数据表模型建立完成 
生成数据表填充文件 E:\PhpStormProjects\blog>php artisan make:seeder AdministratorsTableSeeder 
database/factories/ModelFactory.php 中添加

$factory->define(App\Models\Administrator::class, function (Faker\Generator $faker) {
static $password; return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});

修改 database/seeds/AdministratorsTableSeeder.php 中的 run() 方法

public function run()
{
factory(App\Models\Administrator::class, 3)->create([
'password' => bcrypt('040313'),
]);
}

修改 database/seeds/DatabaseSeeder.php 中的 run() 方法

public function run()
{
$this->call(AdministratorsTableSeeder::class);
}

数据表填充 E:\PhpStormProjects\blog>php artisan db:seed 
至此,数据表填充完成,在 administrators 中可看到 3 条样例数据

管理员登陆页面显示

新建 app/Http/Controllers/Admin/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/ use AuthenticatesUsers; /**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin'; /**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
} /**
* 重写 Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view('admin/auth/login');
}
}

提示:该控制器内容根据 app/Http/Controllers/Auth/LoginController.php 修改 
新建 resources/views/admin/Auth/login.blade.php ,复制 resources/views/auth/login.blade.php 的内容到这个文件即可 
注意:不要忘了修改登陆表单的 action 地址为 {{ url('/admin/login') }} 
修改路由组

Route::group(['prefix' => 'admin'], function () {
Route::get('login', 'Admin\Auth\LoginController@showLoginForm'); Route::get('/', 'Admin\IndexController@index');
});

至此,后台登陆页面显示完成。访问 http://localhost:8000/admin/login 可看到对应页面

管理员认证

修改 config/auth.php ,在键为 guards 和 providers 的数组中添加管理员相关信息

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
], 'admin' => [
'driver' => 'session',
'provider' => 'administrators',
],
], 'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
], // 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ], 'administrators' => [
'driver' => 'eloquent',
'model' => App\Models\Administrator::class,
],
],

修改 app/Http/Controllers/Admin/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request; class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/ use AuthenticatesUsers; /**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin'; /**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest:admin', ['except' => 'logout']);
} /**
* 重写 Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view('admin/auth/login');
} /**
* 重写 Get the guard to be used during authentication.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard()
{
return \Auth::guard('admin');
} /**
* 重写 Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
$this->guard()->logout(); $request->session()->flush(); $request->session()->regenerate(); return redirect('/admin/login');
}
}

app/Http/Middleware/RedirectIfAuthenticated.php 即 guest 中间件。它的作用是当请求者请求登陆时,如果已登录则将其跳转到合适页面。如果请求的是后台登陆页面且已登录的话,我们应将其跳转到后台首页,而不是默认的前台首页。修改其中的 handle() 方法

public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
$path = $guard? '/admin' : '/home';
return redirect($path);
} return $next($request);
}

修改路由组

Route::group(['prefix' => 'admin'], function () {
Route::get('login', 'Admin\Auth\LoginController@showLoginForm');
Route::post('login', 'Admin\Auth\LoginController@login');
Route::post('logout', 'Admin\Auth\LoginController@logout'); Route::get('/', 'Admin\IndexController@index');
});

顺便在后台首页添加一个登出链接,修改 resources/views/admin/index.blade.php

<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>首页 | 后台系统</title>
</head>
<body>
<h3>首页</h3>
<p>
状态:
@if(Auth::guard('admin')->check())
已登录&nbsp;
<a href="#"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ url('/admin/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
@else
未登录
@endif
</p>
</body>
</html>

至此,管理员认证(登入与登出)已基本完成。 
注意:由于后台很少需要注册功能,所以这部分功能实现不在考虑范围

登陆才能访问后台的功能的一种实现方法

目前的后台认证中,如果管理员没有登录,他也能访问后台首页,这显然是有问题的。这里,可以利用自带的 Auth 系统的 vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php 这个中间件来实现。查看其中的 authenticate() 方法

protected function authenticate(array $guards)
{
if (empty($guards)) {
return $this->auth->authenticate();
} foreach ($guards as $guard) {
if ($this->auth->guard($guard)->check()) {
return $this->auth->shouldUse($guard);
}
} throw new AuthenticationException('Unauthenticated.', $guards);
}

如果管理员或者用户没有登录,则会抛出认证异常。我们可以在 app/Exceptions/Handler.php 中处理这个异常,将登陆者转到相应页面。所以我们可以修改这个文件中的 unauthenticated() 方法

protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
} if(in_array('admin', $exception->guards())) {
return redirect()->guest('/admin/login');
}
return redirect()->guest('login');
}

修改路由组

Route::group(['prefix' => 'admin'], function () {
Route::get('login', 'Admin\Auth\LoginController@showLoginForm');
Route::post('login', 'Admin\Auth\LoginController@login');
Route::post('logout', 'Admin\Auth\LoginController@logout'); Route::group(['middleware' => 'auth:admin'], function () {
Route::get('/', 'Admin\IndexController@index');
});
});

至此,后台登陆才能访问。

Laravel 5.3 使用内置的 Auth 组件实现多用户认证功能的更多相关文章

  1. amazeui中内置的web组件有哪些且如何用

    amazeui中内置的web组件有哪些且如何用 一.总结 一句话总结: 1.组件还是jquery.js+amazeui.js,和插件一样,准确的说是amazeui.css+jquery.js+amaz ...

  2. 现代浏览器内置的可等效替代jQuery的功能

    jQuery的体积在不断的增大.新功能要不断增加,这是必然结果.虽然从版本1.8.3开始的瘦身效果明显,但不可否认的是,对于移动手机端的网 页开发,它仍然是不可接受的.当然,jQuery不是铁板一块, ...

  3. Day5 函数递归,匿名、内置行数,模块和包,开发规范

    一.递归与二分法 一.递归 1.递归调用的定义 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身 2.递归分为两类:直接与间接 #直接 def func(): print('from fu ...

  4. python内置函数 2

    import__( name[, globals[, locals[, fromlist[, level]]]])被 import 语句调用的函数. 它的存在主要是为了你可以用另外一个有兼容接口的函数 ...

  5. C++的一些内置函数

    C++里面有一些内置函数,实现了一些常用功能.虽然我手写也能写出这些函数,但是在srm或者其他一些需要速度的地方,用内置函数的优势就能体现出来了. 1.__gcd(a, b),返回a,b的最大公约数, ...

  6. Android通过意图使用内置的音频播放器

    假设实现一个音频文件的播放,那么在应用程序中提供播放音频文件功能的最简单的方式是利用内置的"Music(音乐)"应用程序的功能--即使用系统自带的或已安装好的音乐播放器来播放指定的 ...

  7. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  8. day 15 - 2 内置函数练习

    内置函数练习 编写 sql 查询语句功能 文件内容: 1,Eva,22,13651054608,IT2,Vera,23,13304320533,Tearcher3,Renault,25,1333235 ...

  9. 函数和常用模块【day04】:内置函数(九)

    一.11-20 11.ord(c) 功能:根据字符,找到对应的ascii值 1 2 >>> ord('a') 97 12.classmethod(function) 功能:类方法,这 ...

随机推荐

  1. 虚拟化–操作系统级 LXC Linux Containers内核轻量级虚拟化技术

    友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/288 软 ...

  2. 数据库 Proc编程二

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  3. 使用OpenFace进行人脸识别(1)

    http://www.chinacloud.cn/show.aspx?id=25992&cid=12 本文中,笔者将介绍OpenFace中实现人脸识别的pipeline,这个pipeline可 ...

  4. 出错的方法有可能是JDK,也可能是程序员写的程序,无论谁写的,抛出一定用throw

    应对未检查异常就是养成良好的检查习惯. 已检查异常是不可避免的,对于已检查异常必须实现定义好应对的方法. 已检查异常肯定跨越出了虚拟机的范围.(比如“未找到文件”) 如何处理已检查异常(对于所有的已检 ...

  5. 【BZOJ】1629: [Usaco2007 Demo]Cow Acrobats(贪心+排序)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1629 这题我想了很久都没想出来啊... 其实任意两头相邻的牛交换顺序对其它牛是没有影响的.. 那么我 ...

  6. 开源 java CMS - FreeCMS2.2 建站向导

    项目地址:http://www.freeteam.cn/ 建站向导 为了方便用户创建网站,系统提供了建站向导功能. 从左側管理菜单点击建站向导进入. 第一步:创建网站 能够直接设置所属的父网站.填写相 ...

  7. Swift AVFoundation 二维码扫描和生成

    项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关A ...

  8. nginx 服务器重启命令,关闭(转)

    nginx -s reload  :修改配置后重新加载生效 nginx -s reopen  :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是 ...

  9. 13个非常实用的JavaScript小技巧

    使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用 ...

  10. 【黑金原创教程】【Modelsim】【第三章】理想就是美丽

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...