我有一个问题,关于rest的

新手提问 · yii2_nono · 于 5年前 发布 · 2851 次阅读

rest,是无状态的,就是不使用session 那如何判断用户是否登录了呢?用户登录又怎么拿到用户的登录信息呢?

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'authMethods' => [
            HttpBasicAuth::className(),
        ],
    ];
    return $behaviors;
}

我使用这种验证方式,在需要判断用户是否登录的控制器中加入了这个认证, 就是app端带着access-token访问控制器,access-token验证通过了认证,说明用户登录了, 拿到用户的信息可以通过 Yii::$app->user->identity去拿到。

那我现在的新问题是? 现在我要访问一个资源的列表,即用get方式访问question资源,控制器是question/index, 让他不需要access-token就能访问,这时候我就不能再控制器中的behaviros添加认证, 不能通过认证就不能使用Yii::$app->user->identity获取用户信息。 我现在的思路是在开一个控制器同样的方式,只不过控制添加认证之后再去拿取用户信息。

不知道大神有没有好的思路,指导一下

共收到 4 条回复
forecho#15年前 0 个赞

有 access-token 并且通过自动认证的时候可以理解为已经登录状态,负责就理解为没登录。

yii2_nono#25年前 0 个赞

@forecho 我知道是这样,我现在想实现跟pc端一样的效果,就是登陆不等了都可以访问这个控制器,判断登录没登录通过授权的方式,但是rest里面好像不行啊,添加认证之后,没有正确access-token连控制器都访问不了。 所以下面的方式好像不可以 public function behaviors()

{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['login', 'logout', 'signup'],
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['login', 'signup'],
                    'roles' => ['?'],
                ],
                [
                    'allow' => true,
                    'actions' => ['logout'],
                    'roles' => ['@'],
                ],
            ],
        ],
    ];
}
forecho#35年前 0 个赞

嗯,明白你意思。你这个需求应该是比较常用的,但是我没这个需求,搜索一下,发现可以用 except 来实现:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'except' => ['view'],
        'authMethods' => [
            HttpBasicAuth::className(),
        ],
    ];
    return $behaviors;
}

except 的意思是过滤掉不验证的 action IDs。

参考文档:Class yii\filters\auth\HttpBasicAuth

yii2_nono#45年前 0 个赞

@forecho 这个方法我也试过了,如果使用except的话,他是对这个控制器的方法不使用认证, public function behaviors()

{
    return ArrayHelper::merge(parent::behaviors(), [
        'authenticator' => [
            'class' => QueryParamAuth::className(),   
            'except' => ['index', 'view'],
        ],
    ]);
}

就是这个认证就没有添加认证,就是上面的except => index, view 这两个方法根本就没有了认证机制,也是没辙了,现在用两个控制器去实现了,一个游客去访问的,一个是登录的用户去访问的。先这么实现吧,以后有办法了在改吧,谢谢 forecho哥了。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册