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;
}
}