使用wicket auth-role授权wicket组件

时间:2011-05-24 07:46:11

标签: wicket

我正在使用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;
        }

感谢。

3 个答案:

答案 0 :(得分:7)

覆盖isVisible一直是一个主要的痛苦。请改为查看MetaDataRoleAuthorizationStrategy。您使用authorize(Component component, Action action, String roles)Action RENDER以及您要允许的角色进行通话。这样,只要在Web应用程序中注册了授权策略,组件就会自动隐藏其他角色。基本上它与霍尔姆斯的答案完全相同,除了你不必任何子类。

答案 1 :(得分:3)

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

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

这样,您不会意外地覆盖其默认的可见行为,例如,如果父组件不可见。

答案 2 :(得分:2)

使用@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了解一些有效的代码。