6

工作流Activiti框架中LDAP组件详细解析!实现对工作流目录信息的访问控制

 3 years ago
source link: https://segmentfault.com/a/1190000040168136
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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可配置的属性:
属性名描述类型默认值serverLDAP服务器地址String portLDAP运行的端口int user连接LDAP使用的账号用户名String password连接LDAP使用的密码String initialContextFactory连接LDAP使用的InitialContextFactory名称Stringcom.sun.jndi.ldap.LdapCtxFactorysecurityAuthentication连接LDAP时设置的java.naming.security.authentication属性值StringsimplecustomConnectionParameters可以设置那些没有对应setter的连接参数,这些属性用来配置连接池,特定的安全设置等等.所有提供的参数都会用来创建LDAP连接Map<String,String> baseDn搜索用户和组基于的DN(显著名称)String userBaseDn搜索用户基于的DN(distinguished name).如果没有提供,会使用baseDnString groupBaseDn搜索群组基于的DN.如果没有提供,会使用baseDnString searchTimeLimit搜索LDAP的超时时间,单位毫秒Long1 hqueryUserByUserId使用用户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-1groupCacheExpirationTime设置组缓存的过期时间,单位为毫秒.当获取特定用户的组时,并且组缓存也启用,组会保存到缓存中,并使用这个属性设置的时间:当组在00:00被获取,过期时间为30分钟,那么所有在00:30之后进行的查询都不会使用缓存,而是再次去LDAP查询.因此,所以在00:00-00:30进行的查询都会使用缓存long1 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的管理员,用户组也一样
    • 所有不匹配的组都会当做分配组,这样任务就可以进行分配

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK