Я использую Spring Security и у меня есть страница администратора для редактирования информации о пользователе.Я хочу иметь возможность предоставить или отозвать полномочия на этой странице.Следующие теги флажков работают для отображения существующих прав доступа данного пользователя:
<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:
public Set<GrantedAuthority> getAuthorities() {
return authorities;
}
public void setAuthorities(Set<GrantedAuthority> authorities) {
this.authorities = authorities;
}
Что я делаю не так?