我正在使用spring security并有一个管理jsp页面来编辑用户详细信息。我希望能够在此页面上授予或撤销权限。以下复选框标记用于显示给定用户的现有权限:
<form:checkboxes path="authorities" items="${roles}" delimiter="<br />" />
其中authorites
是用户实体的属性,${roles}
是模型属性,是所有可能权限的列表。
这适用于GET:如果我在此页面中查询用户,则会列出所有权限,并检查用户拥有的权限。
问题是,如果我对用户的权限进行更改(添加新权限或删除现有权限)并尝试保存,我会收到以下错误:
HibernateSystemException: IllegalArgumentException occurred calling getter of com.ebisent.domain.Authority.id
我可以在调试器中看到Hibernate将Set<GrantedAuthority> authorities
包裹在org.hibernate.collection.PersistentSet
中。 Hibernate不会将新权限添加到我的权限集。相反,它添加一个包含权限的字符串值的新Set。结果是我的权限HashSet(应该只包含GrantedAuthority元素)现在包含LinkedHashSets,其中包含我正在添加的权限的字符串表示。
以下是User.authorities的getter和setter:
public Set<GrantedAuthority> getAuthorities() {
return authorities;
}
public void setAuthorities(Set<GrantedAuthority> authorities) {
this.authorities = authorities;
}
我做错了什么?
答案 0 :(得分:0)
这是HTML表单的固有限制 - 因为HTML表单中的字段值表示为字符串,您需要指示Spring如何从字符串表示重构GrantedAuthority
。它可以按如下方式完成:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(GrantedAuthority.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
GrantedAuthority value = ...;
setValue(value);
}
});
}