Страницы для неавторизованных пользователей

Возникла задача сделать информационную страницу для неавторизованных пользователей, на которую бы выводились основные сведения по заведенным в систему сущностям.
Есть ли какой-то правильный способ добавить такую страницу? Пока в голову приходит только вынесение этой информации на страницу входа, а для получения сущностей использовать SystemAuthenticator, но возможно есть какой-то способ покрасивее?

Посмотрите вот этот раздел документации: Anonymous Access to Screens :: Документация Jmix
Правда он пока только на английском.
Но там есть пример создания экрана для анонимных пользователей, включая создание роли для анонимных пользователей.

Добрый день.

В Jmix 1.5 все работает по инструкции Анонимный доступ к экранам :: Документация Jmix. За это отдельное спасибо! (Есть версия на русском и на английском)

Демо на 1.5 (работает) – пример выложил на ссылке GitHub - arkshutov/JMix15TestAnonymous: JMix 1.5 Test Anonymous Screen

А вот в Jmix 2.1.0, что-то не получается. В настоящий момент раздел документации отсуствует

Демо на 2.1.0 (не работает) выложил по ссылке GitHub - arkshutov/JMix20TestAnonymous: JMix 2.1.0 Test Anonymous Screen

Что сделал в демо для версии 2.1.0:

  1. Сценарий такой-же, как в документации на 1.5

  2. Main screen with side menu создать не получилось, в мастере нет такого пункта. Создал MyAnonymousView на основе BlankView

  3. Создал свой экран, например, MyAnonymousScreen, с некоторой информацией для анонимных пользователей и кнопкой, открывающей экран логина:

  4. my-anonymous-screen.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://myAnonymousView.title">
    <layout>
        <vbox spacing="true">
            <label value="Some information for anonymous users" stylename="h1"/>
            <button id="showLoginScreenBtn" text="Show the Login Screen"/>
        </vbox>
    </layout>
</view>
  1. MyAnonymousScreen.java
@Route(value = "anonymous", layout = MainView.class)
@ViewController("MyAnonymousView")
@ViewDescriptor("my-anonymous-view.xml")
 public class MyAnonymousView extends StandardView {
     @Autowired
     private ViewNavigators viewNavigators;
 
     @Subscribe(id = "showLoginScreenBtn", subject = "clickListener")
     public void onShowLoginScreenBtnClick(final ClickEvent<JmixButton> event) {
 
         viewNavigators.view(LoginView.class)
                 .withBackwardNavigation(true)
                 .navigate();
     }
 }
  1. Соответственно, заменил Screen на View и вместо screens.create написал viewNavigators.view

  2. Определил новый пункт меню в меню Application

<menu id="application" title="msg://com.company.jmix20testanonymous/menu.application.title" opened="true">
    <item view="User.list" title="msg://com.company.jmix20testanonymous.view.user/UserListView.title"/>
    <item id="anonymousView" view="MyAnonymousView"
          title="MyAnonymousView"/>
</menu>

Тут тоже заменил Screen на View

  1. Создал ресурсную роль AnonymousRole и дал ей доступ к MyAnonymousScreen
@ResourceRole(name = "AnonymousRole", code = AnonymousRole.CODE, scope = "UI")
public interface AnonymousRole {
    String CODE = "anonymous-role";

    @MenuPolicy(menuIds = {"anonymousView"})
    @ViewPolicy(viewIds = {"MainScreenSideMenu", "MyAnonymousView"})
    void views();

    @ViewPolicy(viewIds = "LoginView")
    @SpecificPolicy(resources = "ui.loginToUi")
    void login();
}
  1. Назначил роль AnonymousRole пользователю anonymous в DatabaseUserRepository:
@Override
protected void initAnonymousUser(final User anonymousUser) {
    Collection<GrantedAuthority> authorities = getGrantedAuthoritiesBuilder()
            .addResourceRole(AnonymousRole.CODE)
            .build();
    anonymousUser.setAuthorities(authorities);
}
  1. В файле application.properties включил анонимный доступ и укажите, какой экран отображается для анонимного пользователя:
# enable anonymous access
jmix.ui.allow-anonymous-access=true
# initial screen for anonymous user
jmix.ui.initial-view-id=MyAnonymousView

После авторизации все работает. Ссылка в меню, переход по URL, нажатие на кнопку и переход на LoginView

Без авторизации не переходит на ссылку http://localhost:8080/anonymous, вместо этого, показывает окно авторизации

Где-то не прописалась роль … Подскажите, пожалуйста, как можно исправить?
Заранее большое спасибо!

С 2.1 не подскажу, пока не разбирался с этой версией.
В Jmix 1.5 пример анонимного доступа описан для классического UI, а в 21 только FlowUI.
Ваш тестовый проект, посмотрел, запустил.
С тем как во FlowUI сделать два разных главных экрана и надо ли это делать для сценария анонимного доступа во FlowUI - вопрос.
Но до этого и дело не доходит. Такое впечатление, что @Route(value = "anonymous") и jmix.ui.allow-anonymous-access=true не подхватываются т.к. http://localhost:8080/anonymous открывается http://localhost:8080/login и стандартный экран логина.

Подозреваю, что для FlowUI анонимный доступ еще не готов или реализуется чуть иначе.
Тут надо чтобы кто-то из команды Jmix прокомментировал. @shchienko?

Добрый день, Андрей

Большое спасибо!
Лучший способ понять самому – попробовать объяснить, что не работало :wink:

Разобрался. Решение оказалось крайне элегантным – использовать аннотацию

@AnonymousAllowed

из Vaadin 23 после аннотации

@Route

Документация есть по ссылке Enabling Security | Security | Vaadin 23 Docs
Проект перезалил в GitHub (ссылка выше) – теперь все работает и для 2.1

С уважением, Аркадий

1 симпатия

Добрый день,

Вы правы, для создания анонимного экрана необходимо указать аннотацию @AnonymousAllowed.

Пример создания анонимного экрана:

С Уважением,
Никита

1 симпатия