美文网首页
面试工作流!Activiti框架中LDAP组件详解,实现对工作流

面试工作流!Activiti框架中LDAP组件详解,实现对工作流

作者: 攻城狮Chova | 来源:发表于2021-06-12 21:58 被阅读0次
    6f704ea6be6e4e1b8d71ddeed6417d65.jpg

    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的管理员,用户组也一样
      • 所有不匹配的组都会当做分配组,这样任务就可以进行分配

    相关文章

      网友评论

          本文标题:面试工作流!Activiti框架中LDAP组件详解,实现对工作流

          本文链接:https://www.haomeiwen.com/subject/ieoieltx.html