Анонимный доступ к экранам
По умолчанию для анонимной (неаутентифицированной) сессии доступен только экран логина. Путем создания нового экрана логина в приложении можно добавить на него любую информацию или даже добавить компонент WorkArea
и открывать в нем любые экраны системы, если на них есть права у анонимного пользователя. Однако как только пользователь войдет в систему, все экраны, открытые в анонимном режиме, будут закрыты.
Иногда бывает необходимо предоставить некоторые экраны приложения вне зависимости от того, аутентифицирован пользователь в системе или нет. Рассмотрим следующие требования:
-
Когда пользователи открывают приложение, они видят главный экран с боковым меню, доступным для анонимных пользователей.
-
В приложении есть экран Info с некоторой общедоступной информацией. Нажав кнопку Show the Login Screen, пользователи могут перейти к экрану логина и продолжить работу с остальной частью системы как аутентифицированные пользователи.
-
Пользователь может открыть экран Info из главного меню, либо вводом URL в веб-браузере.
Ниже описаны шаги реализации данных требований.
-
Создайте новый главный экран, используя шаблон Main screen with side menu.
-
Создайте свой экран, например,
MyAnonymousScreen
, с некоторой информацией для анонимных пользователей и кнопкой, открывающей экран логина:my-anonymous-screen.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?> <window xmlns="http://jmix.io/schema/ui/window" caption="Info"> <layout> <vbox spacing="true"> <label value="Some information for anonymous users" stylename="h1"/> <button id="showLoginScreenBtn" caption="Show the Login Screen"/> </vbox> </layout> </window>
Добавьте его контроллеру аннотацию @Route для того, чтобы иметь возможность открывать его по ссылке:
MyAnonymousScreen.java@UiController("MyAnonymousScreen") @UiDescriptor("my-anonymous-screen.xml") @Route(path = "anonymous") (1) public class MyAnonymousScreen extends Screen { @Autowired private Screens screens; @Autowired private UiProperties uiProperties; @Subscribe("showLoginScreenBtn") protected void onShowLoginScreenBtnClick(Button.ClickEvent event) { String loginScreenId = uiProperties.getLoginScreenId(); Screen loginScreen = screens.create(loginScreenId, OpenMode.ROOT); loginScreen.show(); } }
1 Задает адрес экрана. Если экран открыт в окне верхнего уровня (в корне), его адрес будет http://localhost:8080/#anonymous
. -
Определите новый пункт меню в меню Application:
menu.xml<item id="anonymousScreen" screen="MyAnonymousScreen" caption="Info"/>
-
Создайте ресурсную роль
AnonymousRole
и дайте ей доступ кMyAnonymousScreen
иMainScreenSideMenu
:@ResourceRole(name = "AnonymousRole", code = AnonymousRole.CODE) public interface AnonymousRole { String CODE = "anonymous-role"; @MenuPolicy(menuIds = {"anonymousScreen"}) @ScreenPolicy(screenIds = {"MainScreenSideMenu", "MyAnonymousScreen"}) void screens(); @MenuPolicy(menuIds = {"application"}) void commonMenus(); }
-
Назначьте роль
AnonymousRole
пользователю anonymous вDatabaseUserRepository
:@Override protected void initAnonymousUser(User anonymousUser) { Collection<GrantedAuthority> authorities = getGrantedAuthoritiesBuilder() .addResourceRole(AnonymousRole.CODE) .build(); anonymousUser.setAuthorities(authorities); }
-
В файле
application.properties
включите анонимный доступ и укажите, какой экран отображается для анонимного пользователя:# enable anonymous access jmix.ui.allow-anonymous-access=true # initial screen for anonymous user jmix.ui.initial-screen-id=MainScreenSideMenu
Учитывайте, что в вашем приложении будет два основных экрана. Экран по умолчанию будет использоваться для аутентифицированных пользователей, а анонимный – для анонимных:
jmix.ui.main-screen-id=MainScreen jmix.ui.initial-screen-id=MainScreenSideMenu
-
Запустите приложение и убедитесь, что созданный вами экран открывается из главного меню и по ссылке
/#anonymous
.