没有全局范围的 Laravel 身份验证

标签 laravel authentication

在我的 Laravel 应用程序中,用户可以禁用(而不是删除)他们的帐户以从网站上消失。但是,如果他们再次尝试登录,他们的帐户应该会自动激活并且他们应该能够成功登录。

这是通过用户表中的“事件”列和用户模型中的全局范围完成的:

protected static function boot() {
    parent::boot();

    static::addGlobalScope('active', function(Builder $builder) {
        $builder->where('active', 1);
    });
}

现在的问题是那些非事件帐户无法再次登录,因为 AuthController 找不到它们(超出范围)。

我需要达到的目标:
  • 使 AuthController 忽略全局范围“事件”。
  • 如果用户名和密码正确,则将“事件”列值更改为“1”。

  • 我现在的想法是使用 withoutGlobalScope 定位用户,手动验证密码,将“active”列更改为 1,然后继续常规登录。

    在我的 AuthController postLogin 方法中:
    $user = User::withoutGlobalScope('active')
                ->where('username', $request->username)
                ->first();
    
    if($user != null) {
        if (Hash::check($request->username, $user->password))
        {
            // Set active column to 1
        }
    }
    
    return $this->login($request);
    

    所以问题是如何让 AuthController 忽略全局范围而不改变 Laravel 主代码,这样它就会保持更新?

    谢谢。

    最佳答案

    创建类(class) GlobalUserProvider扩展 EloquentUserProvider像下面

    class GlobalUserProvider extends EloquentUserProvider {
    
        public function createModel() {
             $model = parent::createModel();
             return $model->withoutGlobalScope('active');
        }
    
    }
    

    AuthServiceProvider 中注册您的新用户提供商:
    Auth::provider('globalUserProvider', function ($app, array $config) {
         return new GlobalUserProvider($this->app->make('hash'), $config['model']);
    });
    

    最后,您应该在 auth.php 中将您的用户提供程序驱动程序更改为 globalUserProvider配置文件。
     'providers' => [
        'users' => [
            'driver' => 'globalUserProvider',
            'model' => App\Models\User::class
        ]
     ]
    

    关于没有全局范围的 Laravel 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266296/

    相关文章:

    c# - 上传文件时服务器要求输入用户名和密码

    java - Spring Security服务配置

    python - 原型(prototype) iPhone 应用程序和 Python SimpleHTTPServer 之间的简单安全性

    php - Laravel 插入和检索关系

    node.js - 每个用户的套接字 io channel 通知

    Laravel 将模型类作为函数中的参数传递

    Laravel - 我可以将带有 apiResource 的参数传递给 Controller ​​中的索引函数吗?

    http - 指示 "not logged in"的正确 HTTP 代码是什么?

    javascript - 当有人直接打开页面时如何进行基于 token 的身份验证

    php - Laravel 返回 Id 列的字符串