2016-11-08 7 views
0

У меня есть модель пользователя. AciveRecord реализует IdentityInterface. Я должен проверить пользователя с OpenId, и если он существует, я буду дублировать запись пользователя в моем db. Все работает, но у меня проблема.Почему Yii2 user-> save() делает перенаправление?

После создания пользователя я хочу назначить ему права, но когда я вызываю user-> save() переадресацию страницы на пользователя/пользователя.

Поведения:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'only' => ['rbac','users','logout', 'index', 'whoami', 'user-change-data-handler','login', 'openid', 'showoid', 'openid-signup', ''], 
      'rules' => [ 
       [ 
        'actions' => ['login', 'openid', 'showoid', 'openid-signup'], 
        'allow' => true, 
        'roles' => ['?'], 
       ], 
       [ 
        'actions' => ['logout', 'index', 'showoid', 'whoami', 'user-change-data-handler', 'showoid'], 
        'allow' => true, 
        'roles' => ['@'], 
       ], 
       [ 
        'actions' => ['users',], 
        'allow' => true, 
        'roles' => ['UsersAdministrator'], 
       ], 
       [ 
        'actions' => ['rbac',], 
        'allow' => true, 
        'roles' => ['RBACAdministrator'], 
       ], 
      ], 
     ], 
     // 'verbs' => [ 
     //  'class' => VerbFilter::className(), 
     //  'actions' => [ 
     //   'logout' => ['post'], 
     //  ], 
     // ], 
    ]; 
} 

После ввода пользователем логина перенаправляет

public function actionOpenid() 
{ 
    if (empty($_GET['username'])) 
     return $this->render('openid'); 
    $client = new OpenId(); 
    $client->authUrl = 'http://*******/openidserver/'.$_GET['username']; // Setup provider endpoint 
    $client->setReturnUrl('http://127.0.0.1/backend/web/site/showoid'); 
    $client->setUserAttributes('user/email'); 
    $url = $client->buildAuthUrl(); // Get authentication URL 
    return Yii::$app->getResponse()->redirect($url); // Redirect to authentication URL 
} 

И OpenID перенаправляет

public function actionShowoid() 
{ 
    $client = new OpenId(); 
    if (!$client->validate()){ 
     $this->redirect(Url::to('site/login')); 
    } 
    else { // validate response 
     $strings=explode('&', $_SERVER["REDIRECT_QUERY_STRING"]); 
     $openid = []; 
     foreach ($strings as $k => $v) { 
      if (!preg_match('/.+=.+/', $v)) 
       continue; 
      $vals=[explode('.',explode('=',$v)[0])[1], explode('=',$v)[1]]; 
      $openid[$vals[0]] = $vals[1]; 
     } 
     $openid['username'] = explode('%2F',$openid["identity"]); 
     $openid['username'] = $openid['username'][count($openid['username'])-1]; 
     $user = \common\models\User::findOne(['username' => $openid['username']]); 
     if ($user ==null){ 
      $user = new \common\models\User; 
      $user->username = $openid['username']; 
      $user->password_hash = 'Debugging'; 
      $user->save(); 
//------------all below ignores 
      if (1){ 
        $id = $user->id; 
        $assignment = 'AccessAdministrator'; 
        $url = Url::to(['api/add-assignments', 'user_id' => $id, 'item_name' =>$assignment, 'apiKey'=>$this->apiKey]); 
        file_get_contents($url); 
       } 


      $user->save(); 
      \Yii::$app->user->login($user); 
      $this->redirect(['site/index']); 

     } 
     else{ 
      \Yii::$app->user->login($user); 
      $this->redirect(['site/index']); 
     } 
    //var_dump(\common\models\User::findOne(['username' => $openid['username']])); 
    } 
} 
+0

почему, если (1) {? .. до назначения прав? что значит? – scaisEdge

+0

Было реальное состояние, и я пробовал его с 1, чтобы его можно было отследить, что блок «if» работает. – Teo

+0

Возможно, у вас есть метод 'save()' в 'User' overridden (с перенаправлением)? Или прикладывается какое-то поведение, которое делает это. – Bizley

ответ

0

Попробуйте удалить, если (1) и в конечном итоге сделать этот путь

..... 
    $user->password_hash = 'Debugging'; 

    if ($user->save()){ 
      var_dum('just for test'); 
      $id = $user->id; 
      $assignment = 'AccessAdministrator'; 
      $api->assignRole([$id,$assignment]) 

     } 

и помните, что когда конечный код .. вы должны оказывать или перенаправлять на какой странице в противном случае могут быть перенаправлены на страницу по умолчанию назначения, например: сайт/логин

+0

Нет. Все еще перенаправляет. – Teo

+0

где он перенаправляет? –

+0

Вы уверены, что назначить сохранить данные? Обновите свой вопрос и покажите весь свой код контроллера, пожалуйста .. может быть, что назначение не сохраняет данные, а в конце вашего кода вы перенаправляете? – scaisEdge

Смежные вопросы