package com.baidu.disconf.web.service.roleres.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMethod;
import com.baidu.disconf.web.service.roleres.bo.RoleResource;
import com.baidu.disconf.web.service.roleres.constant.RoleResourceConstant;
import com.baidu.disconf.web.service.roleres.dao.RoleResourceDao;
import com.baidu.disconf.web.service.roleres.service.RoleResourceMgr;
import com.baidu.disconf.web.service.user.dto.Visitor;
import com.baidu.ub.common.commons.ThreadContext;
/**
*
*/
@Service
public class RoleResourceMgrImpl implements RoleResourceMgr {
protected static final Logger LOG = LoggerFactory.getLogger(RoleResourceMgrImpl.class);
@Autowired
private RoleResourceDao roleResDao;
/**
*
*/
@Override
@CacheEvict(value = "${role_res_cache_name}")
public void evictCache() {
LOG.info("Evicting role_resource cache...");
}
/**
* @return
*/
@Override
@Cacheable(value = "${role_res_cache_name}")
public Map<String, Map<RequestMethod, List<Integer>>> getAllAsMap() {
Map<String, Map<RequestMethod, List<Integer>>> infoMap =
new HashMap<String, Map<RequestMethod, List<Integer>>>();
LOG.info("Querying role_resource table to get all...");
List<RoleResource> roleResList = roleResDao.findAll();
// 遍历列表,把数据按<url, <method, List<roleId>>>的形式加到infoMap
for (RoleResource roleRes : roleResList) {
String urlPattern = roleRes.getUrlPattern();
if (!urlPattern.endsWith(RoleResourceConstant.URL_SPLITOR)) {
urlPattern += RoleResourceConstant.URL_SPLITOR;
}
// LOG.info(urlPattern);
Map<RequestMethod, List<Integer>> value = infoMap.get(urlPattern);
if (value == null) {
value = new HashMap<RequestMethod, List<Integer>>();
infoMap.put(urlPattern, value);
}
updateMethodMap(value, roleRes.getRoleId(), roleRes.getMethodMask());
}
return infoMap;
}
/**
* 把roleRes的信息加到对应的<method, List<roleId>>
*
* @param methodMap
* @param roleId
* @param methodMask
*/
private void updateMethodMap(Map<RequestMethod, List<Integer>> methodMap, Integer roleId, String methodMask) {
for (int i = 0; i < RoleResourceConstant.METHOD_NUM; ++i) {
if (methodMask.charAt(i) == RoleResourceConstant.METHOD_IS_ACCESSIBLE) {
RequestMethod curMethod = RoleResourceConstant.IND_METHOD_MAP.get(i);
// update List<roleId>
List<Integer> roleIdList = methodMap.get(curMethod);
if (roleIdList == null) {
roleIdList = new ArrayList<Integer>();
methodMap.put(curMethod, roleIdList);
}
roleIdList.add(roleId);
}
}
}
/**
* @param pattern
* @param method
*
* @return
*/
@Override
public boolean checkUserPermission(String pattern, RequestMethod method) {
// 获取用户角色
Visitor visitor = ThreadContext.getSessionVisitor();
if (visitor == null) {
return false;
}
String urlPattarn = pattern;
if (!urlPattarn.endsWith(RoleResourceConstant.URL_SPLITOR)) {
urlPattarn += RoleResourceConstant.URL_SPLITOR;
}
Integer roleId = visitor.getRoleId();
Map<String, Map<RequestMethod, List<Integer>>> roleResMap = getAllAsMap();
Map<RequestMethod, List<Integer>> methodMap = roleResMap.get(urlPattarn);
if (methodMap == null) {
return false;
}
List<Integer> roleIdList = methodMap.get(method);
if (roleIdList == null) {
return false;
}
if (!roleIdList.contains(roleId)) {
return false;
}
return true;
}
}