Laravel5.5+ 区分前后端用户登录

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. 新建两个中间件,区分前后端用户登录
Laravel5.5+ 区分前后端用户登录
将新建的中间件添加到 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 前端登录结果
Laravel5.5+ 区分前后端用户登录
4.2.2 开一个隐身模式,测试后端登录结果
Laravel5.5+ 区分前后端用户登录
测试成功!

 
    类似博文:

    https://segmentfault.com/a/1190000007716366

原文:https://blog.csdn.net/xiaobinqt/article/details/85230617

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112404.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • C#的继承_继承关系中的被继承人

    C#的继承_继承关系中的被继承人继承详解:一.继承的概念:二.基类和派生类:三.继承的作用:四.继承的特点:五.举例说明:六.继承注意事项:一.继承的概念:继承:是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。当创建一个类时,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类/父类,这个新的类被称为派生类/子类。二.基类和派生类:基类/父类:也可以理解成生活中的父亲

  • 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiX

    使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiXVisualStudio打包安装七宗罪开发.NET的人,肯定会使用VisualStudio里面自带的MSI打包安装工具框架。如果是在一般情况下,这个打包安装框架已经完全足够满足产品发布安装的需要了。它的制成品,是一个setup.exe,一个MSI安装文件,如果你选择项目以来的其他.

  • Js数字转字符串_java怎么将字符串转化为数字

    Js数字转字符串_java怎么将字符串转化为数字js里数字0是false但是字符串是true所以有时需要修改0+‘’数字后边加空串即可

    2022年10月25日
  • C++ 字符串转时间 与 时间转转字符串[通俗易懂]

    C++ 字符串转时间 与 时间转转字符串[通俗易懂]1、常用的时间存储方式1)time_t类型,这本质上是一个长整数,表示从1970-01-0100:00:00到目前计时时间的秒数,如果需要更精确一点的,可以使用timeval精确到毫秒。2)tm结构,这本质上是一个结构体,里面包含了各时间字段structtm{inttm_sec;/*secondsafterthe…

  • 高通平台环境搭建,编译,系统引导流程分析「建议收藏」

    高通平台环境搭建,编译,系统引导流程分析「建议收藏」1、高通平台android开发总结1.1搭建高通平台环境开发环境在高通开发板上烧录文件系统建立高通平台开发环境高通平台,android和modem编译流程分析高通平台7620启动流程分析qcril流程分析,设置sim卡锁pythonscons语法学习Python语言之scons工具流程分析: 1.

    2022年10月19日
  • 服务器四通道内存性能提升,四通道内存性能怎么样

    服务器四通道内存性能提升,四通道内存性能怎么样四通道的内存有提升,但是性价比不是很好,如果是发烧友那不需要考虑什么了,如果是实用主义者四通道带来的性能的提升可能不会在使用中有太多的明显的感受。组建四通道内存很简单,有足够的内存条卡槽,X79的芯片组,i7-3960K的处理器,Apacer宇瞻猎豹DDR3-16002GB*4或者海盗船DDR316002GB*4的内存条就可以了,当然其他品牌的内存条也可以,这里只是举例,四条一样…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号