2017-04-14 3 views
1

J'ai un système de membre personnalisé que j'ai fait: Yii2 Members System. Vous pouvez vous référer à cela pour tous les détails, ou l'installer pour que vous puissiez travailler avec cette question.Yii2 Advanced - Partager la session entre frontend et mainsite (duplicata de frontend pour www)

Je frontend et backend comme Yii2 fournit, avec quelques modifications pour séparer les sessions/cookies qui backend fonctionne avec le modèle d'administration et tire d'une table admin. Similaire aux anciens systèmes de membres traditionnels.

mainsite est fondamentalement un clone de frontend et son rôle est d'être le site principal. Ce que vous obtenez quand vous allez à www.site.com ou site.com.

Voici les 3 applications et leurs domaines d'exemple:

  • mainsite = www.site.com ou site.com
  • frontend = users.site.com
  • back-end = admin.site.com

Lorsqu'un utilisateur se connecte ()) et revenir à la page d'accueil (mainsite at www.site.com) Je veux qu'il sache qu'ils sont connectés et affichent leur nom d'utilisateur. Tout comme le fonctionnement de frontend par défaut depuis l'application avancée. De ce que j'ai jusqu'ici, je me connecte et me dirige vers le site principal et il lit juste An internal server error occurred.. Cela ne ressemble pas à une erreur Yii, mais à une erreur de serveur? Quand je regarde dans les journaux Yii sous exécution, il mentionne le contrôle d'accès:

2017-04-14 13:38:25 [127.0.0.1][1][-][error][yii\web\HttpException:403] exception 'yii\web\ForbiddenHttpException' with message 'You are not allowed to perform this action.' in /Applications/XAMPP/xamppfiles/htdocs/yii2-members-system/vendor/yiisoft/yii2/filters/AccessControl.php:151 

Voici quelques-unes de mes configs.

mainsite/config/main.php

'components' => [ 
    'assetManager' => [ 
     'bundles' => false, 
    ], 
    'request' => [ 
     'csrfParam' => '_csrf-mainsite', 
    ], 
    'user' => [ 
     'class' => 'common\components\User', 
     'identityClass' => 'common\models\User', 
     'enableAutoLogin' => true, 
     'identityCookie' => [ 
      'name' => '_identity-frontend', 
      'httpOnly' => true, 
      'domain' => '.yii2-members-system.dev', 
     ], 
    ], 
    'session' => [ 
     'name' => 'advanced-frontend', 
     'cookieParams' => [ 
      'domain' => '.yii2-members-system.dev', 
      'httpOnly' => true, 
     ], 
    ], 
    'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'showScriptName' => false, 
     'rules' => [ 
     ], 
    ], 
], 

frontend/config/main.php

'components' => [ 
    'assetManager' => [ 
     'bundles' => false, 
    ], 
    'request' => [ 
     'csrfParam' => '_csrf-frontend', 
    ], 
    'user' => [ 
     'class' => 'common\components\User', 
     'identityClass' => 'common\models\User', 
     'enableAutoLogin' => true, 
     'identityCookie' => [ 
      'name' => '_identity-frontend', 
      'httpOnly' => true, 
      'domain' => '.yii2-members-system.dev', 
     ], 
    ], 
    'session' => [ 
     'name' => 'advanced-frontend', 
     'cookieParams' => [ 
      'domain' => '.yii2-members-system.dev', 
      'httpOnly' => true, 
     ], 
    ], 
    'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'showScriptName' => false, 
     'rules' => [ 
     ], 
    ], 
], 

vhosts

<VirtualHost *:80> 
    ServerName yii2-members-system.dev 
    ServerAlias yii2-members-system.dev 
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/yii2-members-system/mainsite/web" 
    ErrorLog "logs/mainsite.yii2-members-system.dev-error_log" 
    CustomLog "logs/mainsite.yii2-members-system.dev-access_log" common 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName yii2-members-system.dev 
    ServerAlias admin.yii2-members-system.dev 
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/yii2-members-system/backend/web" 
    ErrorLog "logs/admin.yii2-members-system.dev-error_log" 
    CustomLog "logs/admin.yii2-members-system.dev-access_log" common 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName yii2-members-system.dev 
    ServerAlias users.yii2-members-system.dev 
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/yii2-members-system/frontend/web" 
    ErrorLog "logs/users.yii2-members-system.dev-error_log" 
    CustomLog "logs/users.yii2-members-system.dev-access_log" common 
</VirtualHost> 
+0

Je pense que c'est un exemple mauvais choisir le modèle Yii2. Pourquoi un modèle avancé? peut-être mieux Yii2 modèle de base + modules? C'est tout ce que vous pourriez faire plus rapidement avec Yii-basic-template. Advanced est choisi lorsque les sessions, les cookies, etc séparation est nécessaire – Rafal

+0

Parce que cela sépare complètement chaque segment: site Web principal, tableau de bord de l'utilisateur, tableau de bord administrateur, API, mailer, etc etc ... Il permet à chaque section de fonctionner 90% indépendant de tous les autres. Si je casse quelque chose dans le tableau de bord d'administration, cela n'affecte généralement pas le tableau de bord de l'utilisateur. Le plus de séparation entre l'utilisateur et le code d'administrateur, le mieux pour la sécurité. - Vous pourriez avoir l'application admin ('backend') en utilisant un autre utilisateur pour la base de données qui a accès à la table d'administration. Donc, si votre exploité, ils ne peuvent pas jouer avec la table d'administration de la section de l'utilisateur. –

Répondre

1

Vous pouvez partager une session entre un sous-domaine ou un domaine principal. Selon la configuration de yii, vous devez configurer comme ci-dessous dans frontend/config/main.php et mainsite/config/main.php.

'request' => [ 
    'csrfParam' => '_csrf-app', 
], 
'user' => [ 
    'identityClass' => 'common\models\User', 
    'enableAutoLogin' => true, 
    'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain'=>'.yii2-members-system.dev', 'path'=>'/'], 
], 
'session' => [ 
    'name' => 'sessionName', 
    'savePath'=> __DIR__ . '/../../sessionTmp' 
], 

Dans cette configuration, le nom de la session, la session chemin de sauvegarde, chemin du cookie d'identité et de domaine doit correspondre avec d'autres sous-domaine de partager session entre deux app yu. Créez un dossier tmp à l'intérieur de votre application et pointez-le sur le chemin de sauvegarde de la session. comme ci-dessus.

J'espère que cela aidera.

+0

Merci, mais je l'ai fonctionné. Le problème était mon «site principal» (habituellement pour les invités car c'est la page d'accueil du site principal) dans AccessControl pour permettre aux invités .. lol duh, ils ne sont pas invités après qu'ils vont à «frontend» et se connecter. Par conséquent, je n'ai pas respecté les règles d'accès parce que je n'étais pas un invité. Retiré cette ligne et boom il a travaillé. --- En passant, vous n'avez pas besoin de définir le 'chemin' ou le' savePath'. La config comme j'ai énuméré ci-dessus fonctionne très bien. –