Java tutorial
/** * Copyright © 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.itrus.ca.modules.sys.service; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.ObjectUtils; import org.apache.shiro.SecurityUtils; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.sql.JoinType; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.itrus.ca.common.persistence.Page; import com.itrus.ca.common.security.Digests; import com.itrus.ca.common.service.BaseService; import com.itrus.ca.common.utils.Encodes; import com.itrus.ca.common.utils.EscapeUtil; import com.itrus.ca.common.utils.StringUtils; import com.itrus.ca.modules.sys.dao.MenuDao; import com.itrus.ca.modules.sys.dao.RoleDao; import com.itrus.ca.modules.sys.dao.UserDao; import com.itrus.ca.modules.sys.entity.Menu; import com.itrus.ca.modules.sys.entity.Role; import com.itrus.ca.modules.sys.entity.User; import com.itrus.ca.modules.sys.security.SystemAuthorizingRealm; import com.itrus.ca.modules.sys.utils.UserUtils; /** * ??,????. * @author ThinkGem * @version 2013-5-15 */ @Service @Transactional(readOnly = true) public class SystemService extends BaseService implements InitializingBean { public static final String HASH_ALGORITHM = "SHA-1"; public static final int HASH_INTERATIONS = 1024; public static final int SALT_SIZE = 8; @Autowired private UserDao userDao; @Autowired private RoleDao roleDao; @Autowired private MenuDao menuDao; @Autowired private SystemAuthorizingRealm systemRealm; //-- User Service --// public User getUser(Long id) { return userDao.findOne(id); } public Page<User> findUser(Page<User> page, User user) { DetachedCriteria dc = userDao.createDetachedCriteria(); User currentUser = UserUtils.getUser(); dc.createAlias("company", "company"); if (user.getCompany() != null && user.getCompany().getId() != null) { dc.add(Restrictions.or(Restrictions.eq("company.id", user.getCompany().getId()), Restrictions.like("company.parentIds", "%," + user.getCompany().getId() + ",%"))); } dc.createAlias("office", "office"); if (user.getOffice() != null && user.getOffice().getId() != null) { dc.add(Restrictions.or(Restrictions.eq("office.id", user.getOffice().getId()), Restrictions.like("office.parentIds", "%," + user.getOffice().getId() + ",%"))); } // ???? if (!currentUser.isAdmin()) { dc.add(Restrictions.ne("id", 1L)); } dc.add(dataScopeFilter(currentUser, "office", "")); //System.out.println(dataScopeFilterString(currentUser, "office", "")); if (StringUtils.isNotEmpty(user.getLoginName())) { dc.add(Restrictions.like("loginName", "%" + EscapeUtil.escapeLike(user.getLoginName()) + "%")); } if (StringUtils.isNotEmpty(user.getName())) { dc.add(Restrictions.like("name", "%" + EscapeUtil.escapeLike(user.getName()) + "%")); } dc.add(Restrictions.eq(User.DEL_FLAG, User.DEL_FLAG_NORMAL)); // if (!StringUtils.isNotEmpty(page.getOrderBy())){ // dc.addOrder(Order.asc("company.code")).addOrder(Order.asc("office.code")).addOrder(Order.desc("id")); // } return userDao.find(page, dc); } public User getUserByLoginName(String loginName) { return userDao.findByLoginName(loginName); } public User getUserByIdentityNumber(String identityNumber) { return userDao.findByIdentityNumber(identityNumber); } @Transactional(readOnly = false) public void saveUser(User user) { userDao.clear(); userDao.save(user); systemRealm.clearAllCachedAuthorizationInfo(); // ?Activiti saveActivitiUser(user, user.getId() == null); } @Transactional(readOnly = false) public void deleteUser(Long id) { userDao.deleteById(id); // ?Activiti deleteActivitiUser(userDao.findOne(id)); } @Transactional(readOnly = false) public void updatePasswordById(Long id, String loginName, String newPassword) { userDao.updatePasswordById(entryptPassword(newPassword), id); systemRealm.clearCachedAuthorizationInfo(loginName); } @Transactional(readOnly = false) public void updateUserLoginInfo(Long id, String ip) { userDao.updateLoginInfo(ip, new Date(), id); } /** * ????16?salt?1024 sha-1 hash */ public static String entryptPassword(String plainPassword) { byte[] salt = Digests.generateSalt(SALT_SIZE); byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS); return Encodes.encodeHex(salt) + Encodes.encodeHex(hashPassword); } /** * ?? * @param plainPassword ? * @param password ? * @return ??true */ public static boolean validatePassword(String plainPassword, String password) { byte[] salt = Encodes.decodeHex(password.substring(0, 16)); byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS); return password.equals(Encodes.encodeHex(salt) + Encodes.encodeHex(hashPassword)); } //-- Role Service --// public Role getRole(Long id) { return roleDao.findOne(id); } public Role findRoleByName(String name) { return roleDao.findByName(name); } public List<Role> findAllRole() { User user = UserUtils.getUser(); DetachedCriteria dc = roleDao.createDetachedCriteria(); dc.createAlias("office", "office"); dc.createAlias("userList", "userList", JoinType.LEFT_OUTER_JOIN); dc.add(dataScopeFilter(user, "office", "userList")); dc.add(Restrictions.eq(Role.DEL_FLAG, Role.DEL_FLAG_NORMAL)); dc.addOrder(Order.asc("office.code")).addOrder(Order.asc("name")); return roleDao.find(dc); } @Transactional(readOnly = false) public void saveRole(Role role) { roleDao.clear(); roleDao.save(role); systemRealm.clearAllCachedAuthorizationInfo(); // ?Activiti saveActivitiGroup(role, role.getId() == null); } @Transactional(readOnly = false) public void deleteRole(Long id) { roleDao.deleteById(id); systemRealm.clearAllCachedAuthorizationInfo(); // ?Activiti deleteActivitiGroup(roleDao.findOne(id)); } @Transactional(readOnly = false) public Boolean outUserInRole(Role role, Long userId) { User user = userDao.findOne(userId); List<Long> roleIds = user.getRoleIdList(); List<Role> roles = user.getRoleList(); // if (roleIds.contains(role.getId())) { roles.remove(role); saveUser(user); return true; } return false; } @Transactional(readOnly = false) public User assignUserToRole(Role role, Long userId) { User user = userDao.findOne(userId); List<Long> roleIds = user.getRoleIdList(); if (roleIds.contains(role.getId())) { return null; } user.getRoleList().add(role); saveUser(user); return user; } //-- Menu Service --// public Menu getMenu(Long id) { return menuDao.findOne(id); } public List<Menu> findAllMenu() { return UserUtils.getMenuListWithRole(); } @Transactional(readOnly = false) public void saveMenu(Menu menu) { menu.setParent(this.getMenu(menu.getParent().getId())); String oldParentIds = menu.getParentIds(); // ??parentIds?parentIds menu.setParentIds(menu.getParent().getParentIds() + menu.getParent().getId() + ","); menuDao.clear(); menuDao.save(menu); // ? parentIds List<Menu> list = menuDao.findByParentIdsLike("%," + menu.getId() + ",%"); for (Menu e : list) { e.setParentIds(e.getParentIds().replace(oldParentIds, menu.getParentIds())); } menuDao.save(list); systemRealm.clearAllCachedAuthorizationInfo(); UserUtils.removeCache(UserUtils.CACHE_MENU_LIST); } @Transactional(readOnly = false) public void deleteMenu(Long id) { menuDao.deleteById(id, "%," + id + ",%"); systemRealm.clearAllCachedAuthorizationInfo(); UserUtils.removeCache(UserUtils.CACHE_MENU_LIST); } ///////////////// Synchronized to the Activiti ////////////////// /** * ??Activiti???? */ private static boolean isSynActivitiIndetity = true; public void afterPropertiesSet() throws Exception { // if (isSynActivitiIndetity){ // isSynActivitiIndetity = false; // List<Group> groupList = identityService.createGroupQuery().list(); // List<org.activiti.engine.identity.User> userList = identityService.createUserQuery().list(); // if (groupList.size() == 0 && userList.size() == 0){ // // ?? // Iterator<Role> roles = roleDao.findAll().iterator(); // while(roles.hasNext()) { // Role role = roles.next(); // saveActivitiGroup(role, true); // } // // ?? // Iterator<User> users = userDao.findAll().iterator(); // while(users.hasNext()) { // saveActivitiUser(users.next(), true); // } // } // } } private void saveActivitiGroup(Role role, boolean isNew) { // String groupId = role.getEnname(); // Group group = null; // if (!isNew){ // group = identityService.createGroupQuery().groupId(groupId).singleResult(); // } // if (group == null) { // group = identityService.newGroup(groupId); // } // group.setName(role.getName()); // group.setType(role.getRoleType()); // identityService.saveGroup(group); } public void deleteActivitiGroup(Role role) { // if(role!=null) { // String groupId = role.getEnname(); // identityService.deleteGroup(groupId); // } } private void saveActivitiUser(User user, boolean isNew) { // String userId = ObjectUtils.toString(user.getId()); // org.activiti.engine.identity.User activitiUser = null; // if (!isNew){ // activitiUser = identityService.createUserQuery().userId(userId).singleResult(); // } // // // if (activitiUser == null) { // activitiUser = identityService.newUser(userId); // } else { // List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list(); // for (Group group : activitiGroups) { // identityService.deleteMembership(userId, group.getId()); // } // } // activitiUser.setFirstName(user.getName()); // activitiUser.setLastName(StringUtils.EMPTY); // activitiUser.setPassword(StringUtils.EMPTY); // activitiUser.setEmail(user.getEmail()); // identityService.saveUser(activitiUser); // // ??? // for (Long roleId : user.getRoleIdList()) { // Role role = roleDao.findOne(roleId); // //activiti??? // Group group= identityService.createGroupQuery().groupId(role.getEnname()).singleResult(); // //??? // if(group ==null) { // String groupId = role.getEnname(); // group = identityService.newGroup(groupId); // group.setName(role.getName()); // group.setType(role.getRoleType()); // identityService.saveGroup(group); // } // identityService.createMembership(userId, roleDao.findOne(roleId).getEnname()); // } } private void deleteActivitiUser(User user) { // if(user!=null) { // String userId = ObjectUtils.toString(user.getId()); // identityService.deleteUser(userId); // } } ///////////////// Synchronized to the Activiti end ////////////////// }