Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разграничение доступа к данным  [new]
novexelf
Member

Откуда: this
Сообщений: 184
В системе предполагается наличие сотрудников с разным уровнем доступа к данным, т.е. например руководство видит все, сотрудники филиалов видят только данные своих филиалов.


Реализация выполнена так:
+
------------------------------------------------------------------------------------------------------------------
Create Table [ATOL].[UserAccess].[TUsers]
(
	[IdUser] int identity(1,1) not null primary key nonclustered
	, [UserLogin] sysname not null									-- login пользователя
	, [UserName] sysname not null									-- ФИО пользователя
	, [TabNum] varchar(30) null									-- табельный номер
	, [OsbNum] char(4) null										-- номер отделения
	, [Division] varchar(50) null									-- номер подразделения (BBOOOO%)
	, [EMail] nvarchar(200) null									-- e-mail
	
	, Constraint [UniqueUserLogin] Unique Clustered ([UserLogin])
)
Go
------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------
Create Nonclustered Index [IndUsersEmployee] On [ATOL].[UserAccess].[TUsers]([UserName])
Go
------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------
-- Список подразделений документы которых может просматривать пользователь
Create Table [ATOL].[UserAccess].[TDivisionUserAccess]
(
	[IdDivisionUserAccess] int identity(1,1) not null primary key clustered
	, [IdUser] int not null
	, [Division] varchar(100) not null							-- подразделение, указывается как ХХYYYZZZZ% ...
	
	, Constraint [UniqueDivisionUserAccess] Unique nonClustered ([IdUser], [Division])
	
	, Foreign Key ([IdUser]) References [UserAccess].[TUsers]([IdUser])
	On Delete Cascade
	On Update Cascade
)
Go
-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------
-- возвращает Id текущего пользователя из таблицы TUsers
Create Function [ATOL].[UserAccess].[getCurrentUserId] ()
	Returns int
As
Begin
	Declare @trueUserLogin sysname
	Set @trueUserLogin = Upper(SUSER_SNAME())
	
	Return (Select [IdUser]
			From [UserAccess].[TUsers]
			Where [UserLogin] = @trueUserLogin)
End
Go
-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------
-- возвращает 1 если пользователь имеет право просматривать данную информацию
Create Function [ATOL].[UserAccess].[IsUserViewAccess] (@pDivision varchar(100))
	Returns int
As
Begin
	Declare @currentUserId Int
	set @currentUserId = [UserAccess].[GetCurrentUserId]()
	
	If Exists (Select dua.[IdDivisionUserAccess] 
				From [UserAccess].[TDivisionUserAccess] dua
				Where dua.[IdUser] = @currentUserId 
					And @pDivision Like (dua.[Division] + '%'))
		Return (1)
	
	Return (0)
End
Go
-------------------------------------------------------------------------------------------------------------------



Проверка осуществлятся функцией IsUserViewAccess, которая используется в представлениях и хранимых процедурах, в секциях Where ....

На данный момент подход как бы устраивает, но что будет, когда объемы вырастут?
И может существуют другие подходы? а я тут изобретаю очередной велосипед с квадратными колесами.

Немного коментариев:
1. подразделения имеют код, например ХХYYYZZZ, соответственно ХХ - это подразделение вернего уровня, YYY - это подразделение подчиенное ХХХ, а ZZZ - это подразделение нижнего уровня, подчиненное YYY.
2. сотрудники могут выезжать в командировки и тогда нужно оперативно сотруднику из подразделения XXYYYZZZ дать доступ еще и к подразделению NNKKKMMM.
14 фев 12, 10:49    [12086865]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
novexelf,

Пользователи - группы - роли - обьекты : разрешения / запрещения.

А дальше таблицы джойнте ... И этта - если функции то инлайн , а ваши выкиньте.
14 фев 12, 10:55    [12086912]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
novexelf,

это вам скорее в проектирование нужно обратиться
14 фев 12, 10:57    [12086931]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
novexelf
Member

Откуда: this
Сообщений: 184
Ken@t,

Есть пользователи, есть роли, просто роль дает доступ к конкретной хранимой процедуре или представлению, а как к данным?
14 фев 12, 11:06    [12086988]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
novexelf
Member

Откуда: this
Сообщений: 184
WarAnt,

Хмм, возможно, а как тогда ее туда перенести ...
не дублировать же
14 фев 12, 11:07    [12086998]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
novexelf
Ken@t,

Есть пользователи, есть роли, просто роль дает доступ к конкретной хранимой процедуре или представлению, а как к данным?


так же. всё , что необходимо UAC перечисляете и назначаете индетефикаторы, а уже в where или join пишите правила соединения или фильтра.
14 фев 12, 11:10    [12087017]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
iljy
Member

Откуда:
Сообщений: 8711
novexelf
Ken@t,

Есть пользователи, есть роли, просто роль дает доступ к конкретной хранимой процедуре или представлению, а как к данным?

... или к конкретной таблице, и даже к конкретному ее полю. Если нужно более детальное разграничение - гуглите Row and Cell-level security.
14 фев 12, 11:10    [12087021]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
iljy
novexelf
Ken@t,

Есть пользователи, есть роли, просто роль дает доступ к конкретной хранимой процедуре или представлению, а как к данным?

... или к конкретной таблице, и даже к конкретному ее полю. Если нужно более детальное разграничение - гуглите Row and Cell-level security.


Есть мнение , что у ТС кастомная авторизация / аутентификация.
14 фев 12, 11:11    [12087030]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
Aleksey V.P.
Member

Откуда: Москва
Сообщений: 575
novexelf,

Может имеет смысл поискать что-то вроде Oracle Label Security для MS SQL Server ?
14 фев 12, 12:16    [12087538]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Aleksey V.P.
novexelf,

Может имеет смысл поискать что-то вроде Oracle Label Security для MS SQL Server ?
И что ? Открываешь запрос, а он ругается сотней ошибок прав доступа ?
Вполне достаточно грамотной SQL структуры таблиц и запросов. Жертвы на производительность неизбежны.
14 фев 12, 12:23    [12087607]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение доступа к данным  [new]
Aleksey V.P.
Member

Откуда: Москва
Сообщений: 575
LSV
Aleksey V.P.
novexelf,

Может имеет смысл поискать что-то вроде Oracle Label Security для MS SQL Server ?
И что ? Открываешь запрос, а он ругается сотней ошибок прав доступа ?
Вполне достаточно грамотной SQL структуры таблиц и запросов. Жертвы на производительность неизбежны.


Нет, просто показывает те записи, метки по которым удовлетворяют критериям доступа. Никакой ругани. Почитай концепцию OLS.
16 фев 12, 09:12    [12100478]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить