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+ 区分前后端用户登录的更多相关文章

  1. 七:Spring Security 前后端分离登录,非法请求直接返回 JSON

    Spring Security 前后端分离登录,非法请求直接返回 JSON 解决方案 在 Spring Security 中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录中,这个默认行为则 ...

  2. Spring Security 前后端分离登录,非法请求直接返回 JSON

    hello 各位小伙伴,国庆节终于过完啦,松哥也回来啦,今天开始咱们继续发干货! 关于 Spring Security,松哥之前发过多篇文章和大家聊聊这个安全框架的使用: 手把手带你入门 Spring ...

  3. beego 前后端分离登录验证

    conf>app.conf 文件添加一下参数 copyrequestbody=true sessionon =true routers>router.go 文件添加初始化路由 func i ...

  4. 遇见BUG如何区分前后端

    定位前后端bug: 1.经验法: 软件测试人员应不断精进自己的技能,负责的项目多了,自然对功能的实现过程有了解,也就明白如何分类bug了. 例如: 网页上的某个图片的分辨率不对,如果我们了解实现过程, ...

  5. 测试如何区分前后端bug

    当我们测试到前后端分离的项目时,可能就会想这个bug我到底应该指给谁,是前端的问题还是后端的呢,为了让自己更专业,分清前后端问题还是很重要的. 1.如图商品详情中显示[件装:1,中包装:2 ]但是在后 ...

  6. ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码

    概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...

  7. app后端用户登录api

    app将用户名和密码发送到服务器,服务器验证用户名和密码都正确后,会在redis或memcached服务器中以用户id为键生成token字 符串,然后服务器把token字符串和用户id都返回给客户端( ...

  8. REST风格框架实战:从MVC到前后端分离(附完整Demo)

    既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...

  9. web开发-前后端分离原理

    前言 前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个Node.js)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务 ...

随机推荐

  1. (转)Spring Boot(四):Thymeleaf 使用详解

    http://www.ityouknow.com/springboot/2016/05/01/spring-boot-thymeleaf.html 在上篇文章Spring Boot (二):Web 综 ...

  2. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...

  3. Linux系统下为何病毒少?原因竟是这个?

    Linux系统下为何病毒少?原因竟是这个? 可能不少人持这样一种观点,认为 Linux 病毒少是因为Linux不像Windows那么普及,其实这种观点很早已经被人批驳过了,一个最有力的论据是:如果写病 ...

  4. C和指针 (pointers on C)——第七章:函数(上)

    第七章 函数 这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并非非常虐.关于stdarg宏可能有些陌生.它负责可变參数列表的定义. 总结: 新式风格和旧式风格就不要提了.八百年前的事情. 函 ...

  5. [HEOI2016/TJOI2016]排序

    嘟嘟嘟 首先这题的暴力是十分好写的,而且据说能得不少分. 正解写起来不难,就是不太好想. 根据做题经验,我想到了给这个序列转化成01序列,但是接下来我就不会了.还是看了题解. 因为查询只有一个数,所以 ...

  6. Maven打包相关插件集合

    参考:https://www.cnblogs.com/selier/p/9510326.html

  7. Python2 处理 Unicode 字符串的规则

    在 Python2 中处理 Unicode 字符串,需遵循如下规则: 1. 程序中的字符串要加前缀 u 2. 不要用 str(),而应该用 unicode() 作为字符串转换函数.不要使用 chr() ...

  8. linux内存源码分析 - 内存回收(整体流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文 ...

  9. [Spark][kafka]kafka 生产者,消费者 互动例子

    [Spark][kafka]kafka 生产者,消费者 互动例子 # pwd/usr/local/kafka_2.11-0.10.0.1/bin 创建topic:# ./kafka-topics.sh ...

  10. 腾讯 Omi 5.0 发布 - Web 前端 MVVM 王者归来,mappingjs 强力加持

    写在前面 腾讯 Omi 框架正式发布 5.0,依然专注于 View,但是对 MVVM 架构更加友好的集成,彻底分离视图与业务逻辑的架构. 你可以通过 omi-cli 快速体验 MVVM: $ npm ...