Liberty 儲存庫[8.5.5.6 或更新版本]

開發 Java Authorization Contract for Containers (JACC) 授權提供者

您可以開發 JACC 提供者,當 Java™™ Platform, Enterprise Edition (J2EE) 應用程式實作 Liberty 設定檔伺服器中提供的 com.ibm.wsspi.security.authorization.jacc.ProviderService 介面時,就具備了自訂授權決策。

開始之前

依預設,應用程式模組載入會延遲,直到處理發給該應用程式的要求為止,但是,在準備處理該應用程式之前,需要先處理應用程式中整個模組的安全限制。需要停用延遲的模組載入。以下顯示如何停用:
  1. 對於 WebContainer:
    server.xml 檔中,需要設定下列元素:
    <webContainer deferServletLoad="false"/>
  2. 對於 EJBContainer:
    server.xml 檔中,需要設定下列元素:
    <ejbContainer startEJBsAtAppStart="true"/>
註: 如果未設定前述的元素,一旦啟動伺服器,可能不會將完整的安全限制資訊傳送到協力廠商 JACC 提供者。如此一來,協力廠商 JACC 提供者所施行的授權決策不見得正確。

關於這項作業

Java Authorization Contract for Containers 規格 JSR 115 定義了授權提供者的介面。在 Liberty 設定檔伺服器中,必須將 JACC 提供者包裝成一項使用者特性。您的特性必須實作 com.ibm.wsspi.security.authorization.jacc.ProviderService 介面。

程序

  1. 建立 OSGi 元件,以提供用來實作 com.ibm.wsspi.security.authorization.jacc.ProviderService 介面的服務。

    ProviderService 介面定義下列兩個方法:getPolicy(Liberty 設定檔執行時期會呼叫此方法,以擷取用來實作 java.security.Policy 抽象類別之 Policy 類別的實例)和 getPolicyConfigFactory(Liberty 設定檔執行時期會呼叫此方法,以擷取用來實作 javax.security.jacc.PolicyConfigurationFactory 抽象類別之 PolicyConfigurationFactory 類別的實例)。

    下列範例使用 OSGi 宣告式服務註釋:
    @package com.mycompany.jacc;
    
    import com.mycompany.jacc.MyAuthConfigProvider;
    import com.ibm.wsspi.security.authorization.jacc.ProviderService;
    
    // javax.security.jacc.policy.provider 是定義 Policy 的實作類別,// javax.security.jacc.PolicyConfigurationFactory.provider 是定義 PolicyConfigurationFactory 的實作類別,如果要將內容延伸至 Liberty,需要這兩者的內容值。
    
    @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 {
    // Liberty 設定檔執行時期會呼叫此方法,    // 以取得 Policy 類別的實例
        @Override
        public Policy getPolicy() {
            return new myPolicy();
        }
    
        // Liberty 設定檔執行時期會呼叫此方法,    // 以取得 PolicyConfigurationFactory 類別的實例
        @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) {
            // 必要時,會讀取這裡的提供者配置內容,        // 然後傳遞給 Provider。
            // 此範例會讀取 OSGi
            // 元件定義中的內容。
            configProps = (MapString, String) cc.getProperties();
        }
    
        protected void deactivate(ComponentContext cc) {}
    }
  2. 將該元件與您的 JACC 提供者一起包裝成 OSGi 軟體組,成為您使用者特性的一部分。
  3. 確定您的特性包含 OSGi 子系統內容:com.ibm.ws.javaee.jacc.1.5; location:="dev/api/spec/"
  4. 將特性安裝到使用者產品延伸位置之後,利用特性名稱來配置 server.xml 檔。例如:
    <featureManager>
       ...
       <feature>usr:myJaccProvider</feature>
    </featureManager>

指示主題類型的圖示 作業主題

資訊中心條款 | 意見


「時間戳記」圖示 前次更新: 2015 年 6 月 22 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_developing_jacc_auth_provider
檔名:twlp_developing_jacc_auth_provider.html