工作流Activiti框架中的LDAP組件使用詳解!實現對工作流目錄信息的分布式訪問及訪問控制


Activiti集成LDAP簡介

  • 企業在LDAP系統中保存了用戶和群組信息,Activiti提供了一種解決方案,通過簡單的配置就可以讓activit連接LDAP

用法

  • 要想在項目中集成LDAP,需要在pom.xml中添加activiti-ldap依賴:
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-ldap</artifactId>
  <version>latest.version</version>
</dependency>

用例

  • 集成LDAP有兩大用例:
    • 通過IdentityService進行認證: 使用Activiti Explorer 通過LDAP登錄
    • 獲得用戶的組: 在查詢用戶可以看到哪些任務時非常重要,比如任務分配給一個候選組

配置

  • 集成LDAP是通過向流程引擎配置中的configurators注入 org.activiti.ldap.LDAPConfigurator的實例來實現的
  • 這個類是高度可擴展的: 如果默認的實現不符合用例的話,可以很容易的重寫方法,很多依賴的bean都是可插拔的
<bean id="processEngineConfiguration" class="...SomeProcessEngineConfigurationClass">
        ...
        <property name="configurators">
          <list>
              <bean class="org.activiti.ldap.LDAPConfigurator">

                <!-- Server connection params -->
                <property name="server" value="ldap://localhost" />
                <property name="port" value="33389" />
                <property name="user" value="uid=admin, ou=users, o=activiti" />
                <property name="password" value="pass" />

                <!-- Query params -->
                <property name="baseDn" value="o=activiti" />
                <property name="queryUserByUserId" value="(&(objectClass=inetOrgPerson)(uid={0}))" />
                <property name="queryUserByFullNameLike" value="(&(objectClass=inetOrgPerson)(|({0}=*{1}*)({2}=*{3}*)))" />
                <property name="queryGroupsForUser" value="(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))" />

                <!-- Attribute config -->
                <property name="userIdAttribute" value="uid" />
                <property name="userFirstNameAttribute" value="cn" />
                <property name="userLastNameAttribute" value="sn" />

                <property name="groupIdAttribute" value="cn" />
                <property name="groupNameAttribute" value="cn" />

              </bean>
          </list>
        </property>
    </bean>'

屬性

  • org.activiti.ldap.LDAPConfigurator可配置的屬性:
屬性名 描述 類型 默認值
server LDAP服務器地址 String
port LDAP運行的端口 int
user 連接LDAP使用的賬號用戶名 String
password 連接LDAP使用的密碼 String
initialContextFactory 連接LDAP使用的InitialContextFactory名稱 String com.sun.jndi.ldap.LdapCtxFactory
securityAuthentication 連接LDAP時設置的java.naming.security.authentication屬性值 String simple
customConnectionParameters 可以設置那些沒有對應setter的連接參數,這些屬性用來配置連接池,特定的安全設置等等.所有提供的參數都會用來創建LDAP連接 Map<String,String>
baseDn 搜索用戶和組基於的DN(顯著名稱) String
userBaseDn 搜索用戶基於的DN(distinguished name).如果沒有提供,會使用baseDn String
groupBaseDn 搜索群組基於的DN.如果沒有提供,會使用baseDn String
searchTimeLimit 搜索LDAP的超時時間,單位毫秒 Long 1 h
queryUserByUserId 使用用戶Id搜索用戶的查詢語句:(&(objectClass=inetOrgPerson)(uid={0})), LDAP中所有包含inetOrgPerson類的匹配uid屬性的值都會返回.如果只設置一個查詢無法滿足特定的LDAP設置,可以選擇使用LDAPQueryBuilder, 這樣就會提供比單純使用查詢增加更多功能 String
queryUserByFullNameLike 使用全名搜索用戶的查詢語句:(& (objectClass=inetOrgPerson) (({0}={1})({2}={3})) ),LDAP中所有包含inetOrgPerson類的 匹配first namelast name的值都會返回.注意{0}會替換為firstNameAttribute,{1}和{3}是搜索內容. {2}是lastNameAttribute. 如果只設置一個查詢無法滿足特定的LDAP設置,可以選擇使用LDAPQueryBuilder, 這樣就會提供比單純使用查詢增加更多功能 String
queryGroupsForUser 使用搜索指定用戶的組的查詢語句: (&(objectClass=groupOfUniqueNames)(uniqueMember={0})) ,LDAP中所有包含groupOfUniqueNames類的提供的DN(匹配用戶的DN)是uniqueMember的記錄都會返回.{0}會替換為用戶Id.如果只設置一個查詢無法滿足特定的LDAP設置,可以選擇使用LDAPQueryBuilder, 這樣就會提供比單純使用查詢增加更多功能 String
userIdAttribute 匹配用戶Id的屬性名.這個屬性用來在查找用戶對象時,關聯LDAP對象與Activiti用戶對象之間的關系 String
userFirstNameAttribute 匹配first name的屬性名.這個屬性用來在查找用戶對象時,關聯LDAP對象與Activiti用戶對象之間的關系 String
userLastNameAttribute 匹配last name的屬性名.這個屬性用來在查找用戶對象時,關聯LDAP對象與Activiti用戶對象之間的關系 String
groupIdAttribute 匹配組Id的屬性名.這個屬性用來在查找組對象時,關聯LDAP對象與Activiti組對象之間的關系 String
groupNameAttribute 匹配組名的屬性名.這個屬性用來在查找組對象時,關聯LDAP對象與Activiti組對象之間的關系 String
groupTypeAttribute 匹配組類型的屬性名.這個屬性用來在查找組對象時,關聯LDAP對象與Activiti組對象之間的關系 String
  • 高級屬性: 希望修改默認行為或修改組緩存時使用
屬性名 描述 類型 默認值
ldapUserManagerFactory 設置LDAPUserManagerFactory的自定義實例,如果默認實現不滿足需求 LDAPUserManagerFactory的實例
ldapGroupManagerFactory 設置LDAPGroupManagerFactory的自定義實例,如果默認實現不滿足需求 LDAPGroupManagerFactory的實例
ldapMemberShipManagerFactory 設置LDAPMembershipManagerFactory的自定義實例,如果默認實現不滿足需求.不經常使用因為正常情況下LDAP會自己管理關聯關系 LDAPMembershipManagerFactory的實例
ldapQueryBuilder 設置自定義查詢構造器,如果默認實現不滿足需求.LDAPQueryBuilder實例用在LDAPUserManagerLDAPGroupManager中,執行對LDAP的查詢. 默認實現會使用配置的queryGroupsForUserqueryUserById屬性 org.activiti.ldap.LDAPQueryBuilder的實例
groupCacheSize 組緩存的大小.這是一個LRU緩存,用來緩存用戶的組,可以避免每次查詢用戶的組時,都要訪問LDAP.如果值小於0,就不會創建緩存.默認為-1,所以不會進行緩存 int -1
groupCacheExpirationTime 設置組緩存的過期時間,單位為毫秒.當獲取特定用戶的組時,並且組緩存也啟用,組會保存到緩存中,並使用這個屬性設置的時間:當組在00:00被獲取,過期時間為30分鍾,那么所有在00:30之后進行的查詢都不會使用緩存,而是再次去LDAP查詢.因此,所以在00:00-00:30進行的查詢都會使用緩存 long 1 h
  • 注意: 在使用活動目錄AD,InitialDirContext需要設置為Context.REFERRAL可以通過customConnectionParameters傳遞

Explorer集成LDAP

  • LDAP配置添加到activiti-standalone-context.xml
  • activiti-ldap-jar放到WEB-INF/lib目錄
  • 刪除demoDataGenerator bean, 否則會嘗試插入數據,集成LDAP不允許這么做
  • 添加配置到activiti-ui.contextexplorerApp bean:
<property name="adminGroups">
  <list>
    <value>admin</value>
  </list>
  </property>
  <property name="userGroups">
    <list>
      <value>user</value>
    </list>
</property>
  • 使用你自定義配置替換其中的值:
    • 需要用到的數據是組的Id,通過groupIdAttribute配置
    • 配置會讓admin組下的所有用戶都成為Activiti Explorer的管理員,用戶組也一樣
    • 所有不匹配的組都會當做分配組,這樣任務就可以進行分配


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM