Возникла задача сделать информационную страницу для неавторизованных пользователей, на которую бы выводились основные сведения по заведенным в систему сущностям.
Есть ли какой-то правильный способ добавить такую страницу? Пока в голову приходит только вынесение этой информации на страницу входа, а для получения сущностей использовать 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.5
-
Main screen with side menu создать не получилось, в мастере нет такого пункта. Создал MyAnonymousView на основе BlankView
-
Создал свой экран, например, MyAnonymousScreen, с некоторой информацией для анонимных пользователей и кнопкой, открывающей экран логина:
-
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>
- 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();
}
}
-
Соответственно, заменил Screen на View и вместо screens.create написал viewNavigators.view
-
Определил новый пункт меню в меню 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
- Создал ресурсную роль 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();
}
- Назначил роль AnonymousRole пользователю anonymous в DatabaseUserRepository:
@Override
protected void initAnonymousUser(final 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-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?
Добрый день, Андрей
Большое спасибо!
Лучший способ понять самому – попробовать объяснить, что не работало
Разобрался. Решение оказалось крайне элегантным – использовать аннотацию
@AnonymousAllowed
из Vaadin 23 после аннотации
@Route
Документация есть по ссылке Enabling Security | Security | Vaadin 23 Docs
Проект перезалил в GitHub (ссылка выше) – теперь все работает и для 2.1
С уважением, Аркадий
Добрый день,
Вы правы, для создания анонимного экрана необходимо указать аннотацию @AnonymousAllowed
.
Пример создания анонимного экрана:
С Уважением,
Никита