Как получить доступ к HttpSession из собственного источника данных в Spring? - PullRequest
0 голосов
/ 24 декабря 2011

Есть ли способ получить доступ к 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?

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Не размещайте эту логику в источнике данных. Сеанс http и база данных не должны быть связаны.

Вы можете выполнить проверку в HandlerInterceptor или с aspectj, вокруг ваших контроллеров или уровня обслуживания

1 голос
/ 24 декабря 2011

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

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

...