Liberty 서버에 제공된 com.ibm.wsspi.security.authorization.jacc.ProviderService
인터페이스를 구현함으로써 J2EE(Java™ Platform, Enterprise Edition)
애플리케이션에 대한 사용자 정의 권한 부여 의사결정을 수행하는 데 필요한
JACC 제공자를 개발할 수 있습니다.
시작하기 전에
기본적으로 애플리케이션에 대한 요청이 처리될 때까지 애플리케이션 모듈 로딩이
연기됩니다. 그러나 애플리케이션이 처리될 준비가 되기 전에 애플리케이션에서 전체 모듈의
보안 제한조건을 처리해야 합니다. 연기되는 모듈 로딩은 사용 안함으로 설정되어야 합니다. 다은은 연기되는 모듈 로딩을 사용 안함으로
설정하는 방법을 보여줍니다.
- WebContainer의 경우:
server.xml 파일에 다음 요소를 설정해야 합니다.
<webContainer deferServletLoad="false"/>
- EJBContainer의 경우:
server.xml 파일에서 다음
특성이 설정되어야 합니다.
<ejbContainer startEJBsAtAppStart="true"/>
참고: 이전 요소가
설정되지 않는 경우 서버 시작 시에 완전한 보안 제한사항 정보가 써드파티 JACC 제공자에게
전파되지 않을 수 있습니다. 따라서 써드파티 JACC 제공자가 올바른 권한 부여 의사결정을
적용하지 않을 수 있습니다.
이 태스크 정보
Java Authorization Contract for Containers 스펙인 JSR 115는
권한 제공자용 인터페이스를 정의합니다. Liberty 서버에서 JACC 제공자를 사용자 기능으로
패키지해야 합니다. 사용자 기능은 com.ibm.wsspi.security.authorization.jacc.ProviderService
인터페이스를 구현해야 합니다.
프로시저
- com.ibm.wsspi.security.authorization.jacc.ProviderService 인터페이스를 구현하는 서비스를 제공하는 OSGi 컴포넌트를 작성하십시오.
ProviderService 인터페이스가 두 메소드를 정의합니다. Liberty 런타임이
java.security.Policy 추상 클래스를 구현하는 정책 클래스의 인스턴스를 검색하기 위해
호출하는 getPolicy 메소드입니다. 또한 Liberty 런타임이
javax.security.jacc.PolicyConfigurationFactory 추상 클래스를 구현하는
PolicyConfigurationFactory 클래스의 인스턴스를 검색하기 위해 호출하는
getPolicyConfigFactory 메소드입니다.
다음 예에서는 OSGi 선언 서비스 어노테이션을 사용합니다.
package com.mycompany.jacc;
import com.mycompany.jacc.MyAuthConfigProvider;
import com.ibm.wsspi.security.authorization.jacc.ProviderService;
import java.security.Policy;
import java.util.Map;
import javax.security.jacc.PolicyConfigurationFactory;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
// The property value of javax.security.jacc.policy.provider which defines the implementation class of Policy and
// javax.security.jacc.PolicyConfigurationFactory.provider which defines the implementation class of PolicyConfigurationFactory, are required for propagating the properties to the Liberty runtime.
@Component(service = ProviderService.class,
immediate = true,
property = {
"javax.security.jacc.policy.provider=com.myco.jacc.MyPolicy",
"javax.security.jacc.PolicyConfigurationFactory.provider="
+ "com.myco.jacc.MyFactoryImpl"
}
)
public class MyJaccProviderService implements ProviderService {
Map<String, String> configProps;
// This method called by the Liberty runtime
// to get an instance of Policy class
@Override
public Policy getPolicy() {
return new myPolicy();
}
// This method called by the Liberty runtime
// to get an instance of PolicyConfigurationFactory class
@Override
public PolicyConfigurationFactory getPolicyConfigurationFactory() {
ClassLoader cl = null;
PolicyConfigurationFactory pcf = null;
System.setProperty(
"javax.security.jacc.PolicyConfigurationFactory.provider",
"com.myco.jacc.MyFactoryImpl");
try {
cl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(
this.getClass().getClassLoader());
pcf = PolicyConfigurationFactory.getPolicyConfigurationFactory();
} catch (Exception e) {
return null;
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
return pcf;
}
@Activate
protected void activate(ComponentContext cc) {
// Read provider config properties here if needed,
// then pass them to the Provider ctor.
// This example reads the properties from the OSGi
// component definition.
configProps = (Map<String, String>) cc.getProperties();
}
@Deactivate
protected void deactivate(ComponentContext cc) {}
}
- JACC 제공자와 함께 컴포넌트를 사용자 기능의 일부인 OSGi 번들에 패키지하십시오.
- 기능이 OSGi 서브시스템 컨텐츠를 포함하는지 확인하십시오.
com.ibm.ws.javaee.jacc.1.5; version="[1,1.0.100)"; location:="dev/api/spec/"
- 기능이 사용자 제품 확장 위치에 설치된 후, 기능 이름으로 server.xml 파일을 구성하십시오. 예를 들어 다음과 같습니다.
<featureManager>
...
<feature>usr:myJaccProvider</feature>
</featureManager>