Я использую EJB прямо перед запросом базы данных, поэтому с помощью Перехватчики Я могу установить схему в контексте EJB, просматривая текущего аутентифицированного пользователя.
Затем, когда я строю менеджер сущностей, я могу установить правильную схему.Таким образом, не указывая схему перед именем таблицы, PostgreSQL будет искать search_path
, чтобы определить, какую схему запрашивать.
<!-- language: lang-java -->
public class Interceptor {
Logger logger = Logger.getLogger(Interceptor.class);
/**
*
* @param ctx is always null before being passed to EJB implementation. We always query database
* for populating context data, making user's session accessible to all EJB implementations
* @return
* @throws Exception
*/
@SuppressWarnings({ "unchecked", "unused" })
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String ejbName = ctx.getMethod().getDeclaringClass().getSimpleName();
String methodName = ctx.getMethod().getName();
Boolean override_schema = false;
String overridden_schema = "";
logger.info("Intercepting " + ejbName + "." + methodName);
if(auth != null) {
UserDetails userDetails = (UserDetails)auth.getPrincipal();
String username = userDetails.getUsername();
Collection<SimpleGrantedAuthority> permList = (Collection<SimpleGrantedAuthority>) auth.getAuthorities();
List<String> permissions = new ArrayList<String>();
for (SimpleGrantedAuthority authority : permList) {
permissions.add(authority.getAuthority());
}
Query query = getMasterEntityManager()
.createNativeQuery(
"SQL for retrieving the schema by the current logged in user");
query.setParameter("username", username);
List<Object[]> result = null; //query.getResultList();
if(result != null) {
logger.info("Interceptor: context set for " + username);
Object[] userObj = result.get(0);
getContext().getContextData().put("username", username);
getContext().getContextData().put("schema_name",(String)userObj[1]);
}
}
return ctx.proceed();
}
}
Затем, когда вы создаете менеджер сущностей, вы можете установитьсхема, которую вы хотите.