Yii2通过调用存储过程

时间:2017-02-06 17:58:41

标签: php authentication yii2 yii2-basic-app

我有一个相当独特的问题。我正在使用带有外部SAS组件的Yii2 Web堆栈。我目前还在使用openLDAP进行SAS和AWS身份验证。我们使用SAS管理用户和用户角色,因此我们需要使用SAS登录Web堆栈。

这是一个小背景。问题在于:我们当前存储的SAS进程使用用户名/密码,如果经过身份验证,则发送回包含rbac用户角色的对象,以及用户在接口中使用的全名。这个信息在数据库中没有任何持久性,所以我不知道如何继续进行登录过程。默认情况下,User模型有一个私有静态$ users数组,我尝试将存储过程返回的格式化字符串添加到此数组中,但是当登录过程完成时,我得到null返回的Yii::$app->user->identity {1}}回声。

这听起来有点令人费解,我很乐意澄清任何没有意义的事情。

LoginForm.php     

namespace app\models;

use app\components\SAS_Auth;
use Yii;
use yii\base\Model;

class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe = true;

    private $_user = false;
    private $_authenticateUser = false;
    public $_authString;

    public function rules()
    {
        return [
            // username and password are both required
            [['username', 'password'], 'required'],
            // rememberMe must be a boolean value
            ['rememberMe', 'boolean'],
            // password is validated by validatePasswordSas()
            ['password', 'validatePasswordSas'],
        ];
    }

    public function validatePasswordSas($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUserSas();

            $this->_authenticateUser = new SAS_Auth(); // SAS authentication class that contains auth functions
            $this->_authString = $this->_authenticateUser->authenticate($this->username, $this->password);

            if (!$user || !$this->_authString) {
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }

    public function loginSas()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUserSas(), $this->rememberMe ? 3600*24*30 : 0);
        }
        return false;
    }

    public function getUserSas()
    {
        if ($this->_user === false) {
            $this->_authenticateUser = new SAS_Auth();
            $this->_authString = $this->_authenticateUser->authenticate($this->username, $this->password);
            $this->_user = User::findIdentity($this->_authString);
        }

        return $this->_user;
    }
}

user.php的

public $id;
public $username;
public $password;
public $authKey;
public $accessToken;

private static $users = [
//        '100' => [
//            'id' => '100',
//            'username' => 'admin',
//            'password' => 'admin',
//            'authKey' => 'test100key',
//            'accessToken' => '100-token',
//        ],
//        '101' => [
//            'id' => '101',
//            'username' => 'demo',
//            'password' => 'demo',
//            'authKey' => 'test101key',
//            'accessToken' => '101-token',
//        ],
];


/**
 * @inheritdoc
 */
public static function findIdentity($id)
{
    return isset(self::$users['100']) ? new static(self::$users['100']) : null;
}

User模型基本上是样板文件。任何方向都非常感谢。

1 个答案:

答案 0 :(得分:1)

首先看一下高级yii2模板,它会更清楚地显示登录过程:https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/LoginForm.phphttps://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/User.php

然后退后一步,找出功能目的是什么。

用户中的findIdentity实际上会返回用户详细信息。在基本的 来自数组的模板,来自数据库的高级模板,在您的情况下来自LDAP。只需创建一个ldap_search即可获取详细信息。我个人添加了一些代码来确定基于组的角色。

您正在过度思考RBAC,您应该已经定义了权限和角色,您只需要弄清楚该用户角色是什么,并为该角色分配。在登录后执行此操作,请确保先删除所有以前的角色,否则您将收到错误。

在您的情况下,User :: findIdentity将始终返回null(因为您可能永远不会使用100调用它),您无法登录任何人,因此用户 - >身份将始终为null。

我家里已经有了一些LDAP代码,我会看到我是否记得将它带到明天,但这个想法正是我告诉你的。