2

我正在使用 Wicket、Spring 和 Hibernate 开发一个相当标准的 Web 应用程序。我一直在使用wicket-auth-rolesspring-security验证用户,现在想为我的应用程序添加更细粒度的授权。

在我的应用程序中,用户是组的成员,组可以访问我用作 wicketIModel对象的 Hibernate 对象的子集。因此,用户是否可以查看某个页面的决定并不取决于页面路径,而是取决于页面模型。(我见过的大多数 Wicket 授权实现要么授予对 url 的访问权限,要么对其进行限制;它们不对模型对象执行任何检查。)

目前我已经将此限制实现为自定义IAuthorizationStrategy,如下所示:

@Override
public boolean isActionAuthorized(final Component component, final Action action) {
    if (!(component instanceof GenePage))
        // We only check access to the GenePage for now
        return true;

    // Figure out from component what Gene the user is trying to view
    Gene gene = (Gene) component.getDefaultModelObject();
    User user = MySession.get().getUserModel().getObject();
    return geneDAO.hasAccess(user, gene);
}

这个实现的问题是它完全组成了页面并且只Page#onConfigure抛出了一个 uncaught UnauthorizedActionException。到目前为止,我一直无法捕捉到这个异常,因此即使它是正常程序流程的一部分,它也会被记录为问题。完全组合页面还会在我的页面构造函数中触发一些操作,并且Page#onInitialize我只想在用户可能实际查看页面时运行这些操作。

任何人都可以根据用户是否有权访问 Model 对象来向我推荐一种更好的方法来限制页面访问?

使用 Hibernate、Spring、Spring Security、Wicket 和/或 Wicket-Auth-Roles 在堆栈中的任何位置绑定的解决方案将是首选。我知道还有其他 wicket auth-integrations,所以如果您觉得这些在这种情况下可以提供帮助,请告诉我!

4

1 回答 1

1

我觉得你期待一个奇怪的行为。这种 authz 机制旨在防止不安全的直接对象引用漏洞。因此,您不应将其用作“正常程序流程的一部分”。如果您有某种有效的用例,那么这种“hasAccess”故障应该以某种方式与有效行为不同地处理,您应该使用其他一些机制,可能是定制构建的,因为在大多数情况下,它将非常特定于您的应用程序。

于 2013-10-11T19:55:29.100 回答