工作流Activiti框架中的LDAP元件使用詳解!實現對工作流目錄資訊的分散式訪問及訪問控制

攻城獅Chova發表於2021-06-12

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的管理員,使用者組也一樣
    • 所有不匹配的組都會當做分配組,這樣任務就可以進行分配

相關文章