Dans mon contrôleur de site j'écris comme ça
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index' ,'call-back'], // add all actions to take guest to login page
'allow' => true,
'roles' => ['@'],
],
],
],
donc, si je passe à l'action d'indexation ou de rappel, je serai redirigé vers la page de connexion. mais je dois le faire pour toute action à chaque contrôleur. Pourriez-vous me dire la meilleure façon de le faire?
Placez cette règle au début de la section rules
:
[
'allow' => true,
'roles' => ['@'],
],
L'omission de actions
signifie toutes les actions.
Ainsi, votre AccessControl
config sera comme ceci:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
// ...
],
],
];
}
Gardez à l'esprit que les règles sont appliquées afin d'être déclarées.
Pour le faire globalement sans héritage, ajoutez le as beforeRequest
tableau ci-dessous (pas à l'intérieur!) la déclaration components
dans la configuration de votre application:
'components' => [ ... ],
'as beforeRequest' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'actions' => ['login'],
],
[
'allow' => true,
'roles' => ['@'],
],
],
'denyCallback' => function () {
return Yii::$app->response->redirect(['site/login']);
},
],
Ce code s'exécutera avant chaque demande et bloquera toutes les actions sauf login
pour les invités.
Assurez-vous qu'il n'y a pas d'action login
dans d'autres contrôleurs que SiteController
. S'il y en a (et par exemple ils sont à des fins différentes), bloquez-les explicitement dans les contrôleurs correspondants. Mais c'est un cas assez rare.
Si vous souhaitez ajouter un contrôle d'accès à toutes vos actions de contrôleur. Veuillez ajouter le code ci-dessous dans le fichier de configuration principal sous la section des composants.
'as access' => [
'class' => \yii\filters\AccessControl::className(),//AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'], // add all actions to take guest to login page
'allow' => true,
'roles' => ['@'],
],
],
],
Si vous omettez complètement la partie "actions
" du tableau, elle sera valable pour toutes les actions du contrôleur.
Si vous voulez le faire pour chaque contrôleur, ajoutez simplement une couche entre les deux:
class MyAccessController extends \yii\web\Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
];
}
}
Et puis dérivez votre controller
de cette classe. Ou vous pouvez le mettre dans un trait
et utiliser l'ajouter avec un use
dans chaque contrôleur.
Essayez ceci dans le fichier suivant.
frontend/config/main.php
components =>[ your stuff ],
'as beforeRequest' =>
[
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
],