Laravel5.5+ 区分前后端用户登录
Laravel 的用户认证是通过 Auth Facade 门脸实现的,手动认证可是使用 Auth::login() 或 Auth::attempt() 这两个方法实现.
以下内容纯属个人实现,也许有更优的实现方式.
对于识别前后端的用户,可以使用 Auth::guard() 方法实现,前端默认为 web 看守,Auth::guard('web') ,后端用户使用 admin 看守, Auth::guard('admin') .
1.新建 guard 看守
在 config/auth.php 中新建 admin 看守
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
], 'admin' => [
'driver' => 'session',
'provider' => 'users'
]
]
看守的提供者 provider 不变,还是 users .
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
'table' => 'users',
], // 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
这样做的好处是前后端的用户可以放在一张 users 表中,只需要利用状态区分用户就好了,比如 user_status = 1 的是前端用户, user_status = 2 的是后端用户.
2. 新建两个中间件,区分前后端用户登录
将新建的中间件添加到 app/Http/Kernel.php 中
protected $routeMiddleware = [
.... 'adminVerify' => \App\Http\Middleware\AdminVerify::class,
'frontVerify' => \App\Http\Middleware\FrontVerify::class,
];
在区分前后端用户登录这个功能中,可以废弃默认 Auth 认证中间件 guest.
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
这样做的好处是简化了中间件的使用,不用两套系统公用一个 guest 中间件.
我们使用 adminVerify 中间件来做后端认证,所有的后端路由都必须通过这个中间件. adminVerify 中间件如下
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class AdminVerify
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$current_uri = $request->getRequestUri();
$ignore_uri = [
'/admin/login',
'/admin/logout'
];
if (in_array($current_uri, $ignore_uri)) {
return $next($request);
} else {
if (Auth::guard('admin')->check()) {
return $next($request);
} else {
return redirect('/admin/login');
}
}
}
}
使用 frontVerify 中间件来做前端认证,所有的前端路由都必须通过这个中间件. frontVerify 中间件如下
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class FrontVerify
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$current_uri = $request->getRequestUri();
$ignore_uri = [
'/login',
'/logout'
];
if (in_array($current_uri, $ignore_uri)) {
return $next($request);
} else {
if (Auth::guard('web')->check()) {
return $next($request);
} else {
return redirect('/login');
}
}
}
}
3. 路由设置
默认所有的前端路由都没有前缀,所有的后端路由都带有 admin 前缀. 路由设置如下.
// ==== 前后端登录
// 前端
Route::group(['middleware' => ['frontVerify']], function () {
Route::get('/', 'Front\LoginController@index')->name('front_index');
Route::get('login', 'Front\LoginController@login');
Route::post('login', 'Front\LoginController@store')->name('front_login');
Route::get('logout', 'Front\LoginController@logout')->name('front_logout');
Route::get('login-success', 'Front\LoginController@success')->name('front_success');
}); // 后端
Route::group(['prefix' => 'admin', 'middleware' => ['adminVerify']], function () {
Route::get('/', 'Admin\LoginController@index')->name('admin_index');
Route::get('login', 'Admin\LoginController@login');
Route::post('login', 'Admin\LoginController@store')->name('admin_login');
Route::get('logout', 'Admin\LoginController@logout')->name('admin_logout');
Route::get('login-success', 'Admin\LoginController@success')->name('admin_success');
}); // ==== 前后端登录 END
前后端都有一个 login-success 页面,这两个页面的内容是一模一样的,除了文字不一样.
以下是后端页面的 login-success 页面
<h1>后端登录成功</h1>
我是 admin guard -- {{ \Illuminate\Support\Facades\Auth::guard('admin')->check() }}
=====
我是 web guard -- {{ \Illuminate\Support\Facades\Auth::guard('web')->check() }}
前端的 login-success 页面
<h1>前端登录成功</h1>
我是 admin guard -- {{ \Illuminate\Support\Facades\Auth::guard('admin')->check() }}
=====
我是 web guard -- {{ \Illuminate\Support\Facades\Auth::guard('web')->check() }}
路由列表中前端有一个首页 / ,后端也有一个默认的首页 /admin/,这两个首页的作用是验证未登录的用户是不能访问前后端的任何一个页面的,如果通过路由访问,并且是在没有登录的情况下,那么在中间件中就让其自动跳到对应的登录页面,具体可以看中间件的代码.
4 . 具体登录代码实现
4.1.1 前端登录
<?php
namespace App\Http\Controllers\Front;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
//
use AuthenticatesUsers;
/**
* LoginController constructor.
*/
public function __construct()
{
}
public function index()
{
return view('front.index');
}
public function login(Request $request)
{
return view('front.login');
}
public function store(Request $request)
{
$credentials = $this->validate($request, [
'phone' => 'required|max:255',
'password' => 'required'
]);
$rs = $this->guard()->attempt($credentials);
if ($rs) {
return redirect()->route('front_success');
} else {
return back();
}
}
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->flush();
return redirect()->route('front_login');
}
public function success(Request $request)
{
return view('front.success');
}
protected function guard()
{
return Auth::guard('web');
}
}
4.1.2 后端登录
<?php
/**
* Created by PhpStorm.
* User: nwei
* Date: 2018/12/21
* Time: 16:19
*/ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; class LoginController extends Controller
{
/**
* LoginController constructor.
* @param string $redirectTo
*/
public function __construct()
{
} public function index()
{
return view('admin.index');
} public function login()
{
return view('admin.login');
} public function store(Request $request)
{
$credentials = $this->validate($request, [
'phone' => 'required|max:255',
'password' => 'required'
]); $rs = $this->guard()->attempt($credentials);
if ($rs) {
return redirect()->route('admin_success');
} else {
return back();
}
} public function success()
{
return view('admin.success');
} public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->flush();
return redirect('admin/login');
} protected function guard()
{
return Auth::guard('admin');
} }
4.2 登录结果
4.2.1 前端登录结果
4.2.2 开一个隐身模式,测试后端登录结果
测试成功!
类似博文:
https://segmentfault.com/a/1190000007716366
原文:https://blog.csdn.net/xiaobinqt/article/details/85230617
Laravel5.5+ 区分前后端用户登录的更多相关文章
- 七:Spring Security 前后端分离登录,非法请求直接返回 JSON
Spring Security 前后端分离登录,非法请求直接返回 JSON 解决方案 在 Spring Security 中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录中,这个默认行为则 ...
- Spring Security 前后端分离登录,非法请求直接返回 JSON
hello 各位小伙伴,国庆节终于过完啦,松哥也回来啦,今天开始咱们继续发干货! 关于 Spring Security,松哥之前发过多篇文章和大家聊聊这个安全框架的使用: 手把手带你入门 Spring ...
- beego 前后端分离登录验证
conf>app.conf 文件添加一下参数 copyrequestbody=true sessionon =true routers>router.go 文件添加初始化路由 func i ...
- 遇见BUG如何区分前后端
定位前后端bug: 1.经验法: 软件测试人员应不断精进自己的技能,负责的项目多了,自然对功能的实现过程有了解,也就明白如何分类bug了. 例如: 网页上的某个图片的分辨率不对,如果我们了解实现过程, ...
- 测试如何区分前后端bug
当我们测试到前后端分离的项目时,可能就会想这个bug我到底应该指给谁,是前端的问题还是后端的呢,为了让自己更专业,分清前后端问题还是很重要的. 1.如图商品详情中显示[件装:1,中包装:2 ]但是在后 ...
- ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码
概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...
- app后端用户登录api
app将用户名和密码发送到服务器,服务器验证用户名和密码都正确后,会在redis或memcached服务器中以用户id为键生成token字 符串,然后服务器把token字符串和用户id都返回给客户端( ...
- REST风格框架实战:从MVC到前后端分离(附完整Demo)
既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...
- web开发-前后端分离原理
前言 前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个Node.js)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务 ...
随机推荐
- 【NOI2018模拟5】三角剖分Bsh
[NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...
- C#编程の模板
C#泛型编程已经深入人心了.为什么又提出C#模板编程呢?因为C#泛型存在一些局限性,突破这些局限性,需要使用C#方式的模板编程.由于C#语法.编译器.IDE限制,C#模板编程没有C++模板编程使用方便 ...
- 为什么一定要学习linux系统?
为什么一定要学习linux系统? linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板.就如同在国内再搞一个社交软件取代腾讯一 ...
- chrome-performance页面性能分析使用教程
运行时性能表现(runtime performance)指的是当你的页面在浏览器运行时的性能表现,而不是在下载页面的时候的表现.这篇指南将会告诉你怎么用Chrome DevTools Performa ...
- UVA1618-Weak Key(RMQ)
Problem UVA1618-Weak Key Accept: 103 Submit: 588Time Limit: 3000 mSec Problem Description Cheolsoo ...
- 【vue】vue +element 搭建项目,$createElement使用
语法: 它有三个参数 第一个:html标签名 第二个:配置的数据对象 第三个:内容 应用1:自定义弹窗 html: <el-button type="text" @click ...
- jupyter notebook 代码补全插件工具-nbextensions(并修改默认的工作目录)
# conda install -c conda-forge jupyter_contrib_nbextensionsCollecting package metadata: doneSolving ...
- item 23: 理解std::move和std::forward
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...
- Python 学习 第十一篇:numpy
numpy是Python中的基础模块,类型ndarray定义了一个具有矢量算术运算的多维数组,无需编写循环,就能对整个数组进行批量运算.通常情况下,导入numpy,设置别名为np. import nu ...
- Python全栈开发之路 【第十九篇】:Bootstrap
一.下载和基本使用 官方地址:www.bootcss.com 二.响应式介绍 1.@meida 媒体查询 (1)响应式页面 为了页面能够适应不同工具的屏幕大小的限制,而开发的一种自适应页面,即 一次开 ...