Ejemplo n.º 1
0
        //查询当前用户有权限的应用
        private void DoQueryApplication()
        {
            using (DbContext context = DbContext.GetContext(AppResource.ConnAlias))
            {
                ExceptionHelper.TrueThrow(this.LogOnUserInfo == null, "没有登录者信息");
                //********************
                //查询权限确定应用范围
                //********************
                XmlElement root        = _XmlRequest.DocumentElement;
                string     strParentID = root.GetAttribute("parent_id");

                string strSQL       = string.Empty;
                bool   bAdminUser   = SecurityCheck.IsAdminUser(LogOnUserInfo.UserLogOnName);
                string strAppLevels = string.Empty;
                if (false == bAdminUser)
                {
                    #region 得到父应用的resource_level
                    strSQL = string.Format("SELECT RESOURCE_LEVEL FROM APPLICATIONS WHERE ID = {0}",
                                           TSqlBuilder.Instance.CheckQuotationMark(strParentID, true));
                    string strParentLevel = string.Empty;
                    object obj            = InnerCommon.ExecuteScalar(strSQL);
                    if (obj != null)
                    {
                        strParentLevel = obj.ToString();
                    }
                    string    strTemp  = string.Empty;
                    DataTable userApps = SecurityCheck.GetUserApplications(LogOnUserInfo.UserLogOnName,
                                                                           UserValueType.LogonName, RightMaskType.Self).Tables[0];
                    for (int i = 0; i < userApps.Rows.Count; i++)
                    {
                        strTemp = userApps.Rows[i]["RESOURCE_LEVEL"].ToString();
                        if (strTemp.Length >= strParentLevel.Length + 3 &&
                            strTemp.Substring(0, strParentLevel.Length) == strParentLevel)
                        {
                            if (strAppLevels == string.Empty)
                            {
                                strAppLevels += strTemp.Substring(0, strParentLevel.Length + 3);
                            }
                            else
                            {
                                strAppLevels += "," + strTemp.Substring(0, strParentLevel.Length + 3);
                            }
                        }
                    }
                    #endregion
                }

                #region Prepare SQL
                strSQL = "SELECT ID,NAME, CODE_NAME, DESCRIPTION, SORT_ID, RESOURCE_LEVEL, CHILDREN_COUNT, ADD_SUBAPP, USE_SCOPE, INHERITED_STATE "
                         + "FROM APPLICATIONS ";
                if (strParentID != "")
                {
                    strSQL += "WHERE LEFT(RESOURCE_LEVEL, LEN(RESOURCE_LEVEL)-3) = (SELECT RESOURCE_LEVEL FROM APPLICATIONS WHERE ID = "
                              + TSqlBuilder.Instance.CheckQuotationMark(strParentID, true) + ") ";
                }
                else
                {
                    strSQL += "WHERE LEN(RESOURCE_LEVEL) = 3 ";
                }
                if (strAppLevels != string.Empty)
                {
                    strSQL += string.Format("\n AND RESOURCE_LEVEL IN ({0})", InnerCommon.AddMulitStrWithQuotationMark(strAppLevels));
                }
                else
                if (false == bAdminUser)
                {
                    strSQL += "\n AND (1=0)";
                }

                strSQL += " ORDER BY SORT_ID";
                #endregion

                DataSet ds = InnerCommon.ExecuteDataset(strSQL);
                _XmlResult = InnerCommon.GetXmlDoc(ds);
                DataTable userRoleDT = null;
                DataTable appFuncDT  = null;

                foreach (XmlNode xNode in _XmlResult.FirstChild.ChildNodes)
                {
                    string appCodeName = xNode.SelectSingleNode(".//CODE_NAME").InnerText;
                    if (false == bAdminUser)
                    {
                        if (userRoleDT == null)
                        {
                            userRoleDT = SecurityCheck.GetUserApplicationsRoles(LogOnUserInfo.UserLogOnName, UserValueType.LogonName,
                                                                                RightMaskType.Self, DelegationMaskType.Original).Tables[0];
                        }
                        if (appFuncDT == null)
                        {
                            string roleIDs = "''";
                            foreach (DataRow row in userRoleDT.Rows)
                            {
                                roleIDs += string.Format(",'{0}'", row["ID"]);
                            }
                            strSQL    = string.Format(@"SELECT A.CODE_NAME APP_CODE_NAME, F.CODE_NAME FUN_CODE_NAME
														FROM ROLES R 
														INNER JOIN APPLICATIONS A ON R.APP_ID = A.ID
														INNER JOIN ROLE_TO_FUNCTIONS RF ON R.ID = RF.ROLE_ID
														INNER JOIN FUNCTIONS F ON RF.FUNC_ID = F.ID
														WHERE R.ID IN ({0})"                                                        , roleIDs);
                            appFuncDT = InnerCommon.ExecuteDataset(strSQL).Tables[0];
                        }
                        //显示服务范围结点
                        if (appFuncDT.Select(string.Format("[APP_CODE_NAME]= '{0}' AND [FUN_CODE_NAME] IN ( 'ADD_SCOPE_FUNC','DELETE_SCOPE_FUNC' )", appCodeName)).Length > 0)
                        {
                            XmlHelper.AppendNode(xNode, "APP_SCOPES", "True");
                        }
                        else
                        {
                            XmlHelper.AppendNode(xNode, "APP_SCOPES", "False");
                        }

                        //显示自授权结点
                        if (appFuncDT.Select(string.Format("[APP_CODE_NAME]= '{0}' AND [FUN_CODE_NAME] IN ( 'SELF_MAINTAIN_FUNC' )", appCodeName)).Length > 0)
                        {
                            XmlHelper.AppendNode(xNode, "SELF_MAINTAIN_FUNC", "True");
                        }
                        else
                        {
                            XmlHelper.AppendNode(xNode, "SELF_MAINTAIN_FUNC", "False");
                        }

                        //显示应用角色结点
                        if (appFuncDT.Select(string.Format("[APP_CODE_NAME]= '{0}' AND [FUN_CODE_NAME] IN ( 'MODIFY_SCOPE_FUNC','ADD_ROLE_FUNC','DELETE_ROLE_FUNC','MODIFY_ROLE_FUNC','ADD_OBJECT_FUNC','DELETE_OBJECT_FUNC','MODIFY_OBJECT_FUNC' )", appCodeName)).Length > 0)
                        {
                            XmlHelper.AppendNode(xNode, "APP_ROLES", "True");
                        }
                        else
                        {
                            XmlHelper.AppendNode(xNode, "APP_ROLES", "False");
                        }

                        //显示应用功能结点
                        if (appFuncDT.Select(string.Format("[APP_CODE_NAME]= '{0}' AND [FUN_CODE_NAME] IN ( 'ADD_FUNCTION_FUNC','DELETE_FUNCTION_FUNC','MODIFY_FUNCTION_FUNC','RTF_MAINTAIN_FUNC' )", appCodeName)).Length > 0)
                        {
                            XmlHelper.AppendNode(xNode, "APP_FUNCTIONS", "True");
                        }
                        else
                        {
                            XmlHelper.AppendNode(xNode, "APP_FUNCTIONS", "False");
                        }
                    }
                    else
                    {
                        XmlHelper.AppendNode(xNode, "APP_SCOPES", "True");
                        XmlHelper.AppendNode(xNode, "SELF_MAINTAIN_FUNC", "True");
                        XmlHelper.AppendNode(xNode, "APP_ROLES", "True");
                        XmlHelper.AppendNode(xNode, "APP_FUNCTIONS", "True");
                    }
                }
            }
        }