Анонимный доступ к экранам

По умолчанию для анонимной (неаутентифицированной) сессии доступен только экран логина. Путем создания нового экрана логина в приложении можно добавить на него любую информацию или даже добавить компонент WorkArea и открывать в нем любые экраны системы, если на них есть права у анонимного пользователя. Однако как только пользователь войдет в систему, все экраны, открытые в анонимном режиме, будут закрыты.

Иногда бывает необходимо предоставить некоторые экраны приложения вне зависимости от того, аутентифицирован пользователь в системе или нет. Рассмотрим следующие требования:

  • Когда пользователи открывают приложение, они видят главный экран с боковым меню, доступным для анонимных пользователей.

  • В приложении есть экран Info с некоторой общедоступной информацией. Нажав кнопку Show the Login Screen, пользователи могут перейти к экрану логина и продолжить работу с остальной частью системы как аутентифицированные пользователи.

  • Пользователь может открыть экран Info из главного меню, либо вводом URL в веб-браузере.

Ниже описаны шаги реализации данных требований.

  1. Создайте новый главный экран, используя шаблон Main screen with side menu.

  2. Создайте свой экран, например, 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.
  3. Определите новый пункт меню в меню Application:

    menu.xml
    <item id="anonymousScreen"
          screen="MyAnonymousScreen"
          caption="Info"/>
  4. Создайте ресурсную роль 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();
    }
  5. Назначьте роль AnonymousRole пользователю anonymous в DatabaseUserRepository:

    @Override
    protected void initAnonymousUser(User anonymousUser) {
        Collection<GrantedAuthority> authorities = getGrantedAuthoritiesBuilder()
                .addResourceRole(AnonymousRole.CODE)
                .build();
        anonymousUser.setAuthorities(authorities);
    }
  6. В файле 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
  7. Запустите приложение и убедитесь, что созданный вами экран открывается из главного меню и по ссылке /#anonymous.