/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.security.manage.service; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.security.core.userdetails.UserCache; import org.springframework.security.core.userdetails.cache.NullUserCache; import com.ewcms.common.message.EwcmsMessageSource; import com.ewcms.security.core.session.EwcmsSessionRegistry; import com.ewcms.security.manage.dao.AuthorityDAOable; import com.ewcms.security.manage.dao.GroupDAOable; import com.ewcms.security.manage.dao.UserDAOable; import com.ewcms.security.manage.model.Authority; import com.ewcms.security.manage.model.Group; import com.ewcms.security.manage.model.User; /** * 权限服务管理实现 * * @author wangwei */ abstract class AbstractService implements MessageSourceAware { private static final Logger logger = LoggerFactory.getLogger(AbstractService.class); protected MessageSourceAccessor messages = EwcmsMessageSource.getAccessor(); @Autowired protected AuthorityDAOable authorityDao; @Autowired protected GroupDAOable groupDao; @Autowired protected UserDAOable userDao; @Autowired(required = false) protected UserCache userCache = new NullUserCache(); @Autowired(required = false) protected EwcmsSessionRegistry sessionRegistry; protected Set<User> getUsersByNames(final Set<String> names)throws UserServiceException{ Set<User> users = new HashSet<User>(); for(Iterator<String> iterator = names.iterator();iterator.hasNext();){ String name = iterator.next(); User user = getUserByUsername(name); users.add(user); } return users; } protected User getUserByUsername(final String name){ User user = userDao.get(name); if(user == null){ throw new UserServiceException( messages.getMessage("AbstractService.userNotFound",new Object[]{name},"Can't found "+ name + " user")); } return user; } protected Set<Authority> getAuthoritiesByNames(final Set<String> names){ Set<Authority> authorities = new HashSet<Authority>(); for(Iterator<String> iterator = names.iterator(); iterator.hasNext();){ String name = iterator.next(); Authority authority = getAuthorityByName(name); authorities.add(authority); } return authorities; } protected Authority getAuthorityByName(final String name){ Authority authority = authorityDao.get(name); if(authority == null){ throw new UserServiceException(messages.getMessage( "AbstractService.authorityNotFound",new Object[]{name},"Can't found "+ name + " authority")); } return authority; } protected Set<Group> getGroupsByNames(final Set<String> names){ Set<Group> groups = new HashSet<Group>(); for(Iterator<String> iterator = names.iterator(); iterator.hasNext();){ String name = iterator.next(); Group group = getGroupByName(name); groups.add(group); } return groups; } protected Group getGroupByName(final String name){ Group group = groupDao.get(name); if(group == null){ throw new UserServiceException(messages.getMessage( "AbstractService.groupNotFound",new Object[]{name},"Can't found "+ name + " group")); } return group; } @Override public void setMessageSource(MessageSource messageSource) { messages = new MessageSourceAccessor(messageSource); } public void setAuthorityDao(AuthorityDAOable dao) { authorityDao = dao; } public void setGroupDao(GroupDAOable dao) { this.groupDao = dao; } public void setUserDao(UserDAOable dao) { this.userDao = dao; } public void setUserCache(UserCache cache) { this.userCache = cache; } public void setSessionRegistry(EwcmsSessionRegistry sessionRegistry) { this.sessionRegistry = sessionRegistry; } /** * 从系统环境中移除过时的用户 * * 用户的属性经过重新设置后,而系统环境中保存的用户信息已经过时,所以需要移除cache和session中的信息,保持信息同步。 * * @param name 用户名 */ protected void removeExpiredUserByUsername(final String name) { userCache.removeUserFromCache(name); if(sessionRegistry == null){ if(logger.isDebugEnabled()){ logger.debug("Can't remove user in session,because sessionRegistry is null"); } return ; } sessionRegistry.removeSessionInformationByUsername(name); } }