package edu.sjtu.infosec.ismp.security; import java.util.HashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springside.modules.security.springsecurity.SpringSecurityUtils; /** * 用户管理类 * * @author <a href="mailto:lianglin1979@sjtu.edu.cn">lianglin</a> * */ // Spring Service Bean的标识. @Component // 默认将类中的所有函数纳入事务管理. @Transactional public class AccountManager { private static Logger logger = LoggerFactory .getLogger(AccountManager.class); private UserDao userDao; /** * 在保存用户时,发送用户修改通知消息, 由消息接收者异步进行较为耗时的通知邮件发送. * * 如果企图修改超级用户,取出当前操作员用户,打印其信息然后抛出异常. */ public void saveUser(User user) { if (isSupervisor(user)) { logger.warn("操作员{}尝试修改超级管理员用户", SpringSecurityUtils.getCurrentUserName()); throw new ServiceException("不能修改超级管理员用户"); } saveUserToDB(user); sendNotifyMessage(user); } // 设置Propagation, 保证在发送通知消息前数据已保存 @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveUserToDB(User user) { userDao.save(user); } /** * 判断是否超级管理员. */ private boolean isSupervisor(User user) { // TODO return true; } /** * 取得用户, 并对用户的延迟加载关联进行初始化. */ public User getLoadedUser(String id) { User user = userDao.get(id); userDao.initUser(user); return user; } /** * 按名称查询用户, 并对用户的延迟加载关联进行初始化. */ public User searchLoadedUserByName(String name) { User user = userDao.findUniqueBy("name", name); userDao.initUser(user); return user; } /** * 取得所有用户, 预加载用户的角色. */ @Transactional(readOnly = true) public List<User> getAllUserWithRole() { List<User> list = userDao.getAllUserWithRoleByDistinctHql(); logger.info("get {} user sucessful.", list.size()); return list; } /** * 获取当前用户数量. */ @Transactional(readOnly = true) public Long getUserCount() { return userDao.getUserCount(); } @Transactional(readOnly = true) public User findUserByLoginName(String loginName) { User user = userDao.findUniqueBy("loginName", loginName); if(user!=null){ String roles = user.getRoleNames(); if(roles != null && roles.trim().length()!=0){ if(roles.indexOf("DomainAdminAll")!=-1){ List<Domain> domains = userDao.getCasecadeDomain(user.getDomains()); if(domains!=null){ user.setDomains(new HashSet<Domain>(domains)); } }else if(roles.indexOf("AdminAll")!=-1){ List<Domain> domains = userDao.getAllDomain(); user.setDomains(new HashSet<Domain>(domains)); }//域本地管理员不用处理 } } return user; } /** * 批量修改用户状态. */ public void disableUsers(List<String> ids) { userDao.disableUsers(ids); } /** * 发送用户变更消息. * * 同时发送只有一个消费者的Queue消息与发布订阅模式有多个消费者的Topic消息. */ private void sendNotifyMessage(User user) { // TODO } @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } }