Liberty 프로파일 서버에 제공된 com.ibm.wsspi.security.authorization.jacc.ProviderService 인터페이스를 구현함으로써
Java™™ Platform, Enterprise Edition(J2EE) 애플리케이션에 대한 사용자 정의 권한 부여 의사결정을 수행하는 데 필요한 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
추상 클래스를 구현하는 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;
// 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.mycompany.jacc.MyPolicy",
"javax.security.jacc.PolicyConfigurationFactory.provider
=com.mycompany.jacc.MyPolicyConfigurationFactoryImpl"
}
)
public class MyJaccProviderService implements ProviderService {
// This method called by the Liberty profile runtime
// to get an instance of Policy class
@Override
public Policy getPolicy() {
return new myPolicy();
}
// This method called by the Liberty profile runtime
// to get an instance of PolicyConfigurationFactory class
@Override
public Policy getPolicyConfigurationFactory() {
ClassLoader cl = null;
PolicyConfigurationFactory pcf = null;
System.setProperty(JACC_FACTORY, JACC_FACTORY_IMPL);
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;
}
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 = (MapString, String) cc.getProperties();
}
protected void deactivate(ComponentContext cc) {}
}
- JACC 제공자와 함께 컴포넌트를 사용자 기능의 일부인 OSGi 번들에 패키지하십시오.
- OSGi 서브시스템 컨텐츠인 com.ibm.ws.javaee.jacc.1.5; location:="dev/api/spec/"이 기능에 포함되어 있는지 확인하십시오.
- 기능이 사용자 제품 확장 위치에 설치된 후, 기능 이름으로 server.xml 파일을 구성하십시오. 예를 들어 다음과 같습니다.
<featureManager>
...
<feature>usr:myJaccProvider</feature>
</featureManager>