Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к базе различных пользователей. Всё сначала. 
:(
    Опции темы
NURMS
Дата 15.2.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Народ привет.

Есть таблица, где хранятся логин, пароль, ну и допустим права доступа:

CREATE TABLE Users
(
Login VARCHAR(15) NOT NULL PRIMARY KEY,
Password VARCHAR(10) NOT NULL,
Access_Level CHAR(1) CHECK(Access_Level IN('1', '2', '3','4'))
)

К базе я цеплялся из C# так:

Код

try
{
       SqlConnection Con = new SqlConnection("Server=.; Database = DB1-Proc; Trusted_Connection = yes");
       Con.Open();
       SqlCommand cmd1 = new SqlCommand(textBox1.Text, Con);
       SqlDataReader Read1 = cmd1.ExecuteReader();
       DataTable dt1 = new DataTable();
       dt1.Load(Read1);
       dataGridView1.DataSource = dt1;
}
       catch (Exception ex)
{
       MessageBox.Show("ExecuteNonQuery fout :" + ex.Message, "SQL");
}

Теперь мне нужно сделать, чтобы получить доступ тогда, когда вводятся логин и пароль. Теперь думаю будет следующее. Коннекшен устанавливается, но сервер не обрабатывает запросы, пока не вводятся логин и пароль. А логи и пароль хранятся в таблице Users. Проверив пароль сервер уже даёт доступ. Где-то так:

ATHORITY ACC
GRANT RETREIVE {.....}
ON ...
TO
(
SELECT Login 
FROM Users
WHERE  Access_Level = '1'
)

Но я не пойму кем является для сервера тот, кто коннектнулся к базе, но ещё не ввёл логин, пароль. И как этому "кто-то" закрыть права на любые запросы к базе.

Может есть метод лучше?
PM MAIL   Вверх
v2v
Дата 15.2.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(NURMS @  15.2.2008,  23:07 Найти цитируемый пост)
Но я не пойму кем является для сервера тот, кто коннектнулся к базе, но ещё не ввёл логин, пароль. И как этому "кто-то" закрыть права на любые запросы к базе.

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


--------------------
PM   Вверх
swordfishik
Дата 16.2.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



может это тебе поможет 

Код

if (textBox1.Text == "" || textBox2.Text == "")
                {
                    MessageBox.Show("Заполните все поля!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    string con_str = "Data Source=[color=red]имя сервера[/color];Initial Catalog=[color=red]название базы[/color];Integrated Security=True";
                    SqlConnection Conn = new SqlConnection(con_str);
                    SqlCommand Comm = new SqlCommand();
                    Comm.Connection = Conn;
                    Comm.CommandText = "SELECT COUNT(*) FROM USER WHERE Login = @Login AND PWD = @PWD";
                    Comm.Parameters.AddWithValue("@Login", this.textBox1.Text);
                    Comm.Parameters.AddWithValue("@PWD", this.textBox2.Text);
                    Conn.Open();
                    try
                    {
                        if (Convert.ToInt32(Comm.ExecuteScalar()) > 0)
                        {
                            frmAdmin fmadm = new frmAdmin();
                            this.Visible = false;
                            fmadm.ShowDialog();
                        }
                        else
                        {
                            MessageBox.Show("Вы не являетесь зарегестрированым!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
   
                        }
                    }
                    catch (SqlException)
                    {
                        MessageBox.Show("Вы не являетесь зарегестрированым!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
   
                    }


вобщем принцип работы проверяется в таблице подходящие данные ПВД и ЛОГИН, если такие есть то открывает определенную форму


ТАБЛИЦА


create table USERS
(Nomer_poporadku int identity(1,1) primary key,
Login varchar(10),
PWD varchar(15))
PM MAIL   Вверх
akizelokro
Дата 18.2.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



И не совсем всё так..
Есть два варианта авторизации пользователей БД. Судя по приведенным примерам, вы используете авторизацию по учетной записи (плюсы и минусы метода..).
Второй способ, когда вы задаёте роли и пользователей БД, а также ограничения и права (плюсы и минусы..). При этом, втором способе, и можно как раз назначать права (или снимать) вплоть до работы с конкретными записями таблиц. (То же самое можно сделать и для первого варианта авторизации, но обычно этим мало кто заморачивается).
Приведенный в задаче вариант задания логинов и паролей используется для авторизации на уровне логики приложения (то же самое можно сделать и в первом абзаце, но для этого нужна сетевая база и время, чтобы в этом разобраться). На уровне логики приложения ты сам при создании кода пропичываешь "условные" роли и права, согласно которым уже и формируешь, например, список справочников, которые зарегиный пользователь может редактировать, только просматривать или вообще не имеет к ним доступа. При этом ты уже подключился к БД с использованием авторизации по учетной записи. А дальнейшие два варианта твоей авторизации, запрашивать логин с паролем в начале работы программы или после загрузки стартовой формы (или окна MDI-родителя), ты выбираешь сам. Не суть важно.

Цитата

Но я не пойму кем является для сервера тот, кто коннектнулся к базе, но ещё не ввёл логин, пароль. И как этому "кто-то" закрыть права на любые запросы к базе.

Любые права ты ему не закроешь smile , иначе он просто не подконнектится к базе. Здесь ты путаешь внутреннюю авторизацию БД, которой ты не пользуешься, и тобой созданную, дополнительную.


Это сообщение отредактировал(а) akizelokro - 18.2.2008, 09:19


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 18.2.2008, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



Цитата

которой ты не пользуешься

я неправ. формулировка точнее, - "которой ты пользуешься, но не подозреваешь об этом".


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
NURMS
Дата 20.2.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Я хочу чтобы проверка логина и пароля происходила не на форме C#, а отправлялись SQL серверу и тот уже после проверки давал доступ, и вырубал, если не верно. Т.к. допустим юзер, который "не юзер" коннектнулся, а вместо того запроса, который указан в форме на С#, отправит свой запрос, как-то взломав форму или своей написанной программой.
PM MAIL   Вверх
vretsky
Дата 20.2.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



настрой в SQL доступ к таблице Users, только для своих
вернее не только к таблице Users но наверное и ко всей БД.
только доступ на SELECT для Users тебе полюбому прийдется оставить для всех учетных записей 
юзеров твоего проекта.
таким же образом можно достаточно гибко настроить доступ к таблицам ,вьюхам и даже полям.
тогда не понадобится таблица Users, a аунтификация будет осуществлятся SQL сервером.
морочно зато надежно.

и рекомендую пароли в Users хранить в зашифрованном виде.

Добавлено через 9 минут и 27 секунд
хотя тебе крокодил все это уже подробно описал, че не понять?
для того чтобы считать данные из Users нужно иметь права на SELECT
из таблицы Users для данной учетной записи (или там группы), которая ничего общего
с логином из Users не имеет.
PM MAIL   Вверх
akizelokro
Дата 21.2.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



Цитата

Я хочу чтобы проверка логина и пароля происходила не на форме C#, а отправлялись SQL серверу и тот уже после проверки давал доступ, и вырубал, если не верно. Т.к. допустим юзер, который "не юзер" коннектнулся, а вместо того запроса, который указан в форме на С#, отправит свой запрос, как-то взломав форму или своей написанной программой. 


Ну вот, более- менее определились. Тебе с этим вопросом не в С#, а в "Базы данных", где ты должен спросить, как администрировать твою сетевую БД (создание ролей и пользователей). Если ты согласен пойти по этому варианту, то твою таблицу Users нужно удалять и в подключении менять вид авторизации с учетной записи на непосредственное указание логина\пароля. Если ты подобным не занимался, времени уйдет порядком. Зато интересно!

PS. Прежде чем грохать таблицу Users, убедись, что ты работаешь с сетевой БД и у тебя прав хватает на администрирование твоего экземпляра БД.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
NURMS
Дата 22.2.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Кстати о шифровании. Я тут пробовал зашифровать при вводе, где-то так: 

INSERT INTO Users VALUES (EncryptByPassPhrase('EncryptPass', 'Login'), EncryptByPassPhrase('EncryptPass', 'Password'))

Но он вместо обычного 0x05454sdasda64ds8f46d54sf6df8h4g65h, туда записал какой-то маленький мерзкий прямоугольник, и с расшифровкой что-то не катит.

И, как я понял, эту шифровку можно применять только к отдельным кортежам, а чтобы зашифровать столбец, создают ещё один столбец, и туда поочереди вгоняют уже зашифрованные. Нет ли какой-нибудь функции для "глобального" шифрования на уровне атрибутов?Да ещё алгоритм кодирования AES_256 и ниже не работают на данной системе Windows.
PM MAIL   Вверх
akizelokro
Дата 12.3.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



статьи 5.7, 5.8 Билла Гамильтона "ADO.NET Сборник рецептов"


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
IApple
Дата 18.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Код

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static public SqlConnection Conn; // этот конект раздавать всем компонентам в програме
        static public SqlConnectionStringBuilder SCSB;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            string Login = "";
            string PSW = "";
            try {
                // Начальная строка подключения  без параметров пароль и логин
                SCSB = new SqlConnectionStringBuilder("Data Source=(local)\sqlexpress;Initial Catalog=XXX;Integrated Security=False");
                // спросить логин-пароль
                DialogResult R = PswBox.GetPassword(ref Login, ref PSW); // это окно для запроса у пользователя строк Login и PSW
                if (R == DialogResult.OK)
                {
                    SCSB.UserID = Login;  
                    SCSB.Password = PSW;
                    Conn = new SqlConnection(SCSB.ConnectionString); // строка подключения уже с логином и паролем 
                                                                                                        // использовать по всей программе !!!
                    Conn.Open(); // попробовать конект, если не даст - значит логин-пароль плохой перейдет на catch  (Exception e)
                    Conn.Close();
                    // только теперь создаем главную форму
                    Application.Run(new MainForm());
                }
            }
            catch  (Exception e) {
                // какась ашибка при инициализации или логин-пароль плохой
            }
        }
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.