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

本文涉及的产品
访问控制,不限时长
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本片文章介绍了工作流Activiti框架在企业中应用的场景,也就是集成LDAP使用,通过将Activiti框架连接企业的LDAP实现对企业用户和群组信息的管理。文章从用法,用例,配置,属性几个方面分别详细说明了Acitivi集成LDAP使用的具体方式。

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的管理员,用户组也一样
    • 所有不匹配的组都会当做分配组,这样任务就可以进行分配
相关文章
|
4月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
58 3
|
4月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
225 3
|
29天前
|
Serverless 对象存储 人工智能
智能文件解析:体验阿里云多模态信息提取解决方案
在当今数据驱动的时代,信息的获取和处理效率直接影响着企业决策的速度和质量。然而,面对日益多样化的文件格式(文本、图像、音频、视频),传统的处理方法显然已经无法满足需求。
78 4
智能文件解析:体验阿里云多模态信息提取解决方案
|
29天前
|
文字识别 开发者 数据处理
多模态数据信息提取解决方案评测报告!
阿里云推出的《多模态数据信息提取》解决方案,利用AI技术从文本、图像、音频和视频中提取关键信息,支持多种应用场景,大幅提升数据处理效率。评测涵盖部署体验、文档清晰度、模板简化、示例验证及需求适配性等方面。方案表现出色,部署简单直观,功能强大,适合多种业务场景。建议增加交互提示、多语言支持及优化OCR和音频转写功能...
92 3
多模态数据信息提取解决方案评测报告!
|
8天前
|
小程序 前端开发 关系型数据库
uniapp跨平台框架,陪玩系统并发性能测试,小程序源码搭建开发解析
多功能一体游戏陪练、语音陪玩系统的开发涉及前期准备、技术选型、系统设计与开发及测试优化。首先,通过目标用户分析和竞品分析明确功能需求,如注册登录、预约匹配、实时语音等。技术选型上,前端采用Uni-app支持多端开发,后端选用PHP框架确保稳定性能,数据库使用MySQL保证数据一致性。系统设计阶段注重UI/UX设计和前后端开发,集成WebSocket实现语音聊天。最后,通过功能、性能和用户体验测试,确保系统的稳定性和用户满意度。
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
25天前
|
数据采集 XML API
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
|
4月前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
4145 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
4月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
254 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
3月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。

热门文章

最新文章

推荐镜像

更多