Wicket授权:根据页面模型授予访问权限

时间:2013-10-08 08:17:24

标签: spring hibernate security spring-security wicket

我正在开发一个相当标准的Web应用程序,包括Wicket,Spring&休眠。我一直在使用wicket-auth-rolesspring-security对用户进行身份验证,现在想要为我的应用程序添加更细粒度的授权。

在我的应用程序中,用户是组的成员,组可以访问我用作wicket IModel对象的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中引发了未被捕获的UnauthorizedActionException。到目前为止,我一直无法捕获此异常,因此它被记录为一个问题,即使它是正常程序流程的一部分。完全组合页面还会在我的页面构造函数和Page#onInitialize中触发一些操作,如果用户可能实际查看页面,我只想运行。

根据用户是否有权访问Model对象,有人可以推荐我更好的方法来限制页面访问吗?

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

1 个答案:

答案 0 :(得分:1)

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