匿名访问界面

默认情况下,匿名(未认证)用户会话只能访问 登录界面。通过创建新的登录界面,可以在界面上添加任何信息,甚至添加 WorkArea 组件,然后便能在该组件内为匿名用户打开其他界面。但是一旦用户登录了,所有在匿名模式下打开的界面都会关闭。

有时也许我们需要将某些应用程序的界面呈现给用户而无论用户是否进行登录认证。比如下面这个需求:

  • 当用户打开应用程序,他们能看见为匿名用户准备的带侧边菜单的主界面。

  • 还有一个 Info(信息) 界面,展示公开的信息。点击 Show the Login Screen 按钮,用户可以跳转登录界面,登录后以认证用户的身份继续在系统里操作。

  • 用户可以从主菜单或者直接通过浏览器输入 URL 打开 Info 界面。

下面我们看看实现步骤。

  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 资源角色 并允许访问 MyAnonymousScreenMainScreenSideMenu

    @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. DatabaseUserRepository 中为匿名用户分配 AnonymousRole

    @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 地址。