Archiv pro štítek: SAP

Připojení Sun Identity Manageru k SAP Basis

Tento příspěvek stručně informuje o problematice připojení SAPu (testováno na verzi SAP R/3) k Sun Identity Manageru (IdM) a popisuje pár praktických příkladů.

SAP Basis (business application software integrated solution) mimo jiné obsahuje sadu nástrojů pro administraci systému a uživatelů SAPu. Právě druhé zmíněné nás zajímá. Naším cílem je napojení Sun Identity Manageru (IdM), tak abychom pomocí něho mohli spravovat uživatele.

Pro připojení externích programů je v SAPu k dispozici Business Application Programming Interface (BAPI). Funkce tohoto rozhraní můžou být z javy volány přes RFC díky knihovně SAP JCo (Java Connector). Takto knihovna je nyní dostupná ve dvou navzájem nekompatibilních verzích, kterým odpovídají dva různé adaptéry v IdM.

Při použití starší, dvojkové verze knihovny, je potřeba přidat do Custom Resources třídu com.waveset.adapter.SAPResourceAdapter. U novější, trojkové verze, se používá třída com.waveset.adapter.SAPBasisResourceAdapter. Je ještě třeba dodat, že podpora SAPBasisResourceAdapter byla přidána do verze IdM 8.1 až patchem číslo dva. Tím také byl starší adaptér označen jako deprecated a od IdM 9 nebude nadále podporován. Konfigurace adaptéru je velmi podobná, nově je třeba specifikovat Destination Name. To označuje spojení a musí být v rámci JVM jedinečné.

Samotná instalace knihovny a konfigurace adaptéru je dobře dokumentována zde http://docs.sun.com/app/docs/doc/820-6551/giiyg?l=en&a=view

Na straně SAPu je potřeba přidat uživatelovi, přes kterého se IdM připojuje a spravuje uživatele, práva na funkční skupiny. Viz
http://help.sap.com/javadocs/NW04s/current/jc/com/sap/mw/jco/JCO.Repository.html

I po nastavení všech práv uvedených na odkazované stránce může stále docházet k problémům (nejen) z důvodu nedostatečných oprávnění. Proto se hodí možnost nastavit logování činnosti JCO knihovny. Děje se tak na stránce pro editaci resource parametru v polích SAP JCO Trace Level a SAP JCO Trace Directory. Nejvíce mi pomohly soubory after-*.xml, ve kterých je uvedeno, které BAPI funkce byly volány a jaký byl jejich výstup.

S rolemi, které jsou přiřazeny učtu, se pracuje přes atribut activityGroups. V resource schema by mělo být nastaveno mapování activityGroups na ACTIVITYGROUPS. Ve starší verzi adaptéru se dá ještě použít mapování na ACTIVITYGROUPOBJECTS nebo ACTIVITYGROUPS->AGR_NAME (pracuje se pouze s názvy rolí).

Pro ukázku, jak se pracuje s rolemi v případě mapování na ACTIVITYGROUPS, uvedu dva příklady.
Používají se objekty tříd GenericAttribute a GenericObject. Jejich dokumentaci naleznete v adresáři [stazene_idm]/REF/javadoc nebo pro idm7 na http://www-users.york.ac.uk/~jdi500/idm/javadoc/index.html
Jak vypadá struktura atributu activityGroups je vidět na následujícím xmlku.

<GenericAttribute>
  <Object>
    <Attribute name='attribute'>
      <Object>
        <Attribute name='activityGroups'>
          <List>
            <Object name='NAZEV_ROLE11/25/2009'>
              <Attribute name='AGR_NAME' value='NAZEV_ROLE'/>
              <Attribute name='AGR_TEXT' value='Popis role'/>
              <Attribute name='FROM_DAT' value='11/25/2009'/>
              <Attribute name='ORG_FLAG'/>
              <Attribute name='TO_DAT' value='12/31/9999'/>
            </Object>
          </List>
        </Attribute>
      </Object>
    </Attribute>
  </Object>
</GenericAttribute>

1) Získání seznamu názvů rolí, přiřazených konkrétnímu účtu.

<dolist name="role">
    
    <invoke name="get">
        <invoke name="get">
            <ref>accounts[%%RES_SAP%%].activityGroups</ref>
        </invoke>
        <s>activityGroups</s>
    </invoke>
    
    <get>
        <invoke name="getAttributes">
            <ref>role</ref>
        </invoke>
        <s>AGR_NAME</s>
    </get>
    
</dolist>

2) Vytvoření rolí ze seznamu jejich názvu a uložení do atributu.
Pokud se nenastaví hodnoty FROM_DATE a TO_DATE, tak se automaticky doplní na aktuální datum, respektive na 12/31/9999.
Jestliže je nastavit chceme, jednoduše je doplníme do mapy v konstruktoru GenericObjectu uvedené v tomto příkladu.

<defvar name='agListGo'>
    <new class="com.waveset.object.GenericObject" >
        <map>
            <s>activityGroups</s>
            <list />
        </map>
    </new>
</defvar>

<dolist name="name">
    <ref>activityGroupNames</ref>

    <block>
        <invoke name="add">
            <ref>agListGo</ref>
            <s>activityGroups</s>

            <new class='com.waveset.object.GenericObject'>
                <map>
                    <s>AGR_NAME</s>
                    <ref>name</ref>
                </map>
            </new>

        </invoke>
        
    </block>
</dolist>

<setvar name="accounts[%%RES_SAP%%].activityGroups">
    <new class="com.waveset.object.GenericAttribute">
        <ref>agListGo</ref>
    </new>
</setvar>

Dále se ještě může hodit získání seznamu všech dostupných rolí.
K tomu potřebujeme mít nastavena práva na čtení z tabulky AGR_DEFINE.
Role jsou pak získány následujícím kódem.

<invoke name='listResourceObjects' class='com.waveset.ui.FormUtil'>
    <ref>:display.session</ref>
    <s>activityGroups</s>
    <s>%%RES_SAP%%</s>
    <null/>
    <s>true</s> <!-- Pouzivat cache? -->
</invoke>