我正在使用wicket 1.4.9并实现了spring + wicket auth-role并基于页面上的角色使用@AuthorizeInstantiation。我有多个自定义角色。
我已按照此链接实施基础知识: https://cwiki.apache.org/WICKET/spring-security-and-wicket-auth-roles.html
之后我实现了自己的UserDetailsService,从数据库中拥有自己的角色/用户。
现在,如何使用组件(如链接,按钮)对角色施加控制?喜欢 链接A只能由SUPER_USER,DR_MANAGER访问。 (角色来自数据库)。
我这样做了似乎有效,但是这样做的好方法是什么? OrbitWebSession的类型为AuthenticatedWebSession。
@Override
public boolean isVisible() {
if(OrbitWebSession.get().getRoles().hasRole("SUPER_USER")){
return true;
}
return false;
}
感谢。
答案 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了解一些有效的代码。