public static XPrivilegeSet CreatePrivilegeSet(FolderPrivilegesItem[] values) { XPrivilegeSet set = new XPrivilegeSet(); for (int i = 0; i < values.Length; ++i) { set.Add(new ITFolderPrivilege(values[i])); } return(set); }
/// <summary> /// Создает описание списка при первом обращении. /// Параметр делегата CreateCacheValue. /// </summary> /// <param name="sKey">Ключ в формате {Наименование типа}:{Наименование списка}</param> /// <param name="value">XStorageConnection</param> /// <returns>экземпляр ListInfoWithAccessCheck</returns> private static ListInfoWithAccessCheck createListInfo(string sKey, object value) { #region Copy-paste кода из XInterfaceObjectsHolder::createListInfo XStorageConnection connection = (XStorageConnection)value; XMetadataManager metadataManager = connection.MetadataManager; // Ключ для сохранения в реестре (кеше) XModel в данном случае // ДОЛЖЕН БЫТЬ в виде {Наименование типа}:{Наименование списка} // Разберем этот ключ - выделим наименование типа и наименование списка Debug.Assert(sKey.IndexOf(":") > -1, "Отсутствует символ ':' в ключе"); int nIndex = sKey.IndexOf(":"); string sTypeName = sKey.Substring(0, nIndex); Debug.Assert(sTypeName.Length > 0, "Не задан тип"); string sName = sKey.Substring(nIndex + 1, sKey.Length - nIndex - 1); // Сформируем XPath-запрос и загрузим метаописание списка; при формировании // запроса учитваем что метанаименование списка - параметр необязательный string sXPath = "ds:type[@n='" + sTypeName + "']/i:objects-list"; if (sName.Length > 0) { sXPath = sXPath + "[@n='" + sName + "']"; } XmlElement xmlList = (XmlElement)metadataManager.SelectSingleNode(sXPath); if (xmlList == null) { throw new ArgumentException( "Неизвестное определение списка i:objects-list с метанаименованием " + "'" + sName + "', для типа '" + sTypeName + "' " + "(не найдено в метаданных, XPath='" + sXPath + "')"); } #endregion //Создаем описание списка ListInfoWithAccessCheck. ListInfoWithAccessCheck listInfo = new ListInfoWithAccessCheck(xmlList, connection.MetadataManager.NamespaceManager, connection.MetadataManager.XModel); XPrivilegeSet privSet = new XPrivilegeSet(); //Зачитываем из метаданных необходимые привилегии для доступа к заданному списку и записываем их в контейнер привилегий. foreach (XmlElement xmlNode in xmlList.SelectNodes("it-sec:access-requirements/*", connection.MetadataManager.NamespaceManager)) { string sPrivName = xmlNode.GetAttribute("n"); ITSystemPrivilege priv = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName)); privSet.Add(priv); } listInfo.AccessSecurity.SetRequiredPrivileges(privSet); return(listInfo); }
public override XTreePageInfo CreateTreePageInfo(XmlElement xmlTreePage) { TreePageWithAccessCheckInfo treePage = new TreePageWithAccessCheckInfo(); base.initTreePageInfo(treePage, xmlTreePage); XPrivilegeSet privSet = new XPrivilegeSet(); foreach (XmlElement xmlNode in xmlTreePage.SelectNodes("it-sec:access-requirements/*", m_mdManager.NamespaceManager)) { string sPrivName = xmlNode.GetAttribute("n"); ITSystemPrivilege priv = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName)); privSet.Add(priv); } treePage.AccessSecurity.SetRequiredPrivileges(privSet); return(treePage); }
/// <summary> /// Метод,записывающий в контейнер набор привилегий. /// </summary> /// <param name="privilege_set">набор привилегий</param> public void SetRequiredPrivileges(XPrivilegeSet privilege_set) { m_requiredPrivileges = privilege_set; }
public ITUser(string sName, XRole[] roles, XPrivilegeSet privilege_set) : base(sName, roles, privilege_set) { }
/// <summary> /// Конструирует описание пользователя по наименованию. /// Если пользователя с таким наименованием не найдено, то возвращает null /// </summary> /// <param name="sUserName">Наименование пользователя</param> /// <returns></returns> public XUser CreateUser(string sUserName) { ITUser user; using (XStorageConnection con = getConnection()) { con.Open(); XDbCommand cmd = con.CreateCommand(); cmd.CommandText = /* Получим описание пользователя (который может быть сотрудником), * системные привилегии (как выданные явно, так и полученные через роли). * Примечания: - пользователь приложения может не быть сотрудником. * - для пользователя приложения могут быть не заданы роли * - GetWorkdayDuration возвращает количество минут * */ @"SELECT su.ObjectID AS SysUserID, su.IsAdmin, su.IsServiceAccount, emp.ObjectID AS EmpID, emp.LastName, emp.FirstName, emp.EMail, su.SystemPrivileges, sr.Name as RoleName, sr.Description as RoleDescription, sr.Priviliges as RolePrivileges, dbo.GetWorkdayGlobalDuration() as WorkingMinutesInDay, CASE WHEN emp.WorkEndDate < getDate() THEN 0 ELSE 1 END as AccessPermitted FROM SystemUser su WITH (nolock) LEFT JOIN Employee emp WITH (nolock) ON emp.SystemUser = su.ObjectID LEFT JOIN (SystemUser_SystemRoles su_sr WITH (nolock) JOIN SystemRole sr WITH (nolock) ON su_sr.Value = sr.ObjectID ) ON su.ObjectID = su_sr.ObjectID WHERE su.Login = @UserLogin"; cmd.Parameters.Add("UserLogin", DbType.String, ParameterDirection.Input, false, sUserName); using (IDataReader reader = cmd.ExecuteReader()) { XRole[] roles; // массив системных ролей Guid SystemUserID; // идентификатор пользователя Guid EmployeeID = Guid.Empty; // идентификатор сотрудника string sLastName = null; // фамилия сотрудника string sFirstName = null; // имя сотрудника string sEMail = null; // email сотрудника bool bIsAdmin; // признак админа (необграниченного пользователя) bool bIsServiceAccount; // признак сервисного аккаунта int nIndex; // временная - индекс колонки int nPrivileges; // числовая маска привилегий (в БД привилегии лежат как флаги) int nWorkingMinutesInDay; // количество рабочих часов в сутках bool bAccesssPermitted = true; if (reader.Read()) { // получим маску привилегий, выданных пользователю явно nPrivileges = reader.GetInt32(reader.GetOrdinal("SystemPrivileges")); // поле SystemPrivileges - not null SystemUserID = reader.GetGuid(reader.GetOrdinal("SysUserID")); bIsAdmin = reader.GetBoolean(reader.GetOrdinal("IsAdmin")); bIsServiceAccount = reader.GetBoolean(reader.GetOrdinal("IsServiceAccount")); nWorkingMinutesInDay = reader.GetInt32(reader.GetOrdinal("WorkingMinutesInDay")); nIndex = reader.GetOrdinal("EmpID"); if (!reader.IsDBNull(nIndex)) { // если пользователь является сотрудником EmployeeID = reader.GetGuid(nIndex); sLastName = reader.GetString(reader.GetOrdinal("LastName")); sFirstName = reader.GetString(reader.GetOrdinal("FirstName")); bAccesssPermitted = reader.GetInt32(reader.GetOrdinal("AccessPermitted")) == 1; nIndex = reader.GetOrdinal("EMail"); if (!reader.IsDBNull(nIndex)) { sEMail = reader.GetString(nIndex); } } } else { // не нашли пользователя return(CreateAnonymousUser()); } // зачитаем все роли текущего юзера ArrayList aRoles = new ArrayList(); // список объектов XRole - роли пользователя int nIndex_RoleName = reader.GetOrdinal("RoleName"); int nIndex_RoleDescription = reader.GetOrdinal("RoleDescription"); int nIndex_RolePrivileges = reader.GetOrdinal("RolePrivileges"); if (!reader.IsDBNull(nIndex_RoleName)) { // по всем ролям пользователя do { string sDescription = String.Empty; if (!reader.IsDBNull(nIndex_RoleDescription)) { sDescription = reader.GetString(nIndex_RoleDescription); } // объединим маску привилегий с привилегиями текущей роли nPrivileges = nPrivileges | reader.GetInt32(nIndex_RolePrivileges); aRoles.Add(new XRole(reader.GetString(nIndex_RoleName), sDescription)); } while(reader.Read()); } roles = new XRole[aRoles.Count]; aRoles.CopyTo(roles); // превратим маску привилегий в массив объектов XPrivilegeSet privilege_set = PrivilegesHelper.CreatePrivilegeSet((SystemPrivileges)nPrivileges); // создадим описание пользователя и дополним атрибуты, специфичные для нашего приложения user = new ITUser(sUserName, roles, privilege_set); user.SystemUserID = SystemUserID; user.IsUnrestricted = bIsAdmin; user.IsServiceAccount = bIsServiceAccount; user.AccessPermitted = bAccesssPermitted; if (EmployeeID != Guid.Empty) { // если пользователь - сотрудник user.EmployeeID = EmployeeID; user.LastName = sLastName; user.FirstName = sFirstName; user.EMail = sEMail; user.WorkdayDuration = nWorkingMinutesInDay; } } readUserActivityTypes(user, con); readUserManagedOrganizations(user, con); } return(user); }