2017-02-06 18 views
0

У меня есть довольно уникальная проблема. Я использую веб-стек Yii2 с внешними компонентами SAS. В настоящее время я также использую openLDAP для аутентификации с помощью SAS и AWS. Мы управляем пользователями и пользовательскими ролями с помощью SAS, поэтому нам нужно использовать SAS для входа в веб-стек.Yii2 Вход по вызову хранимого процесса

Это небольшой фон. Вот в чем проблема: наш текущий SAS-процесс берет имя пользователя/пароль, и если он аутентифицирован, отправляет обратно объект, содержащий роль пользователя для rbac, и полное имя пользователя для использования в интерфейсе. Эта информация не является постоянным нигде, как в базе данных, поэтому я не уверен, как продолжить процесс входа в систему. Модель пользователя по умолчанию имеет закрытый статический массив $ users, и я попытался добавить в этот массив форматированную строку, возвращаемую сохраненным процессом, но когда процесс входа в систему завершен, я получаю null, возвращенный эхом Yii::$app->user->identity.

Возможно, это звучит немного запутанно, и я рад прояснить все, что не имеет смысла.

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; 
} 

модель Пользователь основном шаблонный. Любое направление очень ценится.

+0

Проверьте свою модель пользователя для «public function getId()», это реализация «yii \ web \ IdentityInterface», этот идентификатор фактически используется для «findIdentity()». –

ответ

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 в User фактически возвращает данные пользователя. В базовом шаблоне из массива, в расширенном шаблоне из db, в вашем случае из LDAP. Просто сделайте ldap_search, чтобы вернуть детали. Я лично добавил к нему немного больше кода, чтобы выяснить роль, основанную на группах.

RBAC, в котором вы его задумываетесь, у вас должны быть разрешения и роли, которые уже определены, вам просто нужно выяснить, что это за роль пользователя, и назначить его для этой роли. Сделайте это после входа в систему, убедитесь, что вы удалили все предыдущие роли раньше или вы получите сообщение об ошибке.

В вашем случае пользователь :: findIdentity всегда будет возвращать null (потому что, вероятно, вы никогда не вызываете его со 100), вы не можете войти никому, так что идентификатор пользователя -> всегда будет нулевым.

У меня есть код LDAP уже у себя дома, я увижу, не помню ли я, чтобы он был завтра, но идея в том, что я вам сказал.