【问题标题】:Preventing URI Navigation in vaadin在 vaadin 中防止 URI 导航
【发布时间】:2018-05-27 12:43:53
【问题描述】:

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

我正在研究阻止 URI 导航,但未能找到在 Vaadin 中是如何完成的。所以我的问题是如何防止 Vaadin 中的 URI 导航?如果您有其他方法来阻止用户访问他们不认为的页面,请随时发布。

到目前为止,我做得很短,我看到的一篇关于堆栈溢出的帖子并没有很好地解释它。

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

@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
     }
      });
    }
    }

【问题讨论】:

  • 您必须阻止 URL 在两个地方工作:在 UI 中和在处理 UI 的控制器中的服务器端。因此,如果不允许用户查看 URL,则页面会呈现错误消息。
  • 你正在使用Navigator?
  • 是的,使用导航器代码更新帖子

标签: java spring-security uri vaadin


【解决方案1】:

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

如果任何侦听器返回 false,则不允许视图更改,并且不会调用 afterViewChange() 方法。

因此,您可以根据事件的newView 检查当前用户的授权来实现该接口。如果你想阻止它,你可以在那里返回false

【讨论】:

  • 是的,我已经得到它并添加了如下代码,但是我将如何实施检查以查看是否允许该用户查看视图.....我希望任何人都可以看到登录视图但不是主页视图.....我已经使用视图更改侦听器更新了代码。
  • 好吧,你必须实现它。你提到过,你已经为菜单做了。所以这里也一样。
  • 好的,我已经为菜单设置了那个,但是当用户已经进入“角色”的 VaadinSession 属性时......此时我们不知道用户角色为他们还没有登录,所以他们是匿名的……关键是 beforecall 监听器完全阻止我看到登录页面,所以理想情况下,我希望任何人都能看到登录页面,但只有登录的人才能看到查看其他页面...我使用 VaadinSession 作为该会话的角色持有者?对不起,如果这些看起来像骨头问题......每天都是上学日!更新代码...
  • 您允许每个用户访问那里的登录页面。首先检查:if (newView is Login) return true。可能与其他公共视图相同(例如,将它们放在白名单中,对其进行注释,...)
  • 你是唯一一个回答的人,给了我一个很好的答案!我添加了完整的代码来帮助其他人解决问题。我发现的问题是将 Vaadin 视图与将它们分解为字符串值并进行比较的唯一方法进行比较。无论如何,非常感谢老兄的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2014-12-05
  • 2011-02-18
相关资源
最近更新 更多