Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/75: Рейтинг темы: голосов - 75, средняя оценка - 4.95
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
1

Реализация ролевого доступа к данным в программе

25.04.2016, 19:00. Показов 13668. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,делаю программу для склада с БД,программа с авторизацией и регистрацией,на скрине видно что есть роли,логин и пароль. В ролях админ,клиент и гость, так вот возникла проблемка-не знаю как мне роли разъединить так чтоб админ мог все изменять в программе, клиент мог только заказывать товар а гость ничего не мог изменять а только смотреть все в программе. будьте так добры помочь советом-не знаю как сделать так..
Миниатюры
Реализация ролевого доступа к данным в программе  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2016, 19:00
Ответы с готовыми решениями:

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

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

Шаблоны доступа к данным
Уважаемые, подскажите пожалуйста методики получения данных из БД. Использую EF для доступа к данным...

Ограничение доступа к данным
Подскажите пожалуйста. Используется база данных Firebird,среда разработки IBExpert,приложение на...

37
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
29.05.2016, 22:09  [ТС] 21
Author24 — интернет-сервис помощи студентам
ну у меня как я понимаю не локальная а серверная БД
0
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
29.05.2016, 22:27 22
У вас пытаются узнать архитектуру приложения - используете ли вы клиент-серверное приложение и с каким количеством звеньев. В случае использования серверов вам предлагают поэтапную валидацию, в зависимости от количества звеньев системы:
-2-х звенная - создать роли на стороне sql-сервера, возвращать данные о допустимости той или иной операции.
-3-х звенная - проверка сперва на стороне сервера приложения, затем согласно ролям на стороне sql-сервера, выполнение запроса.

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

По поводу авторизации - вам предлагали реализовать ее примерно следующим образом.
C#
1
2
3
4
SqlDataAdapter sda = new SqlDataAdapter("Select id From AVTORIZACIYA where username= '" + Box1.Text + "' and password ='" + Box2.Text + "'", con);
DataTable dt = new DataTable();
sda.Fill(dt);
UserData.IsAuthorized = true == dt.Rows.Count > 0;
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.05.2016, 22:35 23
Цитата Сообщение от АЛЕКСЕЙ_92 Посмотреть сообщение
у меня как я понимаю не локальная а серверная БД
Я сделаю с локальной, переделать проблем не будет, думаю
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.05.2016, 23:20 24
АЛЕКСЕЙ_92, смотрите прикрепленный проект в архиве. Это, конечно, примитив, но архитектуру вашей программы вы так толком и не рассказали, а для учебного задания, думаю подойдет.
Вложения
Тип файла: rar UserRolesDemo.rar (610.0 Кб, 75 просмотров)
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
29.05.2016, 23:32  [ТС] 25
ну так что мне делать то теперь,у меня проект готов а сдавать его через неделю,боюсь не успеть с ролями...
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
29.05.2016, 23:52  [ТС] 26
суть то в чем, в клиент сервере у меня сервер в котором вся БД и хранится,там же я ее и создавал,управление сервером происходит через SQL Server Management Studio 2008 R2
Миниатюры
Реализация ролевого доступа к данным в программе  
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
29.05.2016, 23:54  [ТС] 27
я делаю приложение с формами и главным входом авторизации через который заходим под ролями админа,клиента и гостя у которых свои возможности есть,вот я и спрашиваю вашей помощи как мне так сделать разделить под роли все
0
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
29.05.2016, 23:58 28
Код для получения роли пользователя, чьи данные были введены в поля логин-пароль. Находится в SQLiteDbHelper. Сопоставляет роль с перечислением в клиенте посредством запроса.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public RoleType GetUserRole(UserModel user) {
            string selectCmd = string.Format("SELECT * FROM Users WHERE name='{0}' AND password='{1}'",
                user.Name, user.Password);
            using (SQLiteConnection cnn = new SQLiteConnection(CONNECT_STR)) {
                cnn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(selectCmd, cnn)) {
                    using (SQLiteDataReader dr = cmd.ExecuteReader()) {
                        if (!dr.HasRows) {
                            throw new Exception("User not exists!");
                        }
                        dr.Read();
                        RoleType role = (RoleType)Enum.Parse(typeof(RoleType), dr["role"].ToString());
                        return role;
                    }
                }
            }
        }
