Существует ли решение единого входа для JDBC на сервере приложений? - PullRequest
3 голосов
/ 03 августа 2011

Я хочу войти в базу данных с учетной записью текущего пользователя.Есть ли решение для пересылки информации об учетной записи в соединение JDBC на сервере приложений?

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Вы можете передать имя пользователя / пароль в DataSource # getConnection (String username, String password).

Независимо от того, используете ли вы Spring для своего уровня данных, вы можете использовать класс UserCredentialsDataSourceAdapter, чтобы позволить вам установитьтекущее имя пользователя / пароль в текущей теме.Например:

<jee:jndi-lookup id="myRealDataSource" jndi-name="jdbc/MyDataSource"/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter">
  <property name="targetDataSource" ref="myRealDataSource"/>
  <property name="username">${default.username}</property>
  <property name="password">${default.password}</property>
</bean>

В своем коде, где у вас есть доступ к имени пользователя / паролю (возможно, внутри фильтра сервлетов), вы можете установить имя пользователя и пароль для текущего потока, а затем очистить его после этого.,Ваш фильтр будет иметь ссылку на источник данных UserCredentialsDataSourceAdapter с типом UserCredentialsDataSourceAdapter.Таким образом, ваш DAO будет связан с типом источника данных DataSource, тогда как фильтр использует тот же объект, используя его более конкретный тип.Это позволяет фильтру выполнять следующие действия:

private UserCredentialsDataSourceAdapter userCredentialsDataSourceAdapter
void doFilter(ServletRequest request,
              ServletResponse response,
              FilterChain chain)
              throws IOException,
                     ServletException {

  String username, password; // retrieve from the request or cache
  userCredentialsDataSourceAdapter.setCredentialsForCurrentThread(username, password);

  try {
    chain.doFilter();
  } finally {
    userCredentialsDataSourceAdapter.removeCredentialsFromCurrentThread();
  }
}

В то время как учетные данные являются текущими, getConnection () делегирует getConnection (String, String) с указанными учетными данными.Ваш слой данных действительно не будет знать разницу.

0 голосов
/ 20 июля 2016

Если вы используете Джерси отдых, вы также можете использовать один из фильтров:

public class PoweredByResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
        throws IOException {

        final SecurityContext securityContext =
                containerRequestContext.getSecurityContext();
        if (securityContext != null) {
            // Dummy values
            userCredentialsDataSourceAdapter.setUsername("test");
            userCredentialsDataSourceAdapter.setPassword("test");
        }
    }
}

А когда вы получите ответ, удалите его снова:

@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
    userCredentialsDataSourceAdapter.removeCredentialsFromCurrentThread();
}
0 голосов
/ 12 августа 2011
public void connectToAndQueryDatabase(String username, String password) {

Connection con = DriverManager.getConnection
("jdbc:myDriver:myDatabase", username, password);

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
}
// ...

Полагаю, вы знали, что установка соединения с БД обычно включает передачу имени пользователя и пароля.Таким образом, в любой момент у вас есть возможность «переслать» информацию учетной записи, как вы ее указали.Есть ли у «сервера приложений» готовое решение для этого?Кто знает?Мы даже не знаем, какой сервер приложений вы используете ..

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

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

И, как правило, решение «единого входа» включает отдельный механизм для контроля учетных записей и прав и т. Д.Выбор одной из них снова зависит от того, какие другие системы (app-server, db, ..) вы планируете использовать.

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

И, безусловно, серьезно относятся к безопасности.

Cheers, Wim

(Хотелось прокомментировать, но получилоськомментарий больше, чем ожидалось)

...