只允许管理员访问特殊表单
本文关键字:表单 访问 管理员 | 更新日期: 2023-09-27 18:00:20
我创建了一个带有登录和MS Access DB的小型应用程序。在表"Users"中,我有字段"IsHeAdmin"。如果勾选"是",则不勾选"否"(是/否字段)。
现在,应用程序中的一些表单只显示给管理员(勾选了"是/否"字段的表单)。
检查用户是否为管理员的最佳方法是什么?
EDiT:
是否有某种方法可以通过SQL命令进行检查?例如:SELECT*FROM Users WHERE Username=current_loged_Username AND IsHeAdmin="是"。如果是,则发送"拒绝访问"的消息框。
我建议在IPrincipal.IsInRole(role)
中使用内置功能。
一个简单的实现示例:
class User : IPrincipal
{
private readonly bool IsAdmin;
// or better
private readonly string[] roles; // or HashSet<string> to speed up lookup
public User(string name)
{
// fetch and fill from db
}
bool IPrincipal.IsInRole(string role)
{
return role == "admin" && this.IsAdmin;
// or better
return this.roles.Contains(role);
}
}
用法:
var user = new User("Joe");
if (user.IsInRole("admin"))
// do stuff
else
throw new SEcurityException("Insufficient rights");
也可以硬编码角色矩阵:
[AccessAttribute(Roles.Administrator)]
class AdminForm : BaseForm { }
abstract class BaseForm
{
protected override void OnLoad(EventArgs e)
{
CheckAccess(); //check current user against attribute of form
base.OnLoad(e);
}
}
enum Roles
{
Administrator,
User
}
class AccessAttribute : Attribute { }
class User
{
private bool? isAdmin;
public bool IsAdmin
{
get
{
if (!isAdmin.HasValue) // better to move to private static method
{
bool b = false;
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "select IsHeAdmin from Users where Name = @UserName";
command.Paratemters.AddWithValue("@UserName", this.Name);
connection.Open();
b = command.ExecuteScalar() as bool? ?? false; // if null then false, otherwise assign the value
}
isAdmin = b;
}
return isAdmin.Value;
}
}
}
在这种情况下我会做什么:当用户登录时,我只是禁用按钮/菜单项来访问管理表单,而他不是管理员。然后你只需要在登录时检查一次是否是用户管理员。
当用户登录时,您将从数据库中检索User
对象。只要他登录了,你就可以在某个地方看到那个对象。此对象具有基于数据库中的列的IsHeAdmin
属性。当用户试图打开这样的窗口时,请检查该属性,然后显示或不显示该窗口。如果打开窗口的按钮(或其他任何按钮)对非管理员禁用,那就更好了。
这样做的缺点是,当用户成为管理员或不再是管理员时,您必须再次登录才能使更改生效。
但不要忘记,如果这是您拥有的唯一保护,并且您在表单中显示了数据库中的一些敏感数据,那么即使是非管理员也可以在SQL server management studio中使用普通SQL查询检索相同的数据。