工作流Activiti框架中的LDAP元件使用詳解!實現對工作流目錄資訊的分散式訪問及訪問控制
阿新 • • 發佈:2021-06-13
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 name和last 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例項用在LDAPUserManager和LDAPGroupManager中,執行對LDAP的查詢. 預設實現會使用配置的queryGroupsForUser和queryUserById屬性 | 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.context的explorerApp bean:
<property name="adminGroups">
<list>
<value>admin</value>
</list>
</property>
<property name="userGroups">
<list>
<value>user</value>
</list>
</property>
- 使用你自定義配置替換其中的值:
- 需要用到的資料是組的Id,通過groupIdAttribute配置
- 配置會讓admin組下的所有使用者都成為Activiti Explorer的管理員,使用者組也一樣
- 所有不匹配的組都會當做分配組,這樣任務就可以進行分配