【问题标题】:authorization on wicket component using wicket auth-role使用 wicket auth-role 对 wicket 组件进行授权
【发布时间】:2011-08-31 17:22:37
【问题描述】:

我正在使用 wicket 1.4.9 并实现了 spring + wicket auth-role 并基于页面上的角色使用 @AuthorizeInstantiation。我有多个自定义角色。

我已经按照这个链接来实现基础知识: https://cwiki.apache.org/WICKET/spring-security-and-wicket-auth-roles.html

之后我实现了自己的 UserDetailsS​​ervice 以从数据库中拥有自己的角色/用户。

现在,如何使用组件(例如,链接、按钮)对角色进行控制?喜欢 链接 A 只能由 SUPER_USER、DR_MANAGER 访问。 (角色来自数据库)。

我已经这样做了,它似乎有效,但这是做到这一点的好方法吗? OrbitWebSession 的类型为 AuthenticatedWebSession。

        @Override
        public boolean isVisible() {
            if(OrbitWebSession.get().getRoles().hasRole("SUPER_USER")){
                return true;
            }
            return false;
        }

谢谢。

【问题讨论】:

  • 您提到角色基于数据库查询。小心在 isVisible() 中进行昂贵的调用。这是一个简单的计算,但请确保所有内容都正确缓存。
  • 好的,请澄清我的困惑,如果我的自定义 AunthenticatedWebSession 覆盖 getRoles() 方法,并且如果此方法从 SecurityContextHolder 获取角色,它从我的 UserDetails 加载角色,它不是缓存吗?还是在每次调用时从我的用户实体中获取所有角色?
  • 我对Spring不熟悉;我只是想确保您的 User 对象已被缓存 - 每次运行此方法时都运行数据库查询会很糟糕。

标签: wicket


【解决方案1】:

始终覆盖 isVisible 是一个很大的痛苦。请查看MetaDataRoleAuthorizationStrategy。你用Action RENDER 和你想允许的角色调用authorize(Component component, Action action, String roles)。这样,只要在您的 Web 应用程序中注册了授权策略,该组件(无论它是什么)都会对其他角色自动隐藏。基本上它和 Holms 的回答是一样的,只是你不需要继承任何东西。

【讨论】:

    【解决方案2】:

    你在正确的轨道上,我唯一会做的改变是:

    @Override
    public boolean isVisible() {
        return super.isVisible() && OrbitWebSession.get().getRoles().hasRole("SUPER_USER");
    }
    

    这样您就不会意外覆盖其默认可见行为,例如在父组件不可见的情况下。

    【讨论】:

    • 这不是我在 Wicket 中所做的方式,其他答案使用标准的 Wicket 授权实现,所以更好地查看它们。
    【解决方案3】:

    使用@AuthorizeAction 注解,您可以控制组件是否基于角色呈现。它非常易于使用,但您必须对要授权的组件进行子类化。

    @AuthorizeAction(action = Action.RENDER, roles = { "SUPER_USER", "DR_MANAGER" })
    class UserAdminPageLink extends BookmarkablePageLink<String> {
       //Implementation…
    }
    add(new UserAdminPageLink("UserAdminPageLink", UserAdminPage.class));
    

    查看Wicket Examples - Authorization 获取一些工作代码。

    【讨论】:

    • 谢谢,我去看看。但是我的应用程序有很多组件需要这个控件。我担心我必须创建太多的子类!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2011-10-02
    • 2012-08-18
    相关资源
    最近更新 更多