【问题标题】:Laravel 5.4 Basic Authentication without a databaseLaravel 5.4 没有数据库的基本身份验证
【发布时间】:2017-05-15 22:24:20
【问题描述】:

问题:我需要在使用 Laravel 5.4 创建的 API 上实现基本身份验证。由于我们需要在没有数据库的情况下实现它(只是从config() 获取凭据),我尝试创建一个注册的中间件,如下所示:

<?php

namespace App\Http\Middleware;

class AuthenticateOnceWithBasicAuth
{
    public function handle($request, $next)
    {
        if($request->getUser() != conf('auth.credentials.user') && $request->getPassword() != conf('auth.credentials.pass')) {
            $headers = array('WWW-Authenticate' => 'Basic');
            return response('Unauthorized', 401, $headers);
        }
        return $next($request);
    }
}

它可以工作,但这样我就只能拥有整个 API 的一个凭据。 我尝试在配置中创建多个凭据,从请求中保存用户和密码,但这样一来,它就像基本身份验证被禁用一样。

问题:有什么办法可以做到这一点?如何在不使用数据库的情况下在我的配置文件中拥有多个凭据?

【问题讨论】:

  • 这段代码有问题!只有在用户名和密码不匹配的情况下,您才会返回 401。如果用户提供了有效的用户名,但密码无效,他将获得身份验证。你应该使用 ||而不是 &&

标签: php laravel authentication basic-authentication laravel-5.4


【解决方案1】:

您可以将您的授权用户名和密码保存在您的配置文件中作为一个集合。

config/myconfig.php

return [
        'authorized_identities' => collect([
             ['user1','password1'],
             ['user2','password2'],
             ...
        ]),
];

然后在你的中间件中

if(config('myconfig.authorized_identites')->contains([$request->getUser(),$request->getPassword()]))

【讨论】:

  • 另一种选择是将其放入单例中。
  • 我正在使用 Lumen 5.6 并且 config() 返回一个数组,所以 collect(config()) 是 IMO 最安全的方式
  • 它在 ConfigCacheCommand.php 第 71 行给出以下错误:您的配置文件不可序列化。在 Macroable.php 第 76 行:方法 Illuminate\Support\Collection::__set_state 不存在。
  • 该错误意味着您的配置文件中有一个闭包,在编写上述代码时,配置文件中允许使用 collect() 方法,请尝试将其删除和/或删除任何您在配置文件中添加的闭包。
【解决方案2】:

您可以拥有一组凭据,并尝试将输入与其中任何一个进行匹配并进行验证。老实说,您可以使用 sqlite 数据库轻松实现这一点。它需要简单的设置,您可以在 5 分钟内开始使用它。

【讨论】:

  • 这可能是他不能使用 sqlite db 的情况,因为这需要 sqlite3。但我同意数组的方法,应该够简单。
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多