package com.hehenian.manager.modules.sys.service.impl; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.ConfigAttribute; import org.springframework.security.access.SecurityConfig; import org.springframework.stereotype.Service; import com.hehenian.manager.commons.Constants; import com.hehenian.manager.commons.Pagination; import com.hehenian.manager.modules.sys.dao.AuthorityDao; import com.hehenian.manager.modules.sys.dao.AuthorityResourcesDao; import com.hehenian.manager.modules.sys.dao.ResourcesDao; import com.hehenian.manager.modules.sys.dao.RolesAuthorityDao; import com.hehenian.manager.modules.sys.model.Authorities; import com.hehenian.manager.modules.sys.model.AuthorityResources; import com.hehenian.manager.modules.sys.model.Resources; import com.hehenian.manager.modules.sys.service.AuthorityService; @Service("authorityService") public class AuthorityServiceImpl implements AuthorityService { @Autowired protected AuthorityDao authorityDao; @Autowired protected ResourcesDao resourcesDao; @Autowired protected AuthorityResourcesDao authorityResourcesDao; @Autowired protected RolesAuthorityDao rolesAuthorityDao; private static Map<String, Collection<ConfigAttribute>> resourceMap = null; @Override public int saveAuthority(Authorities authority) { int ret = -1; if (authority.getId() != null) { ret = authorityDao.updateAuthority(authority); } else { ret = authorityDao.addAuthority(authority); } return ret == 1 ? Constants.SUCCESS : Constants.FAIL; } @Override public Pagination<Authorities> getAuthority(Pagination<Authorities> list, String name) { return authorityDao.getAuthorities(list, name); } @Override public Authorities getAuthorities(int id) { return authorityDao.getAuthority(id); } @Override public int deleteOneAuthority(int id) { int ret = authorityDao.deleteAuthority(id); return ret == 1 ? Constants.SUCCESS : Constants.FAIL; } @Override public Pagination<Resources> getResourcesInOrNotAuthority( Pagination<Resources> list, int authorityId, boolean inOrNot) { return inOrNot ? resourcesDao.getResourcesInInAuthority(list, authorityId) : resourcesDao.getResourceNotInAuthority(list, authorityId); } @Override public int addAuthorityResource(AuthorityResources ar) { // int ret=1; int ret = 0; // 数据库没存在关系才加,已经存在了不加 if (!authorityResourcesDao.checkRelationExist(ar)) { ret = authorityResourcesDao.addRelation(ar); // 加入权限访问列表中 Resources res = resourcesDao.getOneResource(ar.getResourceId()); Authorities auth = authorityDao.getAuthority(ar.getAuthorityId()); String url = res.getResourceStr(); /* * 判断资源文件和权限的对应关系,如果已经存在相关的资源url,则要通过该url为key提取出权限集合,将权限增加到权限集合中 。 */ ConfigAttribute ca = new SecurityConfig(auth.getName()); if (resourceMap.containsKey(url)) { Collection<ConfigAttribute> value = resourceMap.get(url); value.add(ca); resourceMap.put(url, value); } else { Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } return ret == 1 ? Constants.SUCCESS : Constants.FAIL; } @Override public int deleteAuthorityResource(AuthorityResources ar) { int ret = authorityResourcesDao.deleteRelationById(ar); return ret == 1 ? Constants.SUCCESS : Constants.FAIL; } @Override public Map<String, Collection<ConfigAttribute>> getResourceMap() { /* * 应当是资源为key, 权限为value。 资源通常为url, 权限就是那些以ROLE_为前缀的角色。 一个资源可以由多个权限来访问。 */ if (resourceMap == null) { resourceMap = new HashMap<String, Collection<ConfigAttribute>>(); List<Authorities> authList = authorityResourcesDao.getAuthorities(); for (Authorities auth : authList) { ConfigAttribute ca = new SecurityConfig(auth.getName()); for (Resources res : auth.getResources()) { String url = res.getResourceStr(); /* * 判断资源文件和权限的对应关系,如果已经存在相关的资源url,则要通过该url为key提取出权限集合,将权限增加到权限集合中 * 。 */ if (resourceMap.containsKey(url)) { Collection<ConfigAttribute> value = resourceMap .get(url); value.add(ca); resourceMap.put(url, value); } else { Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } } } return resourceMap; } @Override public Pagination<Authorities> getInOrNotAuthoritiesByRoleId( Pagination<Authorities> list, int roleId, boolean inRoleOrNot) { return inRoleOrNot?rolesAuthorityDao.getAuthoritiesInRoles(list, roleId):rolesAuthorityDao.getAuthoritiesNotInRoles(list, roleId); } }