针对两个不同的数据库表进行身份验

时间:2015-03-30 07:56:19

标签: php yii2

我对Yii 2.0中的身份验证过程有点困惑。我正在开发一个有两种用户(学生和讲师)的Web应用程序。每个实体都有自己的数据库表(MySQL,如果这很重要),它有自己的id,username和password字段。我查看了包含针对数据库的身份验证的高级应用程序模板,但在这种情况下,用户表是唯一的。在我的情况下,我必须能够确定要查找用户记录的哪个数据库表(学生或讲师)。身份界面:

interface IdentityInterface
{
    /**
    * Finds an identity by the given ID.
    * @param string|integer $id the ID to be looked for
    * @return IdentityInterface the identity object that matches the given ID.
    * Null should be returned if such an identity cannot be found
    * or the identity is not in an active state (disabled, deleted, etc.)
    */
    public static function findIdentity($id);
    /**
    * Finds an identity by the given token.
    * @param mixed $token the token to be looked for
    * @param mixed $type the type of the token. The value of this parameter depends on the implementation.
    * For example, [[\yii\filters\auth\HttpBearerAuth]] will set this parameter to be `yii\filters\auth\HttpBearerAuth`.
    * @return IdentityInterface the identity object that matches the given token.
    * Null should be returned if such an identity cannot be found
    * or the identity is not in an active state (disabled, deleted, etc.)
    */
    public static function findIdentityByAccessToken($token, $type = null);
    /**
    * Returns an ID that can uniquely identify a user identity.
    * @return string|integer an ID that uniquely identifies a user identity.
    */
    public function getId();
    /**
    * Returns a key that can be used to check the validity of a given identity ID.
    *
    * The key should be unique for each individual user, and should be persistent
    * so that it can be used to check the validity of the user identity.
    *
    * The space of such keys should be big enough to defeat potential identity attacks.
    *
    * This is required if [[User::enableAutoLogin]] is enabled.
    * @return string a key that is used to check the validity of a given identity ID.
    * @see validateAuthKey()
    */
    public function getAuthKey();
    /**
    * Validates the given auth key.
    *
    * This is required if [[User::enableAutoLogin]] is enabled.
    * @param string $authKey the given auth key
    * @return boolean whether the given auth key is valid.
    * @see getAuthKey()
    */
    public function validateAuthKey($authKey);
}

包含findIdentity()方法,遗憾的是它是静态的。我这样说是因为我无法传递额外的参数或从实现此接口的app\models\User类访问实例变量,这将区分数据库表以进行用户身份验证。在我的情况下,$id中的findIdentity()参数是唯一。

我如何找到解决方案?

1 个答案:

答案 0 :(得分:0)

我看到3个选项:

1)如果studentslecturers表的结构没有完全不同,也许最好将公共表users与{{1}一起使用列。如果需要,您可以为它们使用不同的模型(参见here)。

2)由于它是非常见和非广泛的方法,您可以覆盖核心类。

创建具有不同命名空间的type副本,并更改​​IdentityInterface声明以满足您的需求。然后使用您的自定义界面而不是内置界面。

除了findIdentity()模型之外,不要忘记搜索所有框架类以使用User并将其替换为您的实现。

我认为仅在findIdentity()yii\web\User受保护的方法loginByCookie()中调用它。

同样覆盖此类,然后将renewAuthStatus()组件配置中的类切换为自定义类。

3)以其他方式传递其他参数。例如user。看起来像是一个黑客攻击解决方案。

我个人建议使用第一种或第三种方法(如果你反对使用第一种方法)。