【发布时间】:2013-10-15 01:42:21
【问题描述】:
我正在使用 Wicket、Spring 和 Hibernate 开发一个相当标准的 Web 应用程序。我一直在使用wicket-auth-roles 和spring-security 对用户进行身份验证,现在想为我的应用程序添加更细粒度的授权。
在我的应用程序中,用户是组的成员,组可以访问我用作检票口IModel 对象的 Hibernate 对象子集。因此,用户是否可以查看某个页面的决定并不取决于页面路径,而是取决于页面model。 (我见过的大多数 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 中触发一些操作,我只想在用户实际查看该页面时才运行这些操作。
谁能推荐我更好的方法来根据用户是否有权访问模型对象来限制页面访问?
使用 Hibernate、Spring、Spring Security、Wicket 和/或 Wicket-Auth-Roles 在堆栈中的任何位置绑定的解决方案将是首选。我知道还有其他 wicket auth-integrations,所以如果您觉得这些在这种情况下可以提供帮助,请告诉我!
【问题讨论】:
-
刚刚在Spring Domain Object Security上阅读;认为这可能是一个有用的链接,在我致力于可能的实现时包含给其他人。
-
我认为您应该将访问代码放在
isInstantiationAuthorized方法中,而不是在创建组件之前调用它。 -
@polypiel 我曾想过这样做,但在
isInstantiationAuthorized内,我只能访问componentClass,而不是模型对象。您如何建议我从该方法中访问模型对象?
标签: spring hibernate security spring-security wicket