LINUX.ORG.RU

Symfony and sessions

 , ,


0

1

Уважаемые знатоки symfony и php. Поправьте меня пожалуйста, а то по мне кажется допускаю ошибку в логике приложения. Есть функция login, вернее вот кусок из неё что создает сессию

$session = new Session();
$session->start();
$session->set('user', 'тут id юзера после всех удачных проверок');

Для нормальной работы cookie с названием PHPSESSID в config.yml дописал -

framework:
    session:
        cookie_lifetime: 43200
        gc_maxlifetime: 43200

Есть некая функция check - которая проверяет может ли пользователь заходить на конкретный url,

$session = new Session();
$session->start();
$id = $session->get('user');
if(isset($id)){
            $user = $model->getUserInfo($id);
            $response->setContent(json_encode($user));
        }
Тут смотрю есть ли переменная сессии user ну и вытягиваю id и по id возвращаю необходимую инфу с базы. И еще есть функция logout:
$session = new Session();
        $session->start();
        $id  = $session->get('user');
        $session->clear();
        $session->invalidate();
        $response->headers->clearCookie('PHPSESSID');

Это лишь части кода, но можете сказать правильно ли я реализую вообщем это механизм или где стоит добавить лишние проверки или где что убрать?


Сразу признаюсь честно, я понятия не имею, как оно работает в самом фреймворке, но по идее у тебя должен быть зарегистрирован обработчик для события, который устанавливает сессию в запрос: https://github.com/symfony/HttpKernel/blob/master/EventListener/SessionListen...

И сессию ты теперь должен получать из запроса.

Есть некая функция check - которая проверяет может ли пользователь заходить на конкретный url

Здесь вообще что-то непонятное происходит. Если ты не в курсе, то там есть компонент Security, который предоставляет TokenStorage. Ты получаешь токен из этого хранилища, а из токена берёшь юзера. Чтобы проверить, открыт ли доступ для пользователя, есть AuthorizationChecker, ты у него вызываешь метод isGranted('Какая-то роль') и если оно вернуло false, то доступ закрыт. Чтобы эта штука заработала, надо сконфигурировать файрволл, запилить провайдер для пользователей, который будет доставать их из базы. Возможно ещё что-то надо будет настроить. Не помню.

Раньше там вместо TokenStorage и AuthorizationChecker был SecurityContext, но он уже deprecated, потому его использовать не рекомендуется, так как он будет удалён в третьей версии.

Короче говоря читай доку и все вопросы отпадут.

Kilte ★★★★★
()

Logout насколько я помню, осуществлялся через файрволл, тебе просто нужно указать урлу в конфиге и всё.

Где это описано в доке symfony не подскажу, зато знаю точно, что в Silex именно так: http://silex.sensiolabs.org/doc/providers/security.html#adding-a-logout

Kilte ★★★★★
()
Ответ на: комментарий от Kilte

Некоторые инструменты с коробки думаю мне не подойдут, у меня отдельное приложение на angular которое дергает данные с back-end, и php у меня не отвечает за рендер html и к примеру стандартные формы мне не подойдут.

Berdin
() автор топика
Ответ на: комментарий от Berdin

А вот тут уже только гугл.

Я не знаю, может и есть простой способ заставить работать только с json, но мне пришлось пройти целый квест, чтобы это сделать.

Придётся переопределить некоторые сервисы: https://github.com/Kilte/Trillium/tree/master/source/Trillium/Service/Security

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

Если интересно, я запилил себе небольшой фреймворк на основе компонентов Symfony и там я отказался от Security, вернее оставил только security-core. Посмотреть можно тут.

Kilte ★★★★★
()
Ответ на: комментарий от codekeeper

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

Berdin
() автор топика
Ответ на: комментарий от codekeeper

Как тогда правильно поступить? Чисто cookie гонять не совсем хорошо, а token строка считай тоже cookie написанные на коленке

Berdin
() автор топика
Ответ на: комментарий от Berdin

Сервер не должен хранить информацию о состоянии клиента. Потому только токены. Можно использовать и куки, но с ними могут возникуть проблемы. Помнится я тебе в одном из твоих тредов про авторизацию в ангуляре скидывал ссылку на пост, где описываются преимущества токенов перед куками.

Kilte ★★★★★
()
Ответ на: комментарий от Kilte

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

Berdin
() автор топика
Ответ на: комментарий от Berdin

Так ты определись для начала, у тебя чисты рест и клиент на ангуляре или смешаная реализация? От того и нужно отталкиватся. Токен генерировать нужно каждый раз когда клиент логинится на сайте, а основную инфу для авторизации можно в localStorage запихнуть. Короче для начала разберись с задачей, а то она у тебя не четко поставленна.

codekeeper
()
Ответ на: комментарий от codekeeper

У меня отдельный клиент на angular , там angular отвечает за routes и так далее , symfony не участвует в рендере шаблонов. Есть actions которые принимают запросы с front-end , вытягивают нужные данные и json-ом отправляют их на front-end.

Berdin
() автор топика
Ответ на: комментарий от Berdin

Значит создаешь два роута, на авторизацию и аунтефикацию, первы не требует токен, второй требует. На ангуляре проверяешь если токе и токен на валидность, в случае неудачи вываливаешь форму на авторизацию, забираешь токен и кладешь его в localStorage. Токен при авторизации каждый раз генеришь новый. Вот и все.

codekeeper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.