/** TODO(程序启动的时候就加载所有资源信息). */ private void loadResourceDefine() { // 加载资源有效,且URL不为空的资源 List<TResource> resources = resourceService.loadByEnableAndUrl(); /* * 应当是资源url为key, 角色名称为value。角色名称就是那些以ROLE_为前缀的值 */ resourceMap = new HashMap<String, Collection<ConfigAttribute>>(); for (TResource res : resources) { List<TRoleResource> rrList = rresourceDao.findByProperty("IResourceId", res.getId()); for (TRoleResource rr : rrList) { ConfigAttribute ca = new SecurityConfig(roleDao.get(rr.getIRoleId()).getVcRole()); String url = res.getVcUrl(); if (resourceMap.containsKey(url)) { // 获得原来的集合 Collection<ConfigAttribute> value = resourceMap.get(url); value.add(ca); resourceMap.put(url, value); } else { // 首次添加的key Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } } }
/** 根据用户访问的uri,加载该uri所需要角色列表 Object object:uri地址 */ public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException { // 最初请求的uri格式:/crm/index.jsp // object 是一个URL ,为用户请求URL String url = ((FilterInvocation) object).getRequestUrl().trim(); if ("/".equals(url)) { return null; } int firstQuestionMarkIndex = url.indexOf("?"); if (firstQuestionMarkIndex == -1) firstQuestionMarkIndex = url.length(); // 判断请求是否带有参数 如果有参数就去掉后面的后缀和参数(/index.do --> /index) if (firstQuestionMarkIndex != -1) { url = url.substring(0, firstQuestionMarkIndex); } // 最终形成的uri 格式:/index if (url.startsWith("/")) { url = url.substring(1); } // 当前有用户,通过URL 获得资源 ,并写入日志里面 TUserLog userLog = new TUserLog(); if (null != UserSession.get("user")) { TUser user = (TUser) UserSession.get("user"); userLog.setIUser(user.getId()); userLog.setVcUserName(user.getVcAccount()); } String desc = resourceService.getResourceDescByUrl(url); userLog.setVcDesc(desc); // 把用户 时间 操作描述 保存到日志表里 String ip = (String) UserSession.get("ip"); userLog.setVcIp(ip); userLogService.saveLog(userLog); Iterator<String> ite = resourceMap.keySet().iterator(); // 取到请求的URL后与上面取出来的资源做比较 while (ite.hasNext()) { String resURL = ite.next().trim(); if (url.equals(resURL)) { // 获得该uri所需要的角色列表 return resourceMap.get(resURL); } } // 如果数据库里面没有该uri的信息,表示该uri不需要经过权限验证了 return null; }
/** * 更新某个资源对应的权限 * * @param resourceId */ public void updateResourceRole(int resourceId) { TResource res = resourceService.get(resourceId); String url = res.getVcUrl(); if (StringUtils.isNotBlank(url)) { resourceMap.remove(url); // 删除原先内容 List<TRoleResource> rrList = rresourceDao.findByProperty("IResourceId", resourceId); for (TRoleResource rr : rrList) { ConfigAttribute ca = new SecurityConfig(roleDao.get(rr.getIRoleId()).getVcRole()); if (resourceMap.containsKey(url)) { // 获得原来的集合 Collection<ConfigAttribute> value = resourceMap.get(url); value.add(ca); resourceMap.put(url, value); } else { // 首次添加的key Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } } }