Wicket授权使用MetaDataKey

时间:2010-04-07 21:14:41

标签: authorization wicket

我正在尝试为我的Wicket应用程序实现一个简单的授权策略。我实现了自己的AuthorizationStrategy(扩展IAuthorizationStrategy)。

http://old.nabble.com/Authorization-strategy-help-td18948597.html 阅读完上述链接后,我认为使用元数据驱动的授权比使用Annotations更有意义。

所以我有一个简单的RoleCheck类

public class RoleCheck {

 private String privilege;

 public RoleCheck(String priv) {
  this.privilege = priv;
 }

 public void setPrivilege(String privilege) {
  this.privilege = privilege;
 }

 public String getPrivilege() {
  return privilege;
 }
}

我添加了一个组件:

public static MetaDataKey<RoleCheck> priv = new MetaDataKey<RoleCheck>() {};
editLink.setMetaData(priv, new RoleCheck("Update"));

在我的授权策略类中,我尝试获取与组件关联的元数据:

public boolean isActionAuthorized(Component component, Action action) {
  if (action.equals(Component.RENDER)) {
      RoleCheck privCheck = (RoleCheck) component.getMetaData(EditControlToolBar.priv);
      if (privCheck != null) {
           ...
      }
}

然而getMetaData给出错误

  

“绑定不匹配:通用方法getMetaData(MetaDataKey<M>)   类型Component不适用于参数   (MetaDataKey<RoleCheck>)。推断类型RoleCheck不是   有效替代有界参数“

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:2)

您的RoleCheck类应该实现Serializable。

你在使用Wicket 1.4吗?在这种情况下,我建议采用这种方式:

public class RolePermissionKey extends MetaDataKey<RoleCheck> {
    public static final RolePermissionKey KEY = new RolePermissionKey();
}

将其添加到组件:

editLink.setMetaData(RolePermissionKey.KEY, new RoleCheck("Update"));

并执行授权:

RoleCheck privCheck = component.getMetaData(RolePermissionKey.KEY)