laravel 5.3 多用户认证
不知道对不对,乱来一下!!!!
1)laravel自带了一个用户认证系统,要使用的话,直接运行一下命令就可以用了
php artisan make:auth
会生成相应的控制器、路由和模版文件
2)数据迁移
php artisan migrate
会生成两个数据迁移文件和相应的数据表(users 和 password_resets 表)(要先配置好数据库连接)
3)多用户认证
如果只是需要完善一个用户资料字段,你只需要添加一个users表的数据迁移文件,再执行一下迁移就行了(看这里)
但如果想添加更多不同类型的用户(比如后台用户、商家用户等等),要怎么办呢?
4)修改用户认证配置(增加“守卫”和“服务提供者”)
打开 config/auth.php 配置看一下就知道什么是“守卫”了
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
很明显,所谓的“守卫”就laravel认证系统的端口,默认已经有两个“守卫”了,一个守web进口的,一个守api接口进口的
现在如果想添加一个后台“守卫”的话,就增加一个配置就行了(driver 表示认证系统用什么来驱动,provider 表示认证服务由谁的提供)
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
上面配置了一个admins服务提供者,所以相应的,还需要在 providers(服务提供者)列表里添加一个配置
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
], 'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
5)配置是弄好,但提供服务的 Eloquent 模型还是不存在的,所以我们就来创建吧
php artisan make:model Admin --migration
--migration参数是同时生成相应的数据迁移文件的意思
Admin模型的内容大概是这样的:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class AdminController extends Controller
{
public function __construct(){
$this->middleware('auth:admin');
} public function index(){
$user = Auth::user();
dd($user->email);
return '后台!!!!';
}
}
关键的地方是 $this->middleware('auth:admin'),关键laravel你要用的“守卫”是admin,否则打印的 Auth::user 将会是默认的前台用户信息
6)按自己的需求填一下数据迁移文件,再执行一下迁移(生成数据表)(这里演示的偷懒了,直接复制前台的用户表来玩的)
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
php artisan migrate
7)添加访问路由,laravel5.3的auth路由在 /vendor/laravel/framework/src/Illuminate/Routing/Router.php 里的 auth 方法里
继续偷懒,直接复制前台路由,加一个后台路由组就行了,大概是这个样子:
$this->group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>'adminview'], function(){
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register'); // Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
});
可以看到,上面路由组里定义使用了一个Admin的命名空间和一个adminview的中间件,中间件的作用待会再说,我们先把命名空间下的控制器给搞定先~~
另外, routes/web.php 里一个后台前页的路由
Route::get('/admin','AdminController@index');
8)路由有了,但Admin命名空间下的路由还一个控制器还没有呢!!再再再偷懒,控制器也直接复制过去吧哈哈
LoginController 和 RegisterController 控制器里命名空间要改成
namespace App\Http\Controllers\Admin\Auth;
然后先说一下 RegisterController 控制器里的改动吧,有三处改动:
1、类头部把 use App\User 改成 use App\Admin;
2、redirectTo 属性值改成 protected $redirectTo = '/admin';
3、create 方法里把 User 模型改成 Admin 模型
完整的代码是这样的:
<?php namespace App\Http\Controllers\Admin\Auth; use App\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers; class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/ use RegistersUsers; /**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/admin'; /**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
} /**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed',
]);
} /**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
好了,再说一下 LoginController 控制器里的改动,也是三处改动:
1、类头部声明使用 Auth 门面,use Illuminate\Support\Facades\Auth;
2、redirectTo 属性值改成 protected $redirectTo = '/admin';
3、加 guard 方法来自定义使用的 “守卫”,看这里
完整的代码是这样的:
<?php namespace App\Http\Controllers\Admin\Auth; use Illuminate\Support\Facades\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']);
} protected function guard()
{
return Auth::guard('admin');
}
}
9)OK,控制器也准备好了,该准备一下模版了,好,再再再再继承偷懒,还是直接复制前台模版改一下哈哈
模版内容我也不改了,直接改一下form表单的提交地址分别成 {{ url('/admin/login') }} 和 {{ url('/admin/login') }}
10)好了,模版也有了,怎么访问显示模版呢?
从上面的路由可以看到,
登录页面的控制器方法叫 showLoginForm,它在 trait AuthenticatesUsers 里,大概是这样:
注册页面的控制器方法叫 showRegistrationForm,它在 trait RegistersUsers 里,大概是这样:
很明显都是直接return 的前台模版(后台的模版地址是 admin.auth.login 和 admin.auth.register),所以我要加一个判断,来判断动态显示前台模版和后台模版
怎么判断呢???
首页要判断的话,肯定要有个东西来判断的对吧?那这个东西哪里来呢?
肯定不能改路由,用url传参判断吧?那怎么怎么办呢?
想来想去,只能中间件来传参了。还是记得上面路由组里的中间吗?!!!!
11)好,我们来加一个 adminview 中间件
php artisan make:middleware AdminView
记得中间件是需要在 app/Http/kernel.php 里注册的,在 $routeMiddleware 数组后加上就行了
'adminview' => \App\Http\Middleware\AdminView::class,
中间件的内容如下:
<?php namespace App\Http\Middleware; use Closure; class AdminView
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->is_admin = true;
return $next($request);
}
}
很明显,我只是在请求模型里加一个 is_admin 属性,并设置成 true
12)加完中间件后,上面的trait方法就要改一下了,判断也很简单,修改成下面这个样子
public function showLoginForm(Request $request)
{
if ($request->is_admin) {
return view('admin.auth.login');
}else{
return view('auth.login');
}
}
public function showRegistrationForm(Request $request)
{
if ($request->is_admin) {
return view('admin.auth.register');
} else {
return view('auth.register');
}
}
13)到此,添加后台用户认证其实就已经弄好的了,你可以访问 http://域名/admin/register 和 http://域名/admin/login 来测试注册和登录
14)最后一个,如果你成功登录了后台,然后再访问 /admin/register 或 /admin/login 的话,你会发现你跳走到 /home 里去了
照理来说登录之后应该是要跳 /admin 的,而不是 /home 的,什么原来呢??
其实就是 LoginController 和 RegisterController 里的构造方法里都写了使用一个叫 guest 的中间件,看一个 kernel.php,然后找到这个中间件的类在这里:
修改 RedirectIfAuthenticated 类的 handle 方法如下:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
if ($request->is_admin) {
return redirect('/admin');
} else {
return redirect('/home');
}
} return $next($request);
}
大功告成!!!
到此就真的大功告成了,这是我自己测试总结出来的,也不知道算不算是规范的写法(因为我看laravel-admin等的cms的后台用户认证的话不是这样写的,当然cms算了一个扩展应用,写法肯定是我们直接写是不同的)。
总之,如果你的项目要添加多一种用户认证(后台管理员、商家会员等等),可以参考一下这个写法哈哈哈哈哈!!!
PS:注册和登录的逻辑其实都不用怎么改,关键是要加一个 认证 “守卫”,然后 Admin 模型和 LoginController 控制器里声明要使用这个 “守卫”就行了,我已经写得比较详细了,如果你刚好来到这里,认真看一下!我很少写那么长的随笔哈哈。
laravel 5.3 多用户认证的更多相关文章
- Laravel 5.2 中多用户认证实现(前台和后台登录)
Laravel 5.2中多用户认证支持,即同时允许不同数据表用户(如前台用户.后台用户.app用户等)登录认证.下面我们就来简单介绍多用户登录及注册功能实现. 1.生成认证脚手架 首先我们使用Lara ...
- Laravel 5.2 使用 JWT 完成多用户认证 | Laravel China 社区 - 高品质的 Laravel 开发者社区 - Powered by PHPHub
Json Web Token# JWT代表Json Web Token.JWT能有效地进行身份验证并连接前后端. 降地耦合性,取代session,进一步实现前后端分离 减少服务器的压力 可以很简单的实 ...
- Laravel开发:多用户登录验证(1)
之前实现了一次,后来代码忘记放哪了,所以有跳了一次坑. 先贴上Laravel自带的验证代码: 路由:routes/web.php // Authentication Routes... $this-& ...
- Laravel 中使用 JWT 认证的 Restful API
Laravel 中使用 JWT 认证的 Restful API 5天前/ 678 / 3 / 更新于 3天前 在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...
- laravel 的passport Oauth 认证登录请求 的 oauth_token 重置
laravel 的passport Oauth 认证登录请求 的 oauth_token 重置 使用API登录认证是需要获取访问令牌,方法为: 参数: grant_type —— 密码模式固定为 ...
- Laravel开发:多用户登录验证(2)
上一篇讲了最基本的User验证,现在来讲一下Admin的验证. 先贴代码, 路由:routes/web.php加上以下代码, //... Route::get('admin/login', 'Admi ...
- laravel如何实现多用户体系登录
laraveli添加一个或多个用户表,以admin为例. 部分文件内容可能需要根据实际情况修改 创建一个Admin模型 php artisan make:model Admin -m 编写admins ...
- Laravel 5.3 使用内置的 Auth 组件实现多用户认证功能
https://blog.csdn.net/kevinbai_cn/article/details/54341779 概述 在开发中,我们经常会遇到多种类型的用户的认证问题,比如后台的管理员和前台的普 ...
- laravel中的Auth认证:
简介 Laravel 5.3 的 Auth 认证在 5.2 的基础上又有一些改变,本文说明如何在 Laravel 5.3 下做不同用户表的登录认证. Auth 认证原理简述 Laravel 的认证是使 ...
随机推荐
- Maven打包可执行Jar的几种方法
http://m.blog.csdn.net/article/details?id=51871705
- python学习笔记(17)--eclipse和pydev的安装及汉化
说明: 1. 本来一直用sublime的REPL跑python,不过在用爬虫下载图片输出页数的时候,由于输出太多行会卡住,而IDLE已经受够了,写起代码来实在是不好用.之前其实也写过一篇文章探讨过各种 ...
- DevExpress的DateEdit设置显示日期和时间
1. 设置Mask.EditMask和DisplayFormat,EditFormat属性.设置为一致:'yyyy-MM-dd HH:mm'; //依照想要的显示格式设置此字符串. [csharp] ...
- Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
既然微软想要为Hyper-V的普及铺路,那么各种套路……配套措施当然也会一并跟上.比如想要看出电脑是否符合Hyper-V配置要求,有至少两种方式可以参考. 方法一:系统信息 这方法很简单,在Corta ...
- Oracle分页(limit方式的运用)
select * from a_matrix_navigation_map where rowid not in(select rowid from a_matrix_navigation_map w ...
- ipad safari 滚动(overflow)解决方案
项目需要放到ipad应用了,发现有一个奇怪的问题,就是我div是设置滚动属性的,在pc上面的各个浏览器页面变小时,会出现滚动条,可是是ipad的safari,则不会滚动,开始以为是div的问题 但发现 ...
- Spring Session + Redis实现分布式Session共享
发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...
- 6款强大的 jQuery 网页布局创建及优化插件
本文将为您介绍6款功能强大的jQuery插件,它们能够帮助您方便快捷地创建复杂的网络布局并进行优化. 1.UI.Layout 该插件可以创建任何你想要的UI形式:包括从简单的标题或侧边栏,到一个包含工 ...
- SQL Server 自动重建出现碎片的索引
1.索引碎片的产生? 由于在表里大量的插入.修改.删除操作而使索引页分裂.如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性 ...
- openfire安装配置完全教程
Java领域的IM解决方案 Java领域的即时通信的解决方案可以考虑openfire+spark+smack. Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端,最新版本是3. ...