Есть ли способ получить доступ к HttpSession из WebApplicationContext в пользовательском источнике данных? Я реализовал специальный фильтр обработки аутентификации, который хранит некоторую информацию в HttpSession. Эта информация затем используется источником данных для получения соединения с базой данных.
Другой вариант - использовать SecurityContextHolder для получения токена аутентификации, настроенного для включения дополнительных атрибутов. Я не уверен, что это правильный подход.
Это то, что я имею до сих пор:
public class CustomDataSource extends DriverManagerDataSource implements ApplicationContextAware {
protected Connection getConnectionFromDriverManager(String url,
Properties props) throws SQLException {
// want to use the web context to get the http session
// Authentication has a getAttribute(String name) method
SecurityContext securityContext = SecurityContextHolder.getContext();
CustomAuthenticationToken authentication = (CustomAuthenticationToken) securityContext.getAuthentication();
Object attribute = authentication.getAttribute("db");
// create a connection object here
Object conn = getConnectionFromAttribute(attribute);
return (Connection)conn;
}
private WebApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.context = (WebApplicationContext)applicationContext;
}
}
Обновление
Я определил новый класс с именем AuthInfo, который имеет только имя пользователя и пароль. Затем применил ThreadLocal к статической конечной переменной интерфейса утилиты:
public interface WebUtils{
public static final ThreadLocal<AuthInfo> authInfo = new ThreadLocal<AuthInfo>();
}
Значение ThreadLocal затем устанавливается в методе tryAuthentication фильтра
AuthInfo info = new AuthInfo();
info.setName(username);
info.setPass(password);
WebAttributes.authInfo.set(info);
Теперь в пользовательском источнике данных
protected Connection getConnectionFromDriverManager(String url,
Properties props) throws SQLException {
AuthInfo info = WebAttributes.authInfo.get();
Connection conn = getConnFromAuthInfo(info);
return conn;
}
Разве это не то же самое, что использование SecurityContextHolder и CustomAuthenticationToken?