Session Yii2中最简单的基本身份验证-IdentityInterface的实现

Session Yii2中最简单的基本身份验证-IdentityInterface的实现,session,yii2,postman,basic-authentication,Session,Yii2,Postman,Basic Authentication,我想将HTTP基本身份验证添加到我的Yii2应用程序中,其中用户名/密码存储在Yii配置文件中-对于一个用户,无需DB身份验证 我已通过添加行为功能为我的控制器启用身份验证: public function behaviors() { return [ 'basicAuth' => [ 'class' => \yii\filters\auth\HttpBasicAuth::className(),

我想将HTTP基本身份验证添加到我的Yii2应用程序中,其中用户名/密码存储在Yii配置文件中-对于一个用户,无需DB身份验证

我已通过添加行为功能为我的控制器启用身份验证:

public function behaviors()
    {
        return [
            'basicAuth' => [
                'class' => \yii\filters\auth\HttpBasicAuth::className(),
                'auth' => function ($username, $password) {
                    if ($username=='api') {
                        return new SimpleApiUser();
                    } else {
                        return null;
                    }
                },
            ],
        ];
    }
我被要求创建一个实现IdentityInterface的类,这就是为什么我有这个类:

class SimpleApiUser implements IdentityInterface {

    public static function findIdentity($id)
    {
        return null;
    }

    public static function findIdentityByAccessToken($token, $type = null)
    {
        return null;
    }

    public function getId()
    {
        return 1;
    }

    public function getAuthKey()
    {
        return 1;
    }

    public function validateAuthKey($authKey)
    {
        return true;
    }
}

很好,在第一次请求时,应用程序会请求用户名/密码,但后来它设法将身份验证以某种方式存储在某个内部会话中,并且它不需要对每个新请求进行重复身份验证,无论是从我添加会话的浏览器发出的,还是从邮递员发出的,当然不保留会话。是否可能修改用户类以要求在每个新请求中提供用户名和密码?

我已经尝试过使用您的代码

首先,您的代码足以要求基本身份验证成为每个请求的一部分。如果请求中不存在授权标头,则yii将返回401 Unauthorized。因此,您的实现已经在做您需要的事情

用户不需要每次输入用户名/密码的原因有很多

对于web浏览器: 凭证将为会话保存,浏览器将在每个后续请求中自动发送凭证,而无需用户再次提示

对于邮递员:只要您不手动删除授权设置,授权将作为每个请求的一部分发送,授权将存储在请求中。

如果您想强制用户在每个请求中手动输入用户名/密码,您可以扩展HttpBasicAuth组件,以假装授权不是每个其他请求的请求的一部分

使用Yii; 使用yii\filters\auth\HttpBasicAuth; 类MyHttpBasicAuth扩展了HttpBasicAuth { const SESSION_KEY='authForced'; 非公开会议; 公共函数uu构造$config=[] { 父项::u构造$config; $this->session=Yii::$app->session; } 公共函数身份验证$user、$request、$response { 如果$this->session->hasself::session\u键{ $this->session->removeself::session\u键; 返回父级::验证$user、$request、$response; } $this->session->setself::session_键,true; 返回null; } } 但这需要会话才能工作,因此它只能与浏览器一起使用。对于API,它不会很好地工作。对于邮递员来说,此实现将使每一个其他请求都失败,并导致401未经授权。对于将使用cookie的api,它将以同样的方式失败,对于不使用cookie的api,它将失败每个请求


旁注:邮递员会保存/发送cookies,以便会话与邮递员一起工作。

这是一个带有api的应用程序还是什么如果您有一个基本应用程序或使用高级应用程序,请添加更多详细信息我不确定邮递员,但浏览器通常会存储会话的基本身份验证凭据,并使用它们,而不是重复向用户显示身份验证挑战用户。如果您想避免这种情况并强制输入用户名/密码,您可能需要强制身份验证筛选器为每个请求动态生成领域。奇怪。。。findIdentityByAccessToken返回null SHOOLD执行此作业