我正在使用 Wicket、Spring 和 Hibernate 开发一个相当标准的 Web 应用程序。我一直在使用wicket-auth-roles
和spring-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,所以如果您觉得这些在这种情况下可以提供帮助,请告诉我!