仅授予管理员访问特殊表单的权限

时间:2011-06-26 15:12:21

标签: c# .net winforms security

我创建了一个带登录和MS Access DB的小应用程序。在“用户”表中,我有字段“IsHeAdmin”。如果选中是,则不检查(是/否字段)。

现在,应用程序中的某些表单只能显示给管理员(已检查是/否字段的那些)。

检查用户是否为管理员的最佳方式是什么?

编辑:

有没有办法通过SQL命令检查? 例如:SELECT * FROM Users WHERE Username = current_logged_username AND IsHeAdmin ='Yes'。 如果是grat access,则msgbox“access denied”。

3 个答案:

答案 0 :(得分:1)

我建议在IPrincipal.IsInRole(role)使用内置功能。<​​/ p>

示例简单实现:

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;
        }
    }
}

答案 1 :(得分:0)

在这种情况下我会做什么:我只是在用户登录时禁用按钮/菜单项来访问管理表单,而他不是管理员。然后你需要在登录时检查用户管理员一次。

答案 2 :(得分:0)

当用户登录时,您将从数据库中检索User对象。只要他登录,您就可以将该对象保持在可见的位置。此对象具有IsHeAdmin属性,基于数据库中的列。当用户尝试打开此类窗口时,您检查该属性并显示该窗口。如果打开窗口的按钮(或其他)对非管理员禁用,那就更好了。

这样做的缺点是,当用户成为管理员或停止成为管理员时,您必须再次登录才能使更改生效。

但是不要忘记,如果这是您拥有的唯一保护,并且您例如在表单中显示来自数据库的一些敏感数据,那么即使非管理员也能够使用普通的SQL查询检索相同的数据像SQL server management studio这样的东西。