Предоставить доступ к специальным формам только администраторам - PullRequest
3 голосов
/ 26 июня 2011

Я создал небольшое приложение с логином и MS Access DB.В таблице «Пользователи» у меня есть поле «IsHeAdmin».Если проверено да, в противном случае не проверено (поле да / нет).

Теперь некоторые формы в приложении должны показываться только администраторам (те, у которых выбрано поле да / нет).

Как лучше всего проверить, является ли пользователь администратором или нет?

EDiT:

Есть ли способ проверить это командой SQL?Например, как: SELECT * FROM Users WHERE Имя пользователя = current_logged_username И IsHeAdmin = 'Да'.Если да, то получите доступ, иначе msgbox "доступ запрещен".

Ответы [ 3 ]

1 голос
/ 26 июня 2011

Я рекомендую использовать встроенную функцию в 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;
        }
    }
}
0 голосов
/ 26 июня 2011

Когда пользователь входит в систему, вы извлекаете объект User из базы данных.Пока он зарегистрирован, вы сохраняете этот объект где-то видимым.Этот объект имеет свойство IsHeAdmin, основанное на столбце в базе данных.Когда пользователь пытается открыть такое окно, вы проверяете это свойство и либо показываете окно, либо нет.Еще лучше было бы, если бы кнопка (или любая другая), открывающая окно, была бы отключена для не-администраторов.

Это имеет тот недостаток, что когда пользователь становится администратором или перестает быть администратором, вы должныснова войдите в систему, чтобы изменения вступили в силу.

Но не забывайте, что если это единственная защита, которая у вас есть, и вы, например, отображаете некоторые конфиденциальные данные из базы данных в формах, даже неАдминистраторы смогут получать те же данные с помощью обычных запросов SQL в чем-то вроде студии управления SQL-сервером.

0 голосов
/ 26 июня 2011

Что бы я сделал в этой ситуации: я просто отключаю кнопки / пункты меню для доступа к формам администратора, когда пользователь входит в систему, а он не является администратором. Затем вам нужно проверить, является ли пользователь admin только один раз - при входе в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...