只允许管理员访问特殊表单

本文关键字:表单 访问 管理员 | 更新日期: 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查询检索相同的数据。