📄 authorizationmgrimpl.java
字号:
package com.yuanchung.sales.service.admin.authorization.impl;
/**
* 授权类,提供授权方法(包括功能、数据等权限)
*
* @author hrw created on 2008-12-12
*
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import com.yuanchung.organize.treeview.TreeViewMgr;
import com.yuanchung.sales.constants.DataBaseTableName;
import com.yuanchung.sales.constants.SystemConstant;
import com.yuanchung.sales.dao.util.UtilDAO;
import com.yuanchung.sales.exception.ApplicationException;
import com.yuanchung.sales.exception.SystemException;
import com.yuanchung.sales.model.Treeview;
import com.yuanchung.sales.model.admin.Rights;
import com.yuanchung.sales.model.admin.position.PositionRights;
import com.yuanchung.sales.model.admin.position.PositionRightsArea;
import com.yuanchung.sales.model.admin.position.UserRights;
import com.yuanchung.sales.model.admin.position.UserRightsArea;
import com.yuanchung.sales.model.admin.position.UserRightsFlag;
import com.yuanchung.sales.model.admin.role.RoleRightArea;
import com.yuanchung.sales.model.admin.role.RoleRights;
import com.yuanchung.sales.model.admin.role.UserRole;
import com.yuanchung.sales.model.user.User;
import com.yuanchung.sales.service.admin.DataAreaSchemeMgr;
import com.yuanchung.sales.service.admin.authorization.AuthorizationMgr;
import com.yuanchung.sales.service.admin.position.PositionMgr;
import com.yuanchung.sales.service.admin.position.UserRightsMgr;
import com.yuanchung.sales.service.admin.rights.RightsMgr;
import com.yuanchung.sales.service.admin.role.RoleMgr;
import com.yuanchung.sales.service.user.UserMgr;
import com.yuanchung.sales.util.Constants;
import com.yuanchung.sales.vo.right.WebRightsView;
public class AuthorizationMgrImpl implements AuthorizationMgr {
private Logger logger = Logger.getLogger(AuthorizationMgrImpl.class);
private TreeViewMgr treeViewMgr;
private PositionMgr positionMgr;
private DataAreaSchemeMgr dataAreaSchemeMgr;
private RoleMgr roleMgr;
private UtilDAO utilDao;
private UserRightsMgr userRightsMgr;
private RightsMgr rightsMgr;
private UserMgr userMgr;
public UserMgr getUserMgr() {
return userMgr;
}
public void setUserMgr(UserMgr userMgr) {
this.userMgr = userMgr;
}
public UserRightsMgr getUserRightsMgr() {
return userRightsMgr;
}
public void setUserRightsMgr(UserRightsMgr userRightsMgr) {
this.userRightsMgr = userRightsMgr;
}
public UtilDAO getUtilDao() {
return utilDao;
}
public void setUtilDao(UtilDAO utilDao) {
this.utilDao = utilDao;
}
public RoleMgr getRoleMgr() {
return roleMgr;
}
public void setRoleMgr(RoleMgr roleMgr) {
this.roleMgr = roleMgr;
}
public TreeViewMgr getTreeViewMgr() {
return treeViewMgr;
}
public void setTreeViewMgr(TreeViewMgr treeViewMgr) {
this.treeViewMgr = treeViewMgr;
}
public PositionMgr getPositionMgr() {
return positionMgr;
}
public void setPositionMgr(PositionMgr positionMgr) {
this.positionMgr = positionMgr;
}
public DataAreaSchemeMgr getDataAreaSchemeMgr() {
return dataAreaSchemeMgr;
}
public void setDataAreaSchemeMgr(DataAreaSchemeMgr dataAreaSchemeMgr) {
this.dataAreaSchemeMgr = dataAreaSchemeMgr;
}
@SuppressWarnings( { "unchecked", "static-access" })
public void authorization(String objId, String useScheme,
String[] rightIds, HttpServletRequest request) {
boolean isSuccessfull = true;
/*
* 获取授权对象所有ID,因为授权对象有可能是部门或整个公司, 而岗位权限关联表里只存岗位,所以如果是部门就要遍历授权对象的下级对象
* 再把这些最终对象(岗位)存放到 treeViews 里
*/
List<Treeview> treeViews = new ArrayList<Treeview>();
int nodeId = 0;
if (objId != null && !objId.equals("")) {
nodeId = Integer.parseInt(objId);
}
List<PositionRights> prs = new ArrayList<PositionRights>();
try {
Treeview t = treeViewMgr.getTreeviewById(nodeId);
if (t.getIsLeader() == 0) {// 部门
treeViews = treeViewMgr.findChildIdsByParentId(treeViews,
Integer.parseInt(objId));
} else {
treeViews.add(t);
}
// 根据授权岗位对象集合获取岗位权限对象集合
prs = positionMgr.findByPositions(treeViews);
logger.debug("岗位权限对象集合的大小是: " + prs.size());
// hrw 2008-12-18 modify,不预先删除功能权限和数据权限,只有功能权限和数据权限有改动才修改数据库。
// 删除岗位权限数据范围表信息
// positionMgr.deletePositionRightsAreaByPositionRights(prs);
// 删除岗位权限表信息
// positionMgr.deletePositionRightsByPositionRights(prs);
// end
} catch (NumberFormatException e) {
logger.error(e.getMessage());
isSuccessfull = false;
throw new ApplicationException(Constants.APPLICATIONEXCEPTION);
} catch (SystemException e1) {
logger.error(e1.getMessage());
isSuccessfull = false;
throw e1;
}
if (rightIds != null) {// 2008-12-12 hrw add,从页面取到的rightIds有可能为空
// 2008-12-19 hrw modify
List<PositionRights> prNewList = new ArrayList<PositionRights>();
for (int i = 0; i < rightIds.length; i++) {
String rid = rightIds[i];
PositionRights prights = new PositionRights();
prights.setRightsId(Integer.parseInt(rid));
prNewList.add(prights);
}
logger.debug("prNewList 1 : " + prNewList.size());
// 对功能
List<PositionRights> oldPra = recombinationPr(prNewList, prs,
Constants.POSITION_FLAG);// 把页面取过来的功能权限id分成新的和要撤消的,原有的不变。未处理
logger.debug("prNewList 2 : " + prNewList.size());
for (int n = 0; n < 2; n++) {
List<PositionRights> commonPra = new ArrayList<PositionRights>();
if (n == 0) {
commonPra = prNewList;
}
if (n == 1) {
commonPra = oldPra;
}
// end
// 对以下逻辑改为:先新增新的功能权限,再删除撤消的功能权限,对不变的功能权限不做任何操作。
// for (int i = 0; i < rightIds.length; i++) {//改掉
for (int i = 0; i < commonPra.size(); i++) {// 新增新的功能权限
// hrw 2008-12-19 modify
// String rid = rightIds[i];
// int rightId = Integer.parseInt(rid);
int rightId = commonPra.get(i).getRightsId();
logger.debug("权限ID: " + rightId);
// end
String dataAreaIds = "";// 数据范围对象
String dataAreaId_pid = "";// 子模块全局数据范围对象ID hrw 2008-12-19
String dataAreaId_pidValue = "";
String reelection = "n";//权限有重新选过标志
// add.
if (useScheme != null && useScheme.equals("1")) {
logger.debug("使用方案授权 ");
String scheme = request.getParameter("scheme");
int id = 0;
if (scheme != null && !scheme.equals("")) {
id = Integer.parseInt(scheme);
dataAreaIds = dataAreaSchemeMgr
.findTreeviewIdsById(id);
}
} else {
logger.debug("逐步授权 ");
/*
* 在rightTree.js里,每个树节点都挂一下隐藏域,隐藏域属性ID,name均为 节点ID +
* "_area" 字符串, 隐藏域存储数据范围页面返回的部门节点ID集合组成的字符串
*/
// hrw 2008-12-19 modify
// dataAreaIds = request.getParameter(rid + "_area");//
// 数据范围对象
dataAreaIds = request.getParameter(rightId + "_area");// 数据范围对象
logger.debug("dataAreaIds : " + dataAreaIds);
dataAreaId_pid = request.getParameter(rightId + "_pid");// 取页面子模块数据全局范围Id。
logger.debug("dataAreaId_pid : " + dataAreaId_pid);
dataAreaId_pidValue = request
.getParameter(dataAreaId_pid + "_area");// 取页面子模块数据全局范围
logger.debug("dataAreaId_pidValue : "
+ dataAreaId_pidValue);
String dataAreaSelectedFlag = request
.getParameter(rightId + "_selected");// 功能权限的数据范围是否有被重新设置过。
// end
// 先确定是否有先设整体模块的全局数据范围,再处理子模块的全局数据范围。
String allAreas = request.getParameter("_area");
logger.debug("allAreas : " + allAreas);
String allSelected = request.getParameter("_selected");
logger.debug("allSelected : " + allSelected);
String pDataAreaSelectedFlag = request
.getParameter(dataAreaId_pid + "_selected");
logger.debug("pDataAreaSelectedFlag : "
+ pDataAreaSelectedFlag);
if (allAreas != null && !"".equals(allAreas)) {
if (!"y".equals(pDataAreaSelectedFlag)) {
dataAreaId_pidValue = allAreas;
}
}
// dataAreaIds 不能为null
if (dataAreaIds == null || "".equals(dataAreaIds)) {
dataAreaIds = "";
if (dataAreaId_pidValue != null
&& !"".equals(dataAreaId_pidValue)) {// 功能权限没有选数据范围且子模块有设全局数据权限
// 若有设子模块全局的数据范围且该功能权限的数据范围没被重新设置过,默认为被全局设置过,数据范围为全局的和原有的数据范围。
// 若功能权限被重新设置过,以重新设置过为主。
if (!"y".equals(dataAreaSelectedFlag)) {
dataAreaIds = dataAreaId_pidValue;
}
}
}
logger.debug("dataAreaIds : " + dataAreaIds);
if("y".equals(dataAreaSelectedFlag) || "y".equals(pDataAreaSelectedFlag) || "y".equals(allSelected)){
reelection = "y";
}
}
logger.debug("数据范围ID: " + dataAreaIds);
try {
/*
* 保存授权对象, 权限对象以及数据范围对象三者的关系
* 因为对不同授权对象授予的权限对象是一样的,所以先循环权限表,再为每一个授权对象授予同一权限
* 每一个隐藏域里存放的数据范围对象ID集合也都是对应一个权限
*/
for (int j = 0; j < treeViews.size(); j++) {
Treeview t = treeViews.get(j);
int positionId = t.getId();
// 保存授权对象, 权限对象以及数据范围对象三者的关系
// hrw 2008-12-19 modify
if (n == 0) {
// 数据库里没有的传岗位id。
positionMgr.saveThreeObjRelation(positionId,
rightId, dataAreaIds, true,reelection);
}
if (n == 1) {
// 数据库里已存在的传功能权限主键。
positionMgr
.saveThreeObjRelation(commonPra.get(i)
.getId(), rightId, dataAreaIds,
false,reelection);
}
// end
}
} catch (SystemException e) {
logger.error(e.getMessage());
isSuccessfull = false;
throw e;
}
}
}
for (int i = 0; i < prs.size(); i++) {// 删除撤消的功能权限和相关的数据权限
// 删除岗位权限数据范围表信息
positionMgr.deletePositionRightsAreaByPositionRights(prs);
// 删除岗位权限表信息
positionMgr.deletePositionRightsByPositionRights(prs);
}
} else {// 2008-12-18 hrw add如果从页面取到的right为空,说明该岗位没有任何权限,些时删除所有权限
// 删除岗位权限数据范围表信息
positionMgr.deletePositionRightsAreaByPositionRights(prs);
// 删除岗位权限表信息
positionMgr.deletePositionRightsByPositionRights(prs);
}
if (isSuccessfull) {// 授权成功
// 获取当前用户信息
User user = (User) request.getSession().getAttribute(
Constants.SESSION_USER);
// 获取全局会话
ServletContext application = request.getSession()
.getServletContext();
// 获取用户信息
Map userInfo = (Map) application
.getAttribute(SystemConstant.APPLICATION_USER_INFO);
if (userInfo != null) {
logger.debug("userInfo: " + userInfo + " userInfo.size: "
+ userInfo.size());
// 遍历所有有被修改权限的岗位
for (int i = 0; i < treeViews.size(); i++) {
// 获取该岗位所有权限
// List<Rights> rights = positionMgr
// .getAllRightsByPositionId(treeViews.get(i).getId());
// 遍历存放用户session的Map对象
for (Object o : userInfo.keySet()) {
Integer userId = (Integer) o;
logger.debug("key: " + userId);
// 不是本人的ID(管理员)
// if (!userId.equals(user.getId())) {
// 获取Session
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -