spring / hibernate - фильтр по текущему идентификатору пользователя - PullRequest
0 голосов
/ 08 октября 2010

В моей базе данных Oracle есть таблица CompanyList:

CMP_ID INTEGER -- ID of company
CMP_NAME VARCHAR2 -- name of company
USR_ID INTEGER -- Foreign key to the USERS table

У меня все приложение Spring 3 MVC сконфигурировано с использованием аннотаций, а также мои POJO, мои объекты DAO (CompanyDao), использующие hibernate для извлечения дляПример списка компаний.

CompanyDao:

@Transactional
    public Set<Company> findAllCompanys() throws DataAccessException {

        return findAllCompanies(-1, -1);
    }

    @SuppressWarnings("unchecked")
    @Transactional
    public Set<Company> findAllCompanies(int startResult, int maxRows) throws DataAccessException {
        Query query = createNamedQuery("findAllCompanies", startResult, maxRows);
        return new LinkedHashSet<Company>(query.getResultList());
    }

И домен моей компании:

@Entity
@NamedQueries( {
        @NamedQuery(name = "findAllCompanies", query = "select myCompany from Company myCompany")})
...
public class Company implements Serializable {
...

Затем я настраиваю Spring Security, поэтому все мои страницы требуют идентификации.

Каков наилучший способ фильтрации строк, возвращаемых CompanyDao, с использованием идентификатора пользователя текущего сеанса пользователя, вошедшего в систему?

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Краткий ответ: SecurityContextHolder.

Немного более длинный ответ: Если сущность User, которая является родительской стороной отношения внешнего ключа user_id, также реализует интерфейс UserDetails, тогда сущность User может использоваться непосредственно в безопасности Spring.context.

Вы можете вызвать метод SecurityContextHolder.getContext () из вашего уровня DAO или из уровня над ним ... не имеет значения, потому что возвращаемый экземпляр будет ограничен локальным потоком запроса.

Затем вы можете получить UserDetails из экземпляра контекста, привести его к вашей сущности User и передать его в качестве именованного параметра в вызов DAO.

В качестве быстрого наблюдения я понимаю, чтоВаш первоначальный вопрос подразумевал, что вы будете запускать именованный запрос, как он существует в настоящее время, а затем отфильтровывать несоответствующие компании.Вы все еще можете использовать этот подход, сравнивая пользователей, связанных с вашей компанией, с пользователем в контексте безопасности, но в целом я бы не рекомендовал такой подход;спросите базу данных, что именно вам нужно.

1 голос
/ 08 октября 2010

На самом деле Spring Security 3 может фильтровать возвращенные коллекции с аннотацией @PostFilter, см. 15.3.1 @Pre и @Post Annotations .

Но я думаю, что в вашем случае, когда Company имеет отношение «многие к одному» с User, предложение Джеффа более уместно - вы должны добавить условие к запросу, то есть заменить findAllCompanies() на findAllCompaniesForUser() и передать userId, извлеченное из SecurityContextHolder вуровень представления или обслуживания в качестве аргумента.

...