Рубрики
Uncategorized

Всесторонний анализ междоменной логики входа в систему единого входа Yii2

Автор оригинала: David Wong.

Набросок

Эта статья представляет собой всесторонний логический анализ того, как Yii2 реализует вход в систему единого входа. На самом деле, я также написал две статьи о том, как реализовать логин единого входа и как его оптимизировать дальше, включая эту статью, в которой также представлен логин единого входа Yii2, который постепенно оптимизируется и постоянно обобщается и публикуется. Цель состоит в том, чтобы сделать функцию входа в систему единого входа Yii2 как можно лучше, подумать об этом с точки зрения гибкости разработки программ и задушить все потенциальные ограничения в колыбели. Средний.

Этапы реализации

1. общие\конфигурация\основные. php Конфигурация файла выглядит следующим образом:

 [
        'user' => [            
            'identityClass' => 'login\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity', 'httpOnly' => true,'domain' => '.' . DOMAIN],
            // 'returnUrl'=>'//' . DOMAIN_HOME,
        ],        
        'session' => [           
            'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],            
            'timeout' => 24*3600*30,
        ],

2. Создайте новый модуль входа в систему и откройте его common\config\bootstrap.php Добавьте этот код:

Yii:: setAlias ('login', dirname (dirname (_DIR_).'/ login'); // Add custom directory structure

3. login\config\main.php Измените urlManager следующим образом:

'urlManager' => [
            'class' => 'common\components\MutilpleDomainUrlManager',
            'domains' => [
                'crm' => '//' . DOMAIN_CRM,
                'admin' => '//' . DOMAIN_ADMIN,
                'hr' => '//' . DOMAIN_HR,
                'oa' => '//' . DOMAIN_OA,
                'frontend' => '//' . DOMAIN_FRONTEND,
                'backend' => '//' . DOMAIN_BACKEND,
            //     'img' => '//' . DOMAIN_IMG,
                'api' => '//' . DOMAIN_API,
                'login' => '//' . DOMAIN_LOGIN,
            ],

            //'baseUrl' => 'http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HOME,
            'showScriptName' => false,
            'enablePrettyUrl'=> true, //beautifying URLs
            'enableStrict Parsing'=> true, /// set whether's'exists or not;  
            // 'suffix' => ".php",  
            'rules' => [ '' => 'site/login',
                        // Without this, access to the domain name cannot open the default action directly (removing the "site / login" of the URL) 
            ]   
        ],

4. Дополнить недостающее utilpleDomainUrlManager.php файл на Шаге 3 Искалечит Диспетчер Url-адресов домена. php, этот файл хранится в пространстве имен, которое я вам дал.

getBaseUrl();
        if ($domain) {
            if (!isset($this->domains[$domain])) {
                throw new \yii\base\InvalidConfigException('Please configure UrlManager of domain "' . $domain . '".');
            }
            $this->setBaseUrl($this->domains[$domain]);
        }
        $url = parent::createUrl($params);
        $this->setBaseUrl($bak);
        return $url;
    }
}

Примечание: Используется для получения URL-адреса домена.

5. Изменение SiteController.php Способ входа в систему в модуле входа

// login
    public function actionLogin()
    {    
        // Get the current URL
        $URL=Yii::$app->request->getHostInfo().Yii::$app->request->url;
        $URL1='http://'.DOMAIN_CRM; 
        $redirectURL=Yii::$app->request->get('redirectURL'); 
        $redirectURL1='http://'.DOMAIN_LOGIN; 

        $model = new LoginForm();
        TagDependency::invalidate(Yii::$app->cache, ['Session:'.Yii::$app->session->id]);
 
        // Verify that you are logged in, not logged in
        if (!\Yii::$app->user->isGuest) {  
           if(!empty($redirectURL)){
                $this - > action logout (); // mandatory logout
               
                return $this->redirect($URL);

           }else{ 
                // Submit form judgement when redirectURL does not exist
                if($this->siteLogin){     
                   if ($model->load(Yii::$app->request->post()) && $model->login()) { 
                       // Determine whether the account is not logged in 
                       if(empty($t_status=$model->user->attributes['t_status']) && $t_status==0){ 
                           return $this->error($redirectURL1,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
                       }else{ 
                            if(empty($redirectURL)) return $this->redirect($URL1,301); 

                            return $this->redirect($redirectURL,301);
                        }          
                    } else { 
                        return $this->renderPartial('login', [
                            'model' => $model,
                        ]);
                    }
                }else{ 
                    return $this->goHome();
                }  
           }  
        } else {

            // Submit form judgement when redirectURL exists
            if ($model->load(Yii::$app->request->post()) && $model->login()) {     
                 // Determine whether the account is not logged in
                 if(empty($t_status=$model->user->attributes['t_status']) && $t_status==0){ 
                    if(empty($redirectURL)){
                        return $this->error($redirectURL1,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
                    }
                    return $this->error($URL,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
                 }else{ 
                    if(empty($redirectURL)) return $this->redirect($URL1,301); 
               
                    return $this->redirect($redirectURL,301);
                 }        
            } else {   
                return $this->renderPartial('login', [
                    'model' => $model,
                ]);
            }
        }
    }

6. Изменить SiteController.php Способ входа в систему в интерфейсном модуле

public function actionLogin()
    {  
        // Get the last URL
        $URL=Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl();  
        if (!\Yii::$app->user->isGuest) { 
            return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL='.$URL);
        }
        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) { 
            return $this->goBack();
        } else { 
            if(!empty($URL)){ 
                return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL='.$URL);
            }else{ 
                return $this->renderPartial('login', [
                                'model' => $model,
                            ]);
            }
        }
    }

7. Добавьте следующий код в верхней части основных макетов интерфейсных представлений по умолчанию. PHP

$redirectURL='http://'.DOMAIN_LOGIN.'?redirectURL='.Yii::$app->request->getHostInfo().Yii::$app->request->url;

8. Наконец, выходная метка выводит URL-адрес перенаправления PHP echo$; >.

Примечание: В других модулях, таких как серверная часть, CRM и т. Д., Механизм входа в систему единого входа всего проекта может быть реализован путем имитации моих идей реализации интерфейса и их изменения.

Осторожность

1. На первом этапе динамически приобретается доменное имя без WWW. На этом этапе необходимо выполнить обработку суждения о доменном имени, например: www.xxx.com, www.xxx.com.cn, www.xxx.com:8099 и другие возможные доменные имена, чтобы гарантировать, что доменные имена могут использовать механизм входа и выхода. 2. На шаге 5 и шаге 7 используйте Yii:: $app – > запрос – > getHostInfo (). Yii:: $app – > запрос – > URL для получения текущего URL-адреса-более удобный и эффективный способ уменьшить избыточность кода. 3. В SiteController.php Метод входа в систему в интерфейсном модуле на шаге 6, Yii:: $app – > запрос – > getHostInfo (). Yii:$app – > Пользователь – > getReturnUrl () используется для получения последнего URL-адреса. Неправильно использовать собственный метод Yii 2 Yii:$app – > User – > getReturnUrl () для получения последнего URL-адреса, особенно для получения “последнего URL-адреса” вместо текущего URL-адреса.

Сопутствующая информация

Yii: Некоторые способы получения URL-адресов: http://blog.csdn.net/iefreer/…