Фильтрация меню

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Аватара пользователя
svil
Сообщения: 533
Зарегистрирован: 2018.02.12, 22:41

Фильтрация меню

Сообщение svil » 2019.04.21, 17:39

Делала по уроку https://www.youtube.com/watch?v=MTRUjYqZK2c
Мой результат: https://github.com/svil1502/rbac
Три пользователя user, manager, admin.
Таблица post. User может просматривать, manager - редактировать, admin - вход в модуль rbac.
Соответственно для user - маршрут /post/* , manager /admin/*, admin /rbac/*
Нужно чтобы если зашел user - он видит только свой пункт меню post/index, если manager - /admin/post/index,post/index,
admin - /rbac/*,/admin/post/index,post/index,
Пока работает только view/layout/admin.php для manager, то есть фильтрация для manager и admin работает.
Но если я пытаюсь использовать use mdm\admin\components\Helper для main.php исчезает login и logout
Как сделать для main.php фильтрацию?
admin.php

Код: Выделить всё

<?php

/* @var $this \yii\web\View */
/* @var $content string */

use app\widgets\Alert;
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
use mdm\admin\components\Helper;


AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>

<div class="wrap">
    <?php
    $menuItems=[
      //  ['label' => 'Главная', 'url' => ['/admin/default/index']],
        ['label' => 'Посты для редактирования', 'url' => ['/admin/post/index']],
        ['label' => 'Пользователи', 'url' => ['/rbac/default/index']],
        ['label' => 'Главная', 'url' => ['/site/index']],
        ['label' => 'Посты просмотр', 'url' => ['/post/index']],
        //  ['label' => 'About', 'url' => ['/site/about']],
        // ['label' => 'Contact', 'url' => ['/site/contact']],
        ['label' => 'Вход в admin', 'url' => ['/admin']],
        ['label' => 'Вход в rbac', 'url' => ['/rbac']],
        ['label' => 'Регистрация', 'url' => ['/site/signup']],
        ['label' => 'rbac/user', 'url' => ['/rbac/user']],

        Yii::$app->user->isGuest ? (
        ['label' => 'Войти', 'url' => ['/site/login']]
        ) : (
            '<li>'
            . Html::beginForm(['/site/logout'], 'post')
            . Html::submitButton(
                'Выйти (' . Yii::$app->user->identity->username . ')',
                ['class' => 'btn btn-link logout']
            )
            . Html::endForm()
            . '</li>'
        )
    ];
    NavBar::begin([
        'brandLabel' => Yii::$app->name,
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse navbar-fixed-top',
        ],
    ]);
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' => Helper::filter($menuItems),
    ]);
    NavBar::end();
    ?>

    <div class="container">
        <?= Breadcrumbs::widget([
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]) ?>
        <?= Alert::widget() ?>
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; My Company <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
Измененное main.php

Код: Выделить всё

<?php

/* @var $this \yii\web\View */
/* @var $content string */

use app\widgets\Alert;
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
use mdm\admin\components\MenuHelper;


echo Nav::widget([
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id)
]);
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>

<div class="wrap">
    <?php
    $menuItems=[
             ['label' => 'Главная', 'url' => ['/site/index']],
            ['label' => 'Посты', 'url' => ['/post/index']],
            ['label' => 'About', 'url' => ['/site/about']],
            ['label' => 'Contact', 'url' => ['/site/contact']],
            ['label' => 'Вход в admin', 'url' => ['/admin']],
            ['label' => 'Вход в rbac', 'url' => ['/rbac']],
            ['label' => 'Регистрация', 'url' => ['/site/signup']],
            ['label' => 'rbac/user', 'url' => ['/rbac/user']],
            Yii::$app->user->isGuest ? (
            ['label' => 'Войти', 'url' => ['/site/login']]
            ) : (
                '<li>'
                . Html::beginForm(['/site/logout'], 'post')
                . Html::submitButton(
                    'Выйти (' . Yii::$app->user->identity->username . ')',
                    ['class' => 'btn btn-link logout']
                )
                . Html::endForm()
                . '</li>'
            )

            ];
    NavBar::begin([
        'brandLabel' => Yii::$app->name,
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse navbar-fixed-top',
        ],
    ]);
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' =>  MenuHelper::getAssignedMenu(Yii::$app->user->id),

    ]);
    NavBar::end();
    ?>

    <div class="container">
        <?= Breadcrumbs::widget([
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]) ?>
        <?= Alert::widget() ?>
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; My Company <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
main.php без фильтрации

Код: Выделить всё

<?php

/* @var $this \yii\web\View */
/* @var $content string */

use app\widgets\Alert;
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;

AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>

<div class="wrap">
    <?php
    NavBar::begin([
        'brandLabel' => Yii::$app->name,
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse navbar-fixed-top',
        ],
    ]);
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' => [
            ['label' => 'Главная', 'url' => ['/site/index']],
            ['label' => 'Посты', 'url' => ['/post/index']],
            ['label' => 'About', 'url' => ['/site/about']],
            ['label' => 'Contact', 'url' => ['/site/contact']],
            ['label' => 'Вход в admin', 'url' => ['/admin']],
            ['label' => 'Вход в rbac', 'url' => ['/rbac']],
            ['label' => 'Регистрация', 'url' => ['/site/signup']],
            ['label' => 'rbac/user', 'url' => ['/rbac/user']],
            Yii::$app->user->isGuest ? (
            ['label' => 'Войти', 'url' => ['/site/login']]
            ) : (
                '<li>'
                . Html::beginForm(['/site/logout'], 'post')
                . Html::submitButton(
                    'Выйти (' . Yii::$app->user->identity->username . ')',
                    ['class' => 'btn btn-link logout']
                )
                . Html::endForm()
                . '</li>'
            )
        ],
    ]);
    NavBar::end();
    ?>

    <div class="container">
        <?= Breadcrumbs::widget([
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]) ?>
        <?= Alert::widget() ?>
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; My Company <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

Аватара пользователя
svil
Сообщения: 533
Зарегистрирован: 2018.02.12, 22:41

Re: Фильтрация меню

Сообщение svil » 2019.04.23, 13:35

Решила вопрос в NavBar. Если входит юзер с правами входа в админку (manager, admin: adminAccess) , появляется пункт меню Вход в админку.
Остальным пользователям - гостям и User этот пункт меню не открывается.

Код: Выделить всё

 <?php
    NavBar::begin([
        'brandLabel' => Yii::$app->name,
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse navbar-fixed-top',
        ],
    ]);
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' => [
            ['label' => 'Главная', 'url' => ['/site/index']],
            ['label' => 'Посты', 'url' => ['/post/index']],
            ['label' => 'Регистрация', 'url' => ['/site/signup']],

            Yii::$app->user->isGuest ? (
            ['label' => 'Войти', 'url' => ['/site/login']]
            ) : (
                '<li>'
                . Html::beginForm(['/site/logout'], 'post')
                . Html::submitButton(
                    'Выйти (' . Yii::$app->user->identity->username . ')',
                    ['class' => 'btn btn-link logout']
                )
                . Html::endForm()
                . '</li>'
            )
        ],
    ]);
    if (Yii::$app->user->can('adminAccess')) {
        $rightNavbar[] = ['label' => 'Вход в админку', 'url' => ['/admin']];
    }
    else
    {
        $rightNavbar[] = ['label' => ' ', 'url' => ['#']];
    }

    echo Nav::widget([
        'options' => ['class' => 'nav navbar-nav navbar-right'],
        'encodeLabels' => false,
        'items' => $rightNavbar,
    ]);

    NavBar::end();
    ?>

urichalex
Сообщения: 948
Зарегистрирован: 2015.08.07, 11:03

Re: Фильтрация меню

Сообщение urichalex » 2019.04.23, 15:22

Код: Выделить всё

['label' => 'Главная', 'url' => ['/site/index'], 'visible' => Yii::$app->getUser()->can('admin')],

Аватара пользователя
svil
Сообщения: 533
Зарегистрирован: 2018.02.12, 22:41

Re: Фильтрация меню

Сообщение svil » 2019.04.23, 15:44

Элегантно. Спасибо.

Код: Выделить всё

  ['label' => 'Вход в админку', 'url' => ['/admin'],'visible' => Yii::$app->getUser()->can('adminAccess')],
          

Ответить