我正在开发一个相当标准的Web应用程序,包括Wicket,Spring&休眠。我一直在使用wicket-auth-roles
和spring-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,所以如果你觉得这些可以帮助我,请告诉我!
答案 0 :(得分:1)
我觉得你期待一种奇怪的行为。此authz机制旨在防止不安全的直接对象引用漏洞。因此,您不应将其用作“正常程序流程的一部分”。如果你有一些有效的用例,那么这种“hasAccess”失败应该以某种方式处理有效行为,你应该使用一些其他的机制,可能是自定义构建的东西,因为在大多数情况下它将非常特定于你的应用程序。