минимальное управление сессиями для единого входа? - PullRequest
1 голос
/ 02 марта 2011

Я написал веб-приложение C / CGI для бронирования предметов.Мой клиент запросил, чтобы я добавил функцию «администратор», где авторизованный пользователь может удалять и изменять данные, а те, кто нет, могут добавлять только данные.Это намного проще в концепции, чем в большинстве реализаций входа в систему, поскольку существует только пароль, и фактически только два состояния, «анонимный» и «admin».

Я пришел из PHP-фона, где управление сессиями так же просто, какsession_start(), и я могу мгновенно поиграть с $_SESSION.Конечно, в C / CGI нет ничего такого встроенного.Я хотел бы избежать добавления зависимости библиотеки CGI (я уже зависим от glib, confuse и libmysqlclient, плюс мне интересно узнать об управлении сессиями).

Какой самый простой способ сделать на основе пароляуправление сеансами в C / CGI, без необходимости использования нескольких пользователей, больших объемов данных сеанса или чего-либо сложного?

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Сеанс подразумевает сохранение состояния на стороне сервера.Поскольку у вас нет пользователей, я думаю, вы хотите, чтобы это было проще.В таком случае это может сделать подписанный файл cookie с датой истечения срока действия.Этот туториал покажет, как это сделать с Python:

http://webpython.codepoint.net/cgi_cookie

1 голос
/ 02 марта 2011

Сначала вы должны решить, как вы собираетесь сохранять состояние в браузере: собираетесь ли вы использовать файл cookie сеанса или передавать маркер сеанса на каждой странице?Если вы идете по пути cookie, вам не нужно менять свои страницы и формы, но вам нужно добавить управление cookie, если его еще нет (будьте осторожны, используя сеанс + httpOnly cookie)

Тогда выдолжен решить, как получить данные о состоянии на сервере: если вы уже используете базу данных, вы можете добавить таблицу «SESSION» со столбцами «SESSION_ID» и «EXPIRATION_DATE» + вторую таблицу с именем «SESSION_DATA» со столбцами »SESSION_ID "," KEY "," VALUE ".

Теперь вам «просто» нужно создать несколько простых функций:

int session_createNewSession(long& session_id, long duration)
int session_setValue(long session, char[] key, char[] value)
int session_getValue(long session, char[] key, char[] value)
int session_abandonSession(long session)

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

Теперь, когда у вас установлена ​​система сеансов, все остальное довольно просто:

  • createформа входа в систему
  • в вашем cgi обрабатывает полученные данные, проверяя, правильно ли введены логин / пароль (хотя не храните пароли в БД: сохраните соленый хеш)
  • , если соединениевсе в порядке, сохраните идентификатор пользователя в сеансе (или в вашем случае вы можете просто сохранить значение «IsAdmin»)

Вы могли бы сделать на самом деле проще: просто session_createNewSession (long & session_id, int isAdmin) было бы достаточно в вашем случае (только с одной таблицей базы данных), но ваш клиент, вероятно, будет запрашивать больше функций с течением времени, не так ли?

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

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