2017-03-13 14 views
1

JAAS (Java Authentication and Authorization) 문서를 읽은 후 JAAS를 사용하여 Java 응용 프로그램에 Kerberos 인증의 간단한 테스트 케이스를 구현하려고했습니다. 내 회사의 AD 서버에 대한 인증을 시도하고 있습니다. 승인되지 않은 액세스를 방지하기 위해 내 애플리케이션에서이를 사용하는 사용자의 사용자 이름을 승인하고 로그인하도록하고 싶습니다.내 JAAS 로그인 컨텍스트를 작성하는 데 내 프로그램이 실패하는 이유는 무엇입니까?

문서 here에 따라 아래 테스트 클래스를 만들었습니다. 이 테스트 클래스는 실행 중에 AuthTest의 복사본을 인스턴스화하는 실행 가능 JAR 내에 포함되어 있습니다 (따라서 생성자 코드가 시작됨). 나는 java -jar TheJar.jar -Djava.security.auth.login.config=auth.conf으로 jar 파일을 실행 중이며 auth.conf 파일은 jar 파일과 동일한 디렉토리에있는 JAAS 로그인 구성 파일입니다.

등급 :

package main.java.***********.auth; 

import com.sun.security.auth.callback.TextCallbackHandler; 
import com.sun.security.auth.login.ConfigFile; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.security.NoSuchAlgorithmException; 
import javax.security.auth.login.*; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.LogManager; 

/** 
* 
* @author 
*/ 
public class AuthTest { 
    static final Logger logger = LogManager.getLogger(); 

    Configuration.Parameters params = null; 
    ConfigFile ConfigObj; 
    TextCallbackHandler handler; 

    public AuthTest(){ 
     //Try to create Login Context 
     LoginContext lc = null; 

     try{ //try #1 
      lc = new LoginContext("TheJar", handler); 
      logger.debug("LoginContext:" + lc.toString()); 
     } 
     catch(LoginException le){ 
      logger.error(le.getMessage()); 
      logger.error(le.getCause()); 
     } 

     //ENSURE Non-null context 
     if (lc == null){ 
      logger.fatal("LOGIN CONTEXT WAS NULL. PROGRAM MUST DIE"); 
      System.exit(-1); 
     } 

     //Try To Login 
     try{ //try #2 
      lc.login(); 
     } 
     catch(LoginException le){ 
      logger.error(le.getMessage()); 
      logger.error(le.getCause()); 
      logger.fatal("Authentication Failed. Shutting Down"); 
      System.exit(-1); 
     } 
    } 
} 

auth.conf :

TheJar { 
    com.sun.security.auth.module.Krb5LoginModule required; 
    }; 

문제, 그러나, lc = new LoginContext("TheJar", handler); 실패하고 그리고 그 아래 catch 블록을 호출하는 것입니다. 자바를 처음 접했을 때, 이전에 어떤 종류의 인증 구성 요소 나 소프트웨어로도 작업 해 본 적이 없다면, 내가 뭘 잘못하고 있는지 확실하지 않습니다. 프로그램은 끝내기를 계속합니다 (예 : 로그인 컨텍스트가 NULL이었습니다. 프로그램이 반드시 죽어야 함). 그래서 # 1 시도가 실패하고 - 언급 한 바와 같이 - lc = new LoginContext 라인이 비난한다고 생각합니다. 여기서 내가 뭘 잘못하고 있니?

또한 내 응용 프로그램이 런타임에 auth.config를 사용하고 있는지 어떻게 알 수 있습니까? (편집 :이 하위 질문에 대한 답변을 알아 냈습니다 : 명령 줄에서 설정 한 java.security.auth.login.config 설정은 실제로 System 속성이므로 다른 모든 System 속성과 마찬가지로 다음을 사용하여 액세스 할 수 있습니다. System.getProperty("java.security.auth.login.config")

답변

1

은 내가 TextCallbackHandler handler를 초기화하는 것을 잊었다.

내가 마지막으로 그립을 왔을 때, 나는이 디버그 메시지에 로그인 오류 원인 (le.getCause)를 출력 할 가정 된 것을 깨달았습니다. 아니나 다를까,

을보고 내 얼굴에 "잘못된 null CallbackHandler가 제공되었습니다."

나는 그것을 전에 보지 못했지만 null을 제공하지 않습니다. (초기화하지 않습니다. d) CallbackHandler에 의해 LoginContext의 작성이 실패하고있었습니다. 다행스럽게도 JAAS에 관한이 보석에 나를 돌 렸습니다. JAAS for human beings

+0

당신은 자신의 대답을 인정하기 위해 체크 표시를 클릭 할 수 있습니다. 그것은 당신이 스스로 검증했기 때문에 그렇게한다면 실제로 더 좋습니다. –

+0

이미 시도했습니다. 2 일을 기다려야한다고 해. –

+1

잊어 버렸습니다. 그것은 사람들이 "게임 시스템을 형성"하는 것을 막기 위해서입니다. 할 일은 없지만 달력에 표시하고 2 일 후에 돌아올 수 있습니다. –