防止在 vaadin 中进行 URI 导航

Preventing URI Navigation in vaadin

我正在使用 java 框架 Vaadin 创建 Web 应用程序。这个应用程序有不同的用户级别,当用户登录时,我根据他们的权限级别更改菜单。我遇到的问题是阻止用户通过键入 URI 访问他们不应该访问的页面。例如,如果用户登录到应用程序并且只有查看第一页的权限,他仍然可以通过在浏览器搜索栏中输入第二页的 URI 来访问第二页。

我一直在研究如何阻止 URI 导航,但未能成功找到 Vaadin 中的实现方式。所以我的问题是如何防止 Vaadin 中的 URI 导航?如果您有不同的方法来阻止用户访问他们不应该访问的页面,请随意 post。

到目前为止,我说得很短,我在堆栈溢出上看到的 post 并没有很好地解释它。

到目前为止,这是我的 NavigatorUI class 的样子:

@SpringUI
public class NavigatorUI extends UI {

    public Navigator navigator;
    public static final String LOGIN = "";
    public static final String MAINPAGE = "main";
    public static final String EMPLOYEEPAGE = "employeepage";
    public static final String REGISTERPAGE = "registerpage";
    public static final String ADDEMPLOYEEPAGE = "addemployeepage";
    public static final String ADDEMPLOYERPAGE = "addemployerpage";

    private MainSystem main = new MainSystem();

    @Override
    protected void init(VaadinRequest request) {
        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        layout.setSpacing(true);
        setContent(layout);
        Navigator.ComponentContainerViewDisplay viewDisplay = new Navigator.ComponentContainerViewDisplay(layout);
        navigator = new Navigator(UI.getCurrent(), viewDisplay);
        navigator.addView(LOGIN, new LoginView());
        navigator.addView(MAINPAGE, new MainView());
        navigator.addView(EMPLOYEEPAGE, new EmployeeView());
        navigator.addView(REGISTERPAGE, new RegisterView());
        navigator.addView(ADDEMPLOYEEPAGE, new AddEmployeeView());
        navigator.addView(ADDEMPLOYERPAGE, new AddEmployerView());
        navigator.addViewChangeListener(new ViewChangeListener() {
        @Override
        public boolean beforeViewChange(ViewChangeEvent event) {
          View newView = event.getNewView();
            String newViewString= newView.toString();
            newViewString = newViewString.substring(0,newViewString.length()-9);
            View loginView = new LoginView();
            String loginViewString = loginView.toString();
                    loginViewString = loginViewString.substring(0,loginViewString.length()-9);
            boolean result = true;
            if (newViewString.equals(loginViewString)){
                return result;
            }
            else if (VaadinSession.getCurrent().getAttribute("role").toString().equals("Admin")||VaadinSession.getCurrent().getAttribute("role").toString().equals("Employee")){
                return result;
            }
            else {
            result = false;
            }

            return result;
        }

     @Override
     public void afterViewChange(ViewChangeEvent event) {
     //NO-OP
     }
      });
    }
    }

您将 ViewchangeListener 添加到 Navigator 实例,这会阻止在 beforeViewChange 中导航。

If any listener returns false, the view change is not allowed and afterViewChange() methods are not called.

因此,您通过检查当前用户对事件 newView 的授权来实现该接口。如果你想阻止它,你 return false 在那里。