2011-08-03 3 views
3

현재 사용자의 계정으로 데이터베이스에 로그인하고 싶습니다. 계정 정보를 응용 프로그램 서버의 JDBC 연결로 전달하는 솔루션이 있습니까?응용 프로그램 서버에 JDBC 용 단일 로그인 솔루션이 있습니까?

+0

이 데이터베이스입니다? AFAIK에는 일반적인 솔루션이 없습니다. 대부분의 솔루션은이를 지원하기 위해 기본 데이터베이스 서버에 의존합니다. 예를 들어 오라클은 프록시 인증 기능을 통해이를 지원합니다. –

+5

대부분의 사람들은 데이터베이스 계정이 응용 프로그램 사용자 계정과 직접적인 관련이 없음을 선호합니다 ... – Mikaveli

+0

단일 로그온 (LDAP, AD ... 기반) – mKorbel

답변

0
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"); 
} 
// ... 

DB에 연결하는 데 일반적으로 사용자 이름과 암호를 전달해야한다는 것을 알았을 것입니다. 따라서 언제든지 계정 정보를 '전달'할 수 있습니다. '응용 프로그램 서버'에이 용도로 사용할 수있는 솔루션이 있습니까? 누가 알아? 우리는 당신이 사용하는 응용 서버가 무엇 인지도 모릅니다.

당신이 무엇을 달성하려고하는지, 어떤 상황에서 세부 사항을 빠뜨리니까 당신의 질문에 아직 답이 없습니다. 기술, ..) 당신은 해결책을 찾고 있습니다.

데이터베이스의 보안 기능을 사용하는 것에 대해 이야기하고 있지만 특히 성취하려는 것은 아닙니다. 아마도 다른 방법으로는 사용자 계정 (역할 등)을 사용하는 것일 수 있습니다.

일반적으로 '단일 사인온'솔루션에는 계정과 권한 등을 제어하는 ​​별도의 메커니즘이 필요합니다. 하나를 선택하는 것은 다시 사용할 다른 시스템 (app-server, db, ..)에 의해 영향을받습니다.

  • softwaremag.com article
  • oracle article
  • msdn article
    • ... (그건 당신이 개발하고 무엇 제공) 웹 애플리케이션 보안에 대한 기사

    봐, 인증 및 권한 부여. (위의 링크는 구식이지만 여전히 중요한 정보를 보유하고있을 수 있습니다.)

    확실히 보안을 심각하게 생각하십시오.

    건배, 빔

    (언급을 구함하지만 예상보다 더 큰 의견을 밝혀졌다) 당신은 데이터 소스 #의 getConnection에 사용자 이름/암호 (문자열 이름, 문자열 암호)를 통과 할 수

    +0

    내 질문을 뒤집을 수도 있습니다. 데이터베이스 계정으로 응용 프로그램 서버에 로그인하고이 계정에 대한 연결을 받으려합니다. 샘플에서는 비밀번호를받는 방법을 설명하지 않았습니다. 그것은 현재 로그인으로 암호없이 데이터베이스 연결을 만드는 솔루션이어야합니다. – Horcrux7

    +0

    인증 및 권한 부여와 관련하여 몇 가지 기사 및 서적 등을 꼭 읽어야합니다. 여기에 나열된 것들은 이러한 보안 문제에 대해 더 깊이 이해할 수있게 해주 며, 만들고있는 응용 프로그램의 보안을 설계하는 데 도움이됩니다. 나 자신은 전문가는 아니지만 보안 애플리케이션이 자체적으로 일한다는 것을 알고 있으며 "코드의이 작은 부분이나 라이브러리를 구현할 것이고 나도 갈 수있어"라고 생각해서는 안됩니다. – Wivani

    1

    .

    데이터 영역에 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와 연결되지만 필터는보다 구체적인 형식을 사용하여 동일한 개체를 사용합니다. 이것은 다음과 같은 필터가 할 수 있도록하는 것입니다 : 자격 증명 (의 getConnection, 현재의 동안이 무엇

    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 (문자열, 문자열)에 위임합니다)입니다. 귀하의 데이터 계층은 그 차이를 실제로 알 수 없습니다.

    0

    당신이 저지 휴식을 사용하는 경우 당신은 또한 필터 중 하나를 사용할 수 있습니다 :

    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(); 
    } 
    
    관련 문제