Skip to content

EXECUTE AS USER или EXECUTE AS LOGIN

Пересказ статьи Kenneth Fisher. EXECUTE AS USER vs EXECUTE AS LOGIN


Я часто использую имперсонализацию. Это действительно простой способ проверки, имеет ли кто-то разрешения, которые у него должны быть. Итак, коллега недавно задал интересный вопрос. Они тестировали разрешения на синоним.

EXECUTE AS User='Domain/NetworkName';
SELECT Col1, Col2 FROM SynonymName;
-- SynonymName == OtherDB.dbo.TableName
Msg 916, Level 14, State 1, Line 3
The server principal “Domain/NetworkName” is not able to access the database “OtherDB” under the current security context.

(Учетная запись сервера «Domain/NetworkName» не может получить доступ к базе данных «OtherDB» в текущем контексте безопасности.)

Domain/NetworkName имеет доступ к SynonymName, доступ к OtherDB и доступ к TableName. Так почему мы получаем ошибку? И это не совсем то, что вы ожидаете от ошибки отказа в доступе.

Проблема состоит в том, что они выполняли имперсонализацию на уровне учетной записи базы данных (пользователь). Это означает, что вы имеете доступ к их разрешениям в пределах этой базы.



Заметьте, что вы можете перейти от LoginA либо к DB1, либо к DB2, но не напрямую от DB1 к DB2 или наоборот. При имперсонализации UserA вы можете иметь доступ только к DB1. То же самое относительно UserB и DB2. Однако при имперсонализации LoginA вы можете получить доступ и к DB1, и к DB2, поскольку LoginA отображается на обоих пользователей UserA и UserB. Поэтому, если по какой-то причине вам необходим доступ к нескольким базам данных при имперсонализации разных id, убедитесь, что вы используете EXECUTE LOGIN. Если доступ требуется только к одной базе данных, то вы можете использовать любой из вариантов. Если, конечно, вы не хотите, чтобы он потерпел неудачу, когда неожиданно попытаетесь получить доступ к другой базе данных. И да, раньше я использовал EXECUTE USER именно по этой причине.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.