2013-01-08 4 views
0

모든 컨트롤러의 이전 인터셉터에있는 AuthService에서 authenticate() 메서드를 호출하는 필터를 사용하여 사용자 지정 인증 구성표를 구현했습니다. authenticate() 메서드는 groovy.sql.SqlUserCredentialsDataSourceAdapter을 사용하여 데이터베이스에 연결을 시도한 다음 데이터베이스 사용자에게 적절한 역할이 있는지 확인합니다. 데이터베이스는 오라클이며 레거시 ERP의 일부이기 때문에 이것이 인증을 수행 할 수있는 유일한 방법입니다.매초마다 HTTP 500 응답

잘못된 자격 증명으로 요청을 제출할 때 발생하는 문제가 발생합니다. "ORA-01017: invalid username/password; logon denied"을 포함하는 SQLException이 예상대로 발생합니다. 내 try/catch 블록은 catch 및 억제하고 코드는 요청을 거부 할 때 올바르게 진행됩니다. 그러나 다음 요청은 제공된 자격 증명에 관계없이 항상 500 응답의 SQLException을 반환합니다. 왜 그게 뭔지에 대한 모든 아이디어와 그것을 해결하기 위해 할 수있는 일은 무엇입니까?

def authenticate(def username, def password) { 
    def authorized = false 
    Sql sql 

    if (username != null && !username.equals('')) { 
     try { 
      dataSource.setCredentialsForCurrentThread(username, password) 

      sql = Sql.newInstance(dataSource) 
      def row = sql.firstRow("**SQL removed for privacy**") 

      if (row != null && row.has_permission == 1) { 
       authorized = true 
      } 
     } catch (Exception e) { 

     } finally { 
      sql.close() 
     } 
    } 

    return authorized 
} 
+0

게시 된 코드에 오류가 표시되지 않았습니다. 사용자 이름과 비밀번호는 어디에서 왔습니까? 어쩌면 문제가있을 수 있습니다. –

+0

username과 password가 params 맵에서 수집되어 authenticate 메소드에 전달되었습니다. 그것은 프레임 워크가 SQLException을 캡쳐하고 다음 요청까지 저장하는 것으로 보입니다. 그래도 기본 프레임 워크를 충분히 이해할 수는 없습니다. – Stuporman

+0

나는 데이터 소스가 응용 프로그램에 대한 싱글 톤이라고 생각하기 때문에이 잘못된 사용자 이름과 암호를 설정 한 후에 잘못된 사용자 이름과 암호가 연결될 수있는 첫 번째 시도에서 연결을 얻으려고합니다. 따라서 예외가 발생하면 기본 사용자 이름과 암호로 돌아와야합니다. –

답변

1

난 당신이 잘못된 사용자 이름을 설정하고 암호가 유효하지 않은 사용자 이름과 암호를 공격합니다 후 (어떤 장소에 의해) 연결을 얻을 수있는 첫 번째 시도에서 그래서는 dataSource가 응용 프로그램에 대한 싱글 생각합니다.

예외가 발생하면 기본 사용자 이름과 암호로 돌아와야합니다.

+0

위의 코드의 catch 블록에서'dataSource.removeCredentialsFromCurrentThread()'를 호출하면됩니다. – Stuporman