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

Posted

技术标签:

【中文标题】Wicket 授权:根据页面模型授予访问权限【英文标题】:Wicket authorization: Grant access based on page model 【发布时间】:2013-10-15 01:42:21 【问题描述】:

我正在使用 Wicket、Spring 和 Hibernate 开发一个相当标准的 Web 应用程序。我一直在使用wicket-auth-rolesspring-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,而不是模型对象。您如何建议我从该方法中访问模型对象? 【参考方案1】:

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

【讨论】:

以上是关于Wicket 授权:根据页面模型授予访问权限的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限

身份验证:是否可以使用Devise注册凭据来限制或授予对帖子模型的访问权限?

Postgres:即使授予了授权,也拒绝架构的权限

ASP.NET 登录以授予对特定类型人群的访问权限

IdentityServer4 基于角色的授权

如何根据 vue.js 中的自定义权限授予访问路由的权限?