spring/hibernate-按当前用户id筛选
我的Oracle数据库中有一个表CompanyList:spring/hibernate-按当前用户id筛选,hibernate,spring-mvc,spring-security,Hibernate,Spring Mvc,Spring Security,我的Oracle数据库中有一个表CompanyList: CMP_ID INTEGER -- ID of company CMP_NAME VARCHAR2 -- name of company USR_ID INTEGER -- Foreign key to the USERS table 我的Spring3MVC应用程序都是使用注释配置的,我的POJO也是这样,我的DAO对象(CompanyDao)使用hibernate检索公司列表 公司地址: @Transactional pub
CMP_ID INTEGER -- ID of company
CMP_NAME VARCHAR2 -- name of company
USR_ID INTEGER -- Foreign key to the USERS table
我的Spring3MVC应用程序都是使用注释配置的,我的POJO也是这样,我的DAO对象(CompanyDao)使用hibernate检索公司列表
公司地址:
@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());
}
然后我设置了spring安全性,所以我的所有页面都需要标识
使用当前登录用户会话的用户ID筛选CompanyDao返回的行的最佳方法是什么?简短回答:SecurityContextHolder 稍长一点的回答: 如果作为User_id外键关系的父方的用户实体也实现了UserDetails接口,那么用户实体可以直接在Spring的安全上下文中使用 您可以从DAO层或其上面的层调用SecurityContextHolder.getContext()方法……这并不重要,因为返回的实例将作用于请求的本地线程 然后可以从上下文实例获取UserDetails,将其转换为用户实体,并将其作为命名参数传递给DAO调用
作为一个快速的跟进,我意识到您最初的问题意味着您将按当前存在的方式运行命名查询,然后过滤掉不匹配的公司。您仍然可以通过将与您的公司关联的用户与来自安全上下文的用户进行比较来使用该方法,但一般来说,我不建议使用该方法;向数据库询问您到底需要什么。简短回答:SecurityContextHolder 稍长一点的回答: 如果作为User_id外键关系的父方的用户实体也实现了UserDetails接口,那么用户实体可以直接在Spring的安全上下文中使用 您可以从DAO层或其上面的层调用SecurityContextHolder.getContext()方法……这并不重要,因为返回的实例将作用于请求的本地线程 然后可以从上下文实例获取UserDetails,将其转换为用户实体,并将其作为命名参数传递给DAO调用
作为一个快速的跟进,我意识到您最初的问题意味着您将按当前存在的方式运行命名查询,然后过滤掉不匹配的公司。您仍然可以通过将与您的公司关联的用户与来自安全上下文的用户进行比较来使用该方法,但一般来说,我不建议使用该方法;向数据库询问您到底需要什么。实际上,Spring Security 3可以使用
@PostFilter
注释筛选返回的集合,请参阅
但我认为在您的情况下,当
公司
与用户
存在多对一关系时,Jeff的建议更合适-您应该在查询中添加一个条件,即将findAllCompanies()
替换为FindAllCompaniesForser()
,并在表示层或服务层传递从SecurityContextHolder
提取的userId
作为参数。实际上,Spring Security 3可以使用@PostFilter
注释过滤返回的集合,请参阅
但我认为在您的情况下,当公司
与用户
存在多对一关系时,Jeff的建议更合适-您应该在查询中添加一个条件,即将findAllCompanies()
替换为FindAllCompaniesForser()
,并在表示层或服务层传递从SecurityContextHolder
提取的userId
作为参数
@Entity
@NamedQueries( {
@NamedQuery(name = "findAllCompanies", query = "select myCompany from Company myCompany")})
...
public class Company implements Serializable {
...