Laravel Auth 更为简便的使用

前言

众所周知,我们绝大多数项目最少会有前台展示页面【不管是pc还是wap甚至于api】和一个后台管理页面
那么在使用Auth门面进行用户管理时,因为数据表的不一致,你可能会书写如下代码

前台使用

// 验证
Auth::guard('home')->check();

// 取出用户
Auth::guard('home')->user();

后台使用

// 验证
Auth::guard('admin')->check();

// 取出用户
Auth::guard('admin')->user();

你会发现你都会使用guard来指定用户组,对于我这种懒人来说,这种明显是不太智能化

解决方法

以下是我自己使用laravel以来一直使用的小方法,已经很久了,不知道有没有人公布出来过类似的方法
其实很简单,只需要在使用端的路由,添加一个基础中间件,让基础中间件来修改config默认配置即可

核心代码

config([
    'auth.defaults.guard' => 'admin'
]);

然后你就可以在后台直接使用,前台和其他端同理

// 验证
Auth::check();

// 取出用户
Auth::user();

附上自己的demo部分源码给予参考

admin路由文件描述

路由服务提供者代码

中间件文件代码

这里就不再赘述如何定义中间件了,可以自己去查找中间件文档

最后可能会有人想直接写在对应端的BaseController不也一样吗,但是如果当你的请求还没有到控制器呢?
比如登录验证不就是在中间件内进行的吗?
比如表单验证不也还是在控制器之前吗?【前提是你在request前用到了Auth,比如某个数据主键你希望是当前用户可管理的】

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

我也是这样处理的,很方便

4年前 评论
Siam (楼主) 4年前

想了半天终于好像懂了,这样后端就不用了Auth::guard('admin')->user();直接Auth::user();

4年前 评论
Siam (楼主) 4年前
Siam (楼主) 4年前
if (!function_exists('auth_admin_user')) {
    function auth_admin_user()
    {
        return auth('admin')->user();
    }
}

if (!function_exists('auth_admin_id')) {
    function auth_admin_id()
    {
        return auth('admin')->id();
    }
}

if (!function_exists('auth_admin_check')) {
    function auth_admin_check()
    {
        return auth('admin')->check();
    }
}

如果 auth 不自己指定 guardguard 会自动变成当前登录的用户 guard,比如登录了前台用户,后台用户没有登录,再使用你的方法获取后台用户,会变成得到前台用户

4年前 评论
Siam (楼主) 4年前

上面出现的情况是在多guard下,具体可以看下面两个文件源代码

app/Http/Middleware/Authenticate.php
use Illuminate\Auth\Middleware\Authenticate
protected function authenticate($request, array $guards)
    {
        if (empty($guards)) {
            $guards = [null];
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }
        }

        $this->unauthenticated($request, $guards);
    }

测试代码

Route::get('/', function () {
    dump(auth()->user());
    return view('welcome');
})->middleware('auth:web,admin');
4年前 评论
Siam (楼主) 4年前
Siam (楼主) 4年前
Siam (楼主) 4年前

这个代码已经没有必要加了 return $this->auth->shouldUse($guard); 已经用这个代码替代了 除非是 多个 guard

4年前 评论
Siam (楼主) 4年前

还不错,可以完善一点,通过参数控制要设置的默认 guard,,,

使用:

xxx->middleware('default_guard:admin')

中间件:

public function handle($request, Closure $next, $gaurd)
{
    config(['auth.defaults.guard' => $guard]);
    return $next($request);
}
4年前 评论
Siam (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!