Java 인증 및 권한 서비스 권한 부여
Java™ 2 보안 아키텍처는 보안 정책을 사용하여 실행 코드에 부여되는 액세스 권한을 지정합니다. 이 아키텍처는 코드 중심입니다. 권한은 코드가 시작되는 위치, 디지털로 서명되는지 여부 및 코드 작성자를 포함한 코드 특성을 기반으로 부여됩니다. JAAS(Java Authentication and Authorization Service)는 기존 코드 중심 액세스 제어를 새 코드 중심 액세스 제어로 기능 보강합니다. 실행되는 코드 및 코드 실행자를 기반으로 권한이 부여됩니다.
사용자 인증에 JAAS 인증을 사용하는 경우 인증된 사용자를 나타내기 위한 주제가 작성됩니다. 주제는 각 프린시펄이 해당 사용자의 ID를 나타내는 일련의 프린시펄로 구성됩니다. 특정 프린시펄에 정책의 권한을 부여할 수 있습니다. 사용자가 인증되면 애플리케이션이 주제와 현재 액세스 제어 컨텍스트를 연관시킬 수 있습니다. 각 후속 보안 검사 조작에 대해 Java 런타임은 정책이 필요한 권한을 특정 프린시펄에만 부여하는지 여부를 자동으로 판별합니다. 그렇다면 액세스 제어 컨텍스트와 연관되는 주제가 지정된 프린시펄만 포함하는 경우 이 조작은 지원됩니다.
주제 클래스의 정적 doAs 메소드를 호출하고 인증된 제목을 전달한 다음 java.security.PrivilegedAction 또는 java.security.PrivilegedExceptionAction 메소드를 호출하여 제목과 현재 액세스 제어 컨텍스트를 연관시키십시오. doAs 메소드는 제공된 주제와 현재 액세스 제어 컨텍스트를 연관시킨 다음 조치에서 실행 메소드를 호출합니다. 실행 메소드 구현에는 지정된 주제로 실행된 모든 코드가 포함됩니다. 이 조치는 지정된 주제로 실행됩니다.
J2EE(Java 2 Platform, Enterprise Edition) 프로그래밍 모델에서 엔터프라이즈 Bean 또는 서블릿의 EJB(Enterprise JavaBeans) 메소드를 호출하면 이 메소드는 실행 도구 설정에서 판별된 사용자 ID에서 실행됩니다. J2EE 버전 1.4 스펙은 EJB 코드 또는 서블릿 코드 내에 있는 Subject.doAs 조치 블록에서 엔터프라이즈 Bean을 호출할 때 사용할 사용자 ID를 표시하지 않습니다. 논리적 확장은 주제 doAs 조치 블록에서 EJB 메소드를 호출할 때 주제에서 지정되는 적절한 ID를 사용하는 것입니다.
Subject.doAs 조치가 실행 도구 ID 설정을 겹쳐쓰도록 하는 것은 JAAS 프로그래밍 모델과 J2EE 런타임 환경을 통합하는 가장 좋은 방법입니다. 그러나 JAAS 버전 1.0 이상 구현을 Java 2 보안 아키텍처와 통합할 때 JAAS는 SDK(Software Development Kit), Java Technology Edition 버전 1.3 이상에서 문제를 일으킵니다. doPrivileged 호출이 Subject.doAs 조치 블록에서 발생할 때 액세스 제어 컨텍스트와 연관된 주제가 doPrivileged 호출에 의해 중단됩니다. 이 문제점이 정정될 때까지 J2EE 런타임 환경에서 Subject.doAs 조치의 올바른 작동을 보장하기 위해 사용할 수 있는 신뢰할 수 있고 런타임 효율적인 방식이 없습니다.
Subject.doAs(subject, new java.security.PrivilegedAction() {
Public Object run() {
// Subject is associated with the current thread context
java.security.AccessController.doPrivileged( new
java.security.PrivilegedAction() {
public Object run() {
// Subject was cut off from the current
// thread context
return null;
}
});
// Subject is associated with the current thread context
return null;
}
});
이 문제를 해결하기 위해서 WebSphere® Application Server는 이전에 설명된 대로 JAAS 권한을 J2EE EJB 메소드 호출로 확장하기 위한 WSSubject 헬퍼 클래스를 제공합니다. WSSubject 클래스는 주제 클래스에 대한 동일한 서명을 가지는 정적 doAs 및 doAsPrivileged 메소드를 제공합니다. WSSubject.doAs 메소드는 주제를 현재 실행 중인 스레드에 연관시킵니다. 그러면 WSSubject.doAs 및 WSSubject.doAsPrivileged 메소드는 해당 Subject.doAs 및 Subject.doAsPrivileged 메소드를 호출합니다. WSSubject.doAs 및 WSSubject.doAsPrivileged 메소드를 중지하면 원래 신임 정보가 복원되고 실행 중인 스레드와 연관됩니다.
WSSubject 클래스는 주제 오브젝트의 대체가 아닌 EJB 메소드 호출이 문제가 되는 한 일정한 런타임 동작을 보장하기 위한 헬퍼 클래스입니다.
WSSubject.doAs(subject, new java.security.PrivilegedAction() {
Public Object run() {
// Subject is associated with the current thread context
java.security.AccessController.doPrivileged( new
java.security.PrivilegedAction() {
public Object run() {
// Subject was cut off from the current thread
// context.
return null;
}
});
// Subject is associated with the current thread context
return null;
}
});
- WSLoginModuleImpl 인스턴스 및 WSClientLoginModuleImpl 인스턴스에서 생성되는 주제 오브젝트는 WSPrincipal 인터페이스를 구현하는 프린시펄을 포함합니다. WSPrincipal 오브젝트에 getCredential 메소드를 사용하면 WSCredential 인터페이스를 구현하는 오브젝트를 리턴합니다. 주제 인스턴스의 PublicCredentials 목록에서 WSCredential 오브젝트 인스턴스를 찾을 수도 있습니다. getCredential 메소드를 사용하는 대신 PublicCredentials 목록에서 WSCredential 오브젝트를 검색하십시오.
- WSSubject 클래스에 대한 getCallerPrincipal 메소드는 호출자 보안 ID를 나타내는 문자열을 리턴합니다. 이 리턴 유형은 java.security.Principal EJBContext 인터페이스의 getCallerPrincipal 메소드와 다릅니다.
- J2C(Java 2 Connector) DefaultPrincipalMapping 모듈에서 생성되는 주제 오브젝트는 자원 프린시펄 및 PasswordCredentials 목록을 포함합니다. 자원 프린시펄은 RunAs ID를 나타냅니다.