我有一个相当独特的问题。我正在使用带有外部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模型基本上是样板文件。任何方向都非常感谢。
答案 0 :(得分:1)
首先看一下高级yii2模板,它会更清楚地显示登录过程:https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/LoginForm.php和https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/User.php。
然后退后一步,找出功能目的是什么。
用户中的findIdentity实际上会返回用户详细信息。在基本的 来自数组的模板,来自数据库的高级模板,在您的情况下来自LDAP。只需创建一个ldap_search即可获取详细信息。我个人添加了一些代码来确定基于组的角色。
您正在过度思考RBAC,您应该已经定义了权限和角色,您只需要弄清楚该用户角色是什么,并为该角色分配。在登录后执行此操作,请确保先删除所有以前的角色,否则您将收到错误。
在您的情况下,User :: findIdentity将始终返回null(因为您可能永远不会使用100调用它),您无法登录任何人,因此用户 - >身份将始终为null。
我家里已经有了一些LDAP代码,我会看到我是否记得将它带到明天,但这个想法正是我告诉你的。