Spring и Hibernate: Как изменить права доступа пользователей, используя jsp и флажки - PullRequest
0 голосов
/ 20 октября 2010

Я использую 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;
}

Что я делаю не так?

1 Ответ

0 голосов
/ 20 октября 2010

Это внутреннее ограничение форм 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);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...