写到第12章才出现Liferay的内容,希望可以厚积薄发。

我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作。

原理是继承实现org.activiti.engine.impl.interceptor.SessionFactory

首先继承用户实例,用liferay的用户模型

import org.activiti.engine.impl.persistence.entity.UserEntity;

public class UserImpl extends UserEntity {
private static final long serialVersionUID = -5809624687782521587L; public UserImpl(com.liferay.portal.model.User liferayUser) {
id = String.valueOf(liferayUser.getUserId());
firstName = liferayUser.getFirstName();
lastName = liferayUser.getLastName();
email = liferayUser.getEmailAddress();
}
}

实现管理类UserEntityManager

import java.util.List;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.identity.UserQuery;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.UserQueryImpl;
import org.activiti.engine.impl.persistence.entity.IdentityInfoEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.impl.persistence.entity.UserEntityManager;
import org.springframework.stereotype.Service;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil; @Service("liferayUserManagerSession")
public class LiferayUserManagerSession extends UserEntityManager { private static Log _log = LogFactoryUtil.getLog(LiferayUserManagerSession.class); private LiferayIdentityService liferayIdentityService = new LiferayIdentityService(); @Override
public User createNewUser(String userId) {
_log.error("Method is not implemented"); // TODO
return null;
} @Override
public void insertUser(User user) {
_log.error("Method is not implemented"); // TODO
} @Override
public void updateUser(UserEntity updatedUser) {
_log.error("Method is not implemented"); // TODO
} @Override
public UserEntity findUserById(String userId) {
return liferayIdentityService.findUserById(userId);
} @Override
public void deleteUser(String userId) {
_log.error("Method is not implemented"); // TODO
} @Override
public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
_log.error("Method is not implemented"); // TODO
return null;
} @Override
public long findUserCountByQueryCriteria(UserQueryImpl query) {
_log.error("Method is not implemented"); // TODO
return -;
} @Override
public List<Group> findGroupsByUser(String userId) {
return liferayIdentityService.findGroupsByUser(userId);
} @Override
public UserQuery createNewUserQuery() {
_log.error("Method is not implemented"); // TODO
return null;
} @Override
public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId,
String key) {
_log.error("Method is not implemented"); // TODO
return null;
} @Override
public List<String> findUserInfoKeysByUserIdAndType(String userId,
String type) {
_log.error("Method is not implemented"); // TODO
return null;
} }

其中,最关键的方法是查找人员,重载为:

@Override
public UserEntity findUserById(String userId) {
return liferayIdentityService.findUserById(userId);
}

实现工厂类

import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory; public class LiferayUserManagerSessionFactory implements SessionFactory { @Override
public Session openSession() {
return new LiferayUserManagerSession();
} @Override
public Class<?> getSessionType() {
return LiferayUserManagerSession.class;
} }

实用服务查询类:

import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.UserGroupRole;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portal.service.UserGroupRoleLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil; @Service("liferayIdentityService")
public class LiferayIdentityService {
private static Log _log = LogFactoryUtil.getLog(LiferayIdentityService.class); @Autowired
IdMappingService idMappingService; // Groups public List<Group> findGroupsByUser(String userName) {
try {
// get regular roles
List<Role> roles = RoleLocalServiceUtil.getUserRoles(idMappingService.getUserId(userName)); // conert from site roles to the groups
List<Group> groups = new ArrayList<Group>();
for (Role role : roles) {
GroupImpl groupImpl = new GroupImpl(role);
groups.add(groupImpl);
} // get group roles for specified user
List<UserGroupRole> groupRoles = UserGroupRoleLocalServiceUtil.getUserGroupRoles(idMappingService.getUserId(userName));
for (UserGroupRole groupRole : groupRoles) {
GroupImpl groupImpl = new GroupImpl(groupRole);
groups.add(groupImpl);
} return groups;
} catch (Exception e) {
_log.error("Cannot get list of roles for user: " + userName, e);
return new ArrayList<Group>();
}
} public List<User> findUsersByGroup(long companyId, String groupName) {
return WorkflowUtil.findUsersByGroup(companyId, groupName);
} public Role findRole(long companyId, String groupName) {
// first - try to parse group to identify - it is regular group or org/community group
String[] parsedName = groupName.split("/");
List<com.liferay.portal.model.User> users = null;
List<User> result = new ArrayList<User>(); try {
if (parsedName.length == ) {
// regilar group
Role role = RoleLocalServiceUtil.getRole(companyId, groupName); return role;
} else {
long groupId = Long.valueOf(parsedName[]);
groupName = parsedName[]; if (parsedName.length > ) {
groupName = StringUtils.join(ArrayUtils.subarray(parsedName, , parsedName.length), "/");
} Role role = RoleLocalServiceUtil.getRole(companyId, groupName); return role;
}
} catch (Exception ex) {
_log.warn("Cannot get group users", ex);
return null;
}
} // Users public UserEntity findUserById(String userName) {
try {
com.liferay.portal.model.User liferayUser = UserLocalServiceUtil.getUser(idMappingService.getUserId(userName));
return new UserImpl(liferayUser);
} catch (Exception ex) {
_log.error("Cannot find user " + userName + " : " + ex.getMessage());
return null;
}
} }

非常优雅,不侵入,不破坏,依赖分离,松耦合.

但我感觉这种注入接口还是Openfire的源代码接口(各种供应者interface接口)实现的更加直观和优雅。

接下来是BPM门户开发攻坚关键,一步一步跟着我走,必定会逐渐脉络清晰。

Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成的更多相关文章

  1. Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)

    开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...

  2. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

    hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...

  3. Liferay7 BPM门户开发之17: Portlet 生命周期

    Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...

  4. Liferay7 BPM门户开发之19: 理解Service Builder体系

    Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and ...

  5. Liferay7 BPM门户开发之16: Liferay中用户\站点\组织架构\角色\用户组以及关联关系

    用户 . 站点 . 组织架构 . 角色 . 用户组分别是:Users. Site. Organization. Role. UserGroups Users 用户是Liferay portal中的关键 ...

  6. Liferay7 BPM门户开发之15: Liferay开发体系简介

    Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...

  7. Liferay7 BPM门户开发之8: Activiti实用问题集合

    1.如何实现审核的上级获取(任务逐级审批) 这个是必备功能,通过Spring的注入+Activiti表达式可以很容易解决. 可参考: http://blog.csdn.net/sunxing007/a ...

  8. Liferay7 BPM门户开发之46: 集成Activiti用户、用户组、成员关系同步

    在实际的BPM集成开发过程中,Liferay和Activiti这两个异构的系统之间,用户.组的同步需求非常重要,用来实现签收组的概念,比如指定签收组.会签.抢签都需要用到. Activiti可以通过自 ...

  9. Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)

    第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Lifer ...

随机推荐

  1. springboot注解大全

    springboot注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据 ...

  2. IP路由配置之---------配置PPP

    实验设备:两台华三路由器,两台PC,一条V.35线 PPP是数据链路层的协议,链路层的协议有很多如帧中继fr等 实验一,PAP验证(是一种以明码传送用户名和密码的验证方式) 步骤一,在主验证方设置一个 ...

  3. centos7源码安装heartbeat可能出现的错误以及解决办法

    问题:ipmilan_command.c: In function 'setup_ipmi_conn':ipmilan_command.c:283:2: error: 'sel_alloc_selec ...

  4. Django 表关系

    1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义2.order_by asc desc 1. 表关系的创建- OneToOne student = ...

  5. ToolBar+Drawable实现一个好用的侧滑栏(侧边栏)和工具栏

    先参考下ToolBar的使用和DrawableLayout的使用: 1.主界面布局,主要结构包含一个ToolBar和一个DrawableLayout,DrawableLayout里面有左侧边栏布局和主 ...

  6. vue上线后,背景图片路径错误

    build 下的utils.js中添加配置 if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, public ...

  7. FortiGate 5.2/5.4 SSLVPN建立

    1.定义源IP池 即用户通过sslvpn拨号成功后获取到的IP地址. 2.定义路由地址 即用户通过sslvpn拨号成功后允许获取到的路由表. 3.建立sslvpn portal 4.定义用户和用户组 ...

  8. dump、load和dumps、loads的区别

    dump: 将dict(字典)转换为str(字符串),并写入json文件中. load: 用于从json文件中读取数据 运行结果: dumps: 将dict(字典)转换为str(字符串). 运行结果: ...

  9. 团队项目NABCD分析

    1.卡片分类讨论 我们团队在软件工程课上对准备开发的帮你项目进行激烈的讨论后,得出了两个特点. (1)信息检索 (2)主动推送 之所以得出这两个特点,是因为我们作为学生,平常在校园里面有很多专用群和Q ...

  10. Python学习积累:使用help();打印多个变量;fileno()

    1.使用篇: 1.1如何从help()退出: 直接回车即可! 2.技能篇: 2.1 如何一次性打印多个变量? 多个变量中间使用逗号隔开,且引用变量为%(变量1,变量2,变量3), 2.2fileno( ...