我创建了一个带登录和MS Access DB的小应用程序。在“用户”表中,我有字段“IsHeAdmin”。如果选中是,则不检查(是/否字段)。
现在,应用程序中的某些表单只能显示给管理员(已检查是/否字段的那些)。
检查用户是否为管理员的最佳方式是什么?
编辑:
有没有办法通过SQL命令检查? 例如:SELECT * FROM Users WHERE Username = current_logged_username AND IsHeAdmin ='Yes'。 如果是grat access,则msgbox“access denied”。
答案 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这样的东西。