Closed mindochin closed 9 years ago
Подсказка в вашем вопросе: если один и тот-же модуль в одном приложении ведет себя так, а в другом иначе - значит чем-то различаются конфиги этих приложений. Посмотрите внимательно на то, как настроен компонент User в бекенд и фронт-приложении. Скорее всего нужно прописать loginUrl для фронта. Редирект на страницу логина происходит в методе loginRequired класса yii\web\User. Если такое поведение нужно не для всех action, а только для некоторых можно использовать denyCallback (анонимная функция вида function ($rule, $action)) у AccessControl, и по action решать редиректить или выводить страницу ошибок. Надеюсь мои советы вам помогут. Спасибо за использование моего модуля :)
благодарю. компонент настроен идентично. loginUrl не меняет дела. как я понял, в каждом контроллере надо прописывать что доступ к нему возможен только залогиненным. а ваш модуль чисто только проверяет права невзирая на залогиненость?
Да, вы правы. Мой модуль проверяет права доступа с помощью метода allows класса AccessRule, так же как AccessControl делает это, когда вы прописываете правила в контроллере. Но мой модуль делает это на этапе запроса (request) до того, как контроллер получит управление. Если мой модуль пропустил к контроллеру, дальше управление получает контроллер и правила, прописанные в нем могут запретить или разрешить доступ. Проверку на залогиненность юзера AccessRule делает если в правилах указана роль. Мой модуль для динамических правил не создает правила AccessRule, а проверяет с помощью Yii::$app->user->can(). Потому, что проверяет не то, что у пользователя есть некая роль, а то что доступ к этой странице ему разрешен. Проверки на роль нет, поэтому проверки на залогиненость юзера нет. Т.е да "проверяет права невзирая на залогиненность". Но у незалогиненного юзера не будет прав, т.к для него Yii::$app->user->can() = false, если только у вас нет правил для default role. Можно прописать ['allow' => true, 'roles' => ['@']], в каждом контроллере или же в конфиге поведения для этого модуля.
используются два приложения- backend и frontend. подключил поведение к обоим. если юзер не залогинен, бэкенд выкидывает окошко логина, а фронтенд пишет нет прав (тоже нужно проверять доступ кое-где). можно как-то настроить, чтобы фронтенд тоже показывал окно логина там где нужно?