Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Базы данных под .NET > Авторизация пользователей |
Автор: Redstuff 14.8.2007, 13:13 | ||
Есть БД с таблицей users. На форме: txtLogin, txtPassword, btnLogin, btnRegistration (при нажатии на btnRegistration появляются: txtFName, txtLName, txtPhone, btnSend)
Самому первому зарегистрировавшемуся пользователю присвоить все права (RAdmin = true) остальным присваивать (RAdmin = false) Потом первый пользователь сможет принимать решения кому назначать еще права администратора. Пользователям нельзя редактировать и недоступны некоторые функции программы (назначение прав...) С вашей помощью хочеться реализовать такое. |
Автор: Exception 14.8.2007, 13:16 |
А в чём, собственно, проблема? |
Автор: Redstuff 14.8.2007, 13:26 |
Exception, хочеться реализовать так, чтобы было универсально и граммотно. Чтобы присвоить права только первому пользователю как лучше поступить? Сделать проверку на значение в БД и если такое есть то присваивать только RAdmin = false? |
Автор: Exception 14.8.2007, 14:19 |
Просто проверяй количество записей в таблице. Если их нет -- устанавливай у новой записи флаг в true, если есть хоть одна -- в false. А вообще, о том, как грамотно реализовать авторизацию, смотри тут: http://www.codeguru.com/csharp/.net/net_security/authentication/article.php/c7415/ Добавлено через 7 минут и 58 секунд http://www.codeguru.com/dbfiles/get_file/RetrieveSecurity_src.zip?id=7415&lbl=RETRIEVESECURITY_SRC_ZIP&ds=20040618 -- готовая программа-пример. |
Автор: Redstuff 14.8.2007, 14:35 | ||
Вот что пока получается:
Ошибка: Must declare the scalar variable "@ID" Добавлено через 2 минуты и 11 секунд Пока писал сообщение даж не заметил, Exception, спасибо за примеры буду разбираться с ними тоже) |
Автор: Exception 14.8.2007, 15:03 |
Наверное, ты имел в виду "WHERE ID = @Original_ID" ![]() |
Автор: Redstuff 14.8.2007, 19:07 | ||
Exception, если честно то не могу понять где ошибка все-равно ![]() ID (is identity = true, и Primery key)
Сделал проверку, заполнил датасет и вывел его в датагрид все ок! Но вот обновить БД не получается((( Код взят из книги Майк Гандерлой, Джозеф Джорден, ... SQL Server 2005 Если можно, объясните плиз как лучше через код использовать эти все команды и чутка комментарий к строчкам)... а то авторы книги, на комментарии к коду, времени не тратили (( Добавлено через 3 минуты и 36 секунд Еще куда фак пропал? там была хорошая статья про SQL запросы, мне бы она сейчас очень пригодилась ![]() |
Автор: Redstuff 14.8.2007, 19:32 | ||
Обновилась после добавления всего этого... Проще можно решение? |
Автор: tol05 14.8.2007, 20:34 | ||||
тебе же Exception, написал, у тебя синтаксическая ошибка в строке запроса вместо
нужно
|
Автор: Redstuff 14.8.2007, 21:21 |
tol05, я уже так пробовал, не помогает... таже ошибка (( Ошибка: Must declare the scalar variable "@ID" |
Автор: Idsa 15.8.2007, 04:32 |
У тебя, видимо, не одна ошибка. Верни @ на место ![]() В какой строчке? P. S. А ты какую СУБД используешь? |
Автор: Redstuff 15.8.2007, 10:41 | ||
Idsa, в http://forum.vingrad.ru/index.php?showtopic=168133&view=findpost&p=1225302
MS SQL Server 2005 |
Автор: Idsa 15.8.2007, 15:22 | ||||
Так ты же добавляешь параметры, а значения им не присваиваешь. Кроме того, int весит 4 байта, а не 1. Да и вообще, размер для int указывать не нужно. Для добавления параметров тебе следует использовать, например, следующий код:
В случае использования int можно забить на size (для varchar так лучше не делать), да и тип автоматически определится, поэтому можно использовать короткую запись:
|
Автор: Redstuff 15.8.2007, 17:46 | ||
Все теперь понятно почему ошибка. Намудрил кучу всего лишнего, датасет зачем-то привизал. Idsa, спасибо! буду знать на счет типа.
С этим разобрался! Теперь необходимо проверить есть ли такой пользователь в БД и какие у него права. Если все ок, то открыть следующую форму с наличием на ней того функционала который полагается пользователю с его правами. Как осуществить проверку? Есть только одна мысль - сравнить txtLogin со столбцом Login, если нашел запомнить номер ID/строки и сверить пароль находящийся там с txtPassword. |
Автор: Redstuff 15.8.2007, 20:22 | ||||
Действительно на SQL запросе лучше)
dr.Read() - одно чтение строки и продвижение вперед?
Это не понял как реализовать. Поэтому при правильном логине и пароле выдает всегда Admin. |
Автор: Idsa 15.8.2007, 21:00 | ||||
Не "и", а "или".
dr.Read() всегда будет равен true при первом Read, т. к. до этого ты проверил, что HasRows != false. Это так, отступление. Вообще здесь (в else) должен быть другой код. Например:
Теперь ты знаешь, админ ли авторизовавшийся пользователь. |
Автор: Redstuff 15.8.2007, 23:45 | ||||||
У меня так не хотело работать, пробовал так еще до этого примера ![]() Работает только так:
Но все-равно спасибо! ![]() |
Автор: Exception 16.8.2007, 01:51 |
Тьфу, можно было красиво реализовать через role-based security. Я же дал ссылки. |
Автор: Redstuff 16.8.2007, 09:50 |
Exception, за ссылочки правдо спасибо, но пока для меня там все кажется так наворочено. |
Автор: Redstuff 16.8.2007, 10:42 |
Exception, а есть уже готовая БД с того примера? я с картинки БД постарался у себя воссоздать, но не знаю какой тип для некоторых полей. Ввожу пароль и логин (завел уже в базе), но сообщение о правах выскакивает. |
Автор: Idsa 19.8.2007, 19:45 | ||||
Зачем мудрить? Логика у нас уже реализована. Осталось заменить использование булевой переменной isAdmin на role-based подход. Хотя по большому счету я не вижу необходимости использовать роли в данном примере, т. к. тщательная реализация ролей потребует анализа того, что можно и чего нельзя тому или иному типу пользователей (а если код пишется без предварительного проектирования, то на данный момент это может быть затруднительно)... а у нас всего 2 типа пользователей, так что игра не стоит свеч. Если все-таки очень сильно хочется... заменяем код определения типа пользователя на следующий код:
Тогда в любом месте программы узнать тип пользователя можно будет вот так: if (Thread.CurrentPrincipal.Identity.Name == "Administrator") ... Вместо ролей конструктору GenericPrincipal я передаю null... Это несколько нивелирует преимущество использования role-based подхода. Хорошо было бы лишить код этого недостатка (это я оставляю на совести автора программы ![]() |
Автор: DEADLY 30.12.2009, 11:34 |
а как получить имя пользователя??? |