Событие кнопки "Вход" формы авторизации. Заносит данные в модель.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void btnAuth_Click(object sender, EventArgs e) {
            try {
                if (string.IsNullOrWhiteSpace(txtName.Text) || string.IsNullOrWhiteSpace(txtPassword.Text)) {
                    MessageBox.Show("Заполните обязательные поля!", "Ошибка ввода");
                    return;
                }
                SQLiteDbHelper dbHelper = new SQLiteDbHelper();
                UserModel user = new UserModel {
                    Name=txtName.Text,
                    Password=txtPassword.Text
                };
                RoleType role = dbHelper.GetUserRole(user);
                user.Role = role;
                Settings.Instance.User = user;
                StartMainForm();
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message, "Ошибка");
            }
        }
Запрос полей по введенным данным. Если пользователь не существует, возвращает исключение.
C#
1
throw new Exception("User not exists!");
У вас, по сути, есть база, на которую вы можете наращивать функционал вашего приложения. Для работы с sql-сервером в большинстве случаев достаточно заменить SQLite на Sql и соответствующее пространство имен.
C#
1
using System.Data.SqlClient
Остальное интуитивно понятно.
2
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
30.05.2016, 00:11  [ТС] 29
первый ваш код не пойму куда вставить надо?второй так понимаю в кнопку вход надо вставить
0
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
30.05.2016, 00:30 30
Ничего никуда не надо вставлять, я описал частично проект, который вам скинули. Там есть все, что вам необходимо в рамках заданного вопроса, достаточно сделать на его основе свое приложение - добавить ваши формы, методы и запросы, реализующие функционал. В этот же проект, если не хотите переносить данный код в свой.
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
30.05.2016, 00:37  [ТС] 31
у моего проекта я все знаю что от куда и куда а у него надо разбираться что где и когда,будь добр подскажи как мне поколдовать так же над своим проектом
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
30.05.2016, 00:47 32
Цитата Сообщение от АЛЕКСЕЙ_92 Посмотреть сообщение
у моего проекта я все знаю что от куда и куда
Вот видите, вы знаете, а мы-то нет. Вы задали вопрос по ролевому доступу - ответ вам дан. А что и как в вашем приложении должно дальше функционировать - об этом вы не рассказывали.
Золотое правило вы забыли: правильно поставленный вопрос - половина ответа.
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
30.05.2016, 00:53  [ТС] 33
дальше идти смысла нет когда вход у меня не ролевой,я свой код выложил вам а вы мне свой даете, в итоге получается я вам про Фому а вы мне про Ерему))я лишь у вас прошу помощи как мне свой код переделать а вы мне другое приложение делаете
0
52 / 39 / 29
Регистрация: 08.04.2016
Сообщений: 126
30.05.2016, 01:19 34
АЛЕКСЕЙ_92,

Ок, допустим где-то выше в Вашей программе объявлен класс, чтобы хранить роль успешно залогинившегося пользователя:

C#
1
2
3
4
    public static class Role
    {
        public static string Name = String.Empty;
    }
Ок, вот ваше окно авторизации:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"Data Source=KUPLYANIN-ПК;Initial Catalog=SKLAD_GAZPROMA;Integrated Security=True");
 
            // запрос в SqlDataAdapter нужно переделать, чтобы он возвращал не Count(*), а имя роли, для этого надо знать структуру БД
            SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From AVTORIZACIYA where  username= '" + textBox1.Text + "' and password ='" + textBox2.Text + "'", con);
 
            DataTable dt = new DataTable();
            sda.Fill(dt);
 
            // допустим запрос возвращает имя роли из трех имеющихся (допустим, что это такие имена: "guest", "client", "admin")
         
            Role.Name = dt.Rows[0][0].ToString();
            
            if (Role.Name.Length != 0)
            {
                Form3 f2 = new Form3();
                f2.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("НЕВЕРНЫЕ ДАННЫЕ!!!ПОВТОРИТЕ ПОПЫТКУ!!");
            }
        }
Далее, допустим открываем форму, чтобы сделать заказ, т.е., вероятно, Form7 f2 = new Form7();

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void Form7_Load(object sender, EventArgs e)
{
        if(Role.Name.Equals("guest"))
        {
            // здесь всем полям для ввода данных ставим Enabled = false;
        }
        
        // админ и клиент тут могут заказывать, значит в этом случае ничего менять не надо
        // если же для клиента нужна какая-то специальная обработка, так и пишем:  
        if(Role.Name.Equals("client"))
        {
            // тут делаем все, что нужно для клиента
        }
}
1
46 / 46 / 32
Регистрация: 10.05.2013
Сообщений: 180
30.05.2016, 01:29 35
Вам из того кода только авторизация и нужна. В случае успешной авторизации пользователю приложения будет назначена соответствующая роль бд и загружен необходимый интерфейс. Вам достаточно реализовать эти самые три интерфейса - для админа, пользователя и гостя.

Но если вам нужно на примере вашего кода и максимально просто, то пожалуйста. Создайте класс UserData, объявите там переменные типа string и bool, которые будут хранить тип учетной записи и статус авторизации.
C#
1
2
public static bool IsAuthorized { get; set; }
public static string RoleType { get; set; }
При авторизации пользователя, как вы делали ранее, заносите данные в поля класса UserData.
C#
1
2
3
4
5
6
7
8
9
10
SqlDataAdapter sda = new SqlDataAdapter("Select Role From AVTORIZACIYA where username= '" + Box1.Text + "' and password ='" + Box2.Text + "'", con);
DataTable dt = new DataTable();
sda.Fill(dt);
if(dt.Rows.Count > 0)
{
   foreach (DataRow row in dt.Rows) { UserData.TypeRole = row["Role"].toString(); }
   UserData.IsAuthorized = true;
}
else
{ MessageBox.Show("User not exists"); UserData.IsAuthorized = false; }
Далее делаете проверку - если авторизация пройдена, открыть главную форму. По загрузке главной формы проверками в зависимости от типа учетной записи (UserData.TypeRole) блокируете ненужный данному пользователю функционал.

"Роль" в данном случае - просто значение столбца таблицы бд, который описывает уровень доступа данного пользователя.
1
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
30.05.2016, 23:16  [ТС] 36
спасибо большое вам обоим,у обоих взял из кода по чуть-чуть и создал себе шедевр для входа,теперь пойду дальше в формах ограничивать ролям доступ

Добавлено через 49 минут
private void Form7_Load(object sender, EventArgs e)
{
if(Role.Name.Equals("guest"))
{
// здесь всем полям для ввода данных ставим Enabled = false;
}

// админ и клиент тут могут заказывать, значит в этом случае ничего менять не надо
// если же для клиента нужна какая-то специальная обработка, так и пишем:
if(Role.Name.Equals("client"))
{
// тут делаем все, что нужно для клиента
}
}


как мне это понять,когда поля для ввода есть но как их в коде то вывести?

Добавлено через 9 минут
может как на кнопке ограничить можно-когда гость во все поля заносит значения а на кнопку жмет и в таблицу ничего заказ не заносится??
0
3 / 3 / 0
Регистрация: 01.06.2014
Сообщений: 130
01.06.2016, 18:19  [ТС] 37
помогите пожалуйста с проблемкой
0
52 / 39 / 29
Регистрация: 08.04.2016
Сообщений: 126
01.06.2016, 18:55 38
Цитата Сообщение от АЛЕКСЕЙ_92 Посмотреть сообщение
как мне это понять,когда поля для ввода есть но как их в коде то вывести?
Ну вот, допустим, у Вас на форме для ввода заказа есть 2 TextBox и кнопка (далее названия приведены просто в качестве примера):
textBoxSum - сумма заказа
textBoxNum - номер заказа
buttonOrder - кнопка, при щелчке на которую оформляется заказ

Если заходит гость, нужно сделать так, чтобы он не мог ничего ввести на форме:

C#
1
2
3
4
5
if(Role.Name.Equals("guest"))
{
  textBoxSum.Enabled = false;
  textBoxNum.Enabled = false;
}
В обработчике события клика по кнопке "Заказать" тоже можно сделать проверку гость это или нет:

C#
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
  if(Role.Name.Equals("guest"))
  {
    MessageBox.Show("Guest can't make order!");
    return;
  }
}
1
01.06.2016, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2016, 18:55
Помогаю со студенческими работами здесь

Технологии доступа к данным
Помогите сделать прогу по курсовой. Тема курсовой "Технологии доступа к данным"

Ограничение доступа к данным
Доброго времени суток! Что то я не пойму почему не получается условие такое поставить? Насколько я...

Cлой доступа к данным.
Всех с наступающими Новым Годом!! Нужно написать слой доступа к данным. Т.е. с какого-либо...

Разграничение доступа к данным в отчете
Подскажите как лучше разграничить доступ к отчету: Вводные данные: Есть отчет, в который попадают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru