Cod*_*key 1 c# sql sql-server-2005 database-permissions
我正在寻找一种很好的方法来维护谁可以将数据添加到C#app和SQL Server 2005中的数据库的权限.
我需要解释一下这个问题.那么让我们举个例子:
我有两个用户Bob和Jim,都已添加到SQL权限,使他们具有对数据库的写入权限.现在,所有访问都基于域用户帐户.所有其他用户只有读取权限.
现在我有几个表,例如:
因此UserPermissions包含Users和BookPublishers列表.例如:Bob有权为其添加图书MS Press并Jim有权为其添加图书O'Reilly.
现在我需要验证这些信息并限制它们可以添加的内容.
所以说Jim从命令行使用我的应用程序,他写了类似的东西:
Addbook.exe "C# 3.0 in a Nutshell" "O'Reilly"
该工具应该继续并将书籍添加到书籍表中.
现在说Bob尝试相同的命令,该工具应该出错,因为他没有权限添加书籍O'Reilly.
现在我需要知道如何做几件事.
books由特定发布者添加的写入权限现在我并不是100%担心用户注入恶意数据,虽然停止它会很好,但它是一个内部工具,我想我可以信任用户......(可能)
无论哪种方式,我都不知道从哪里开始,我的SQL技能非常缺乏.
Akk,最后一件事,我不想使用存储过程添加数据.
好吧,让我们打破这个:
验证用户是否可以写入表(如果为true,则返回1,否则返回0):
SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0)
Run Code Online (Sandbox Code Playgroud)
验证用户是否可以编写该发布者:
SELECT count(*) FROM UserPermissions WHERE
UserName = 'username' AND Publisher = 'publisher'
Run Code Online (Sandbox Code Playgroud)
现在,那是那些SQL,而不是实际的C#.要获取C#中的值:
SqlConnection SqlConn = new SqlConnection("connection_string_goes_here");
SqlCommand SqlCmd = new SqlCommand();
SqlConn.Open();
SqlCmd.Connection = SqlConn;
SqlCmd.CommandText = "SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', " +
"'OBJECT', 'INSERT'), 0)"
if (SqlCmd.ExecuteScalar())
{
SqlCmd.CommandText =
"SELECT count(*) FROM UserPermissions WHERE " +
"Username = " + System.Environment.UserDomainName + "\" +
System.Environment.UserName + " " +
AND Publisher = @Publisher";
SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
SqlCmd.Parameters("@Publisher").Value = PublisherInput;
if(SqlCmd.ExecuteScalar())
{
SqlCmd.Parameters.Clear();
SqlCmd.CommandText = "INSERT INTO Books (Title, Publisher) VALUES " +
"(@Title, @Publisher)";
SqlCmd.Parameters.Add("@Title", SqlDbType.NVarChar);
SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
SqlCmd.Parameters("@Title").Value = TitleInput;
SqlCmd.Parameters("@Publisher").Value = PublisherInput;
SqlCmd.ExecuteNonQuery();
}
}
SqlCmd.Dispose();
SqlConn.Close();
SqlConn.Dispose();
Run Code Online (Sandbox Code Playgroud)
最后请注意,清理您的输入.在应用程序中使用参数,不要信任任何用户,甚至是内部用户.我不能强调这一点.
编辑:因为有一种方法可以给猫皮肤,我觉得不包括LINQ to SQL解决方案(至少对于计数问题)是愚蠢的:
int PermsAvailable = (from up in db.UserPermissions
where up.Username ==
System.Environment.UserDomainName + "\" +
System.Environment.UserName
&& up.Publisher == PublisherInput
select up).Count();
if(PermsAvailable)
{
var NewBook = New Book with {.Title = TitleInput, .Publisher = PublisherInput};
db.Books.Add(NewBook);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4011 次 |
| 最近记录: |