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