|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Здравствуйте, Я пытаюсь понять, смогу ли я сделать следующее. У меня настроен Spring Security. Cтандартный процесс авторизации через фильтры на основе заголовка Auth. С отдельными сессиями для пользователей и админов. Все это отлично работает, если у меня есть фронтенед и бекенд отдельно. До сих пор так было. Сейчас я хочу фронтенд и бэкэнд в одном проекте? Например Spring + Tymeleaf. Как я могу контролировать Auth Request Header, чтоб сохранить существующий порядок вещей? В этом случае страницы рендерятся на сервере, и у меня нет возможности управлять Auth Request Header. Как и что мне нужно перенастроить, чтобы использовать существующий механизм безопасности? Или в данном случае я могу настроить Spring Security только с помощью Spring Session? Или как быть в данном случае? Спасибо за советы и полезные ссылки. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 08:13 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
_webdev_ В этом случае страницы рендерятся на сервере, и у меня нет возможности управлять Auth Request Header. вот как ты это решил? Расскажи. Разве JSP \ Spring или другой MVC не рендерятся на сервере? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 11:43 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
_webdev_, рисуй схему запроса GET. Рассказывай подробнее в чем проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 11:44 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Проблема очень "простая". У меня немного отсуствуеть звенье в цепочке. Никогда не делал приложений где фронт и бек в одной упаковке. Раньше был ангуляр в котором я посылал запрос на логин к серверу POST Сервер проверял всё, создавал секюрити контекст, выдавал юзеру токен. С этим токеном я образался к зашищенным ресурсам. У меня всё по спринговски. вот как-то так. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Всё работает как надо. Теперь когда в одном проекте. я немного не понимаю, как мне при запросе вставить хедер, чтоб он уже был видим в фильтре, когда ещё не дошёл запрос к контроллеру? Вот например, логин. Я немного не понимаю, как передавать токен и как потом с ним работать? Надеюсь, так моя проблема понятней. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Что я должен сделать при логине, чтоб сл запрос содержал в себе хедер с токеном? и проверялся фильтрами при доступе к dashboard? Это пока такой, быстрый тестовый вариант. Я не создаю секюрити контекст пока. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 15:43 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Как делпоится бек и фронт - вообще не важно. Страница всегда загружается в браузере, запрос всегда уходит на апп сервер. Так что хоть ты генерируешь страницы на сервере с помощью Tymeleaf/JSP/Velocity/etc, хоть с помощью JS - ты можешь продолжать в любом случае использовать JS и слать AJAX POST запрос. Это не взаимоисключающие вещи. Альтернатива такому подходу (когда запросы шлет JS): HTML формы . Сам браузер будет формировать список параметров исходя из данных в форме и отсылать такой запрос на BE. Со стороны BE мы проверяем креды и устанавливаем SESSIONID в куках response header'a (это как раз делает Spring Security). Ну и делаем редирект на какую-то страницу после удачного логина. авторСервер проверял всё, создавал секюрити контекст, выдавал юзеру токенКакой токен? Счас речь не про OAuth2 случайно? Или все таки может SESSIONID а не токен? И что за Auth, может Authorization header ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 18:41 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, Спасибо за ответ. Я думаю, тут немного проблема с определениями. авторСо стороны BE мы проверяем креды и устанавливаем SESSIONID в куках response header'a (это как раз делает Spring Security). - Вот. Давай вот о этом поговорим. SESSIONID(Spring Session) я вижу. Но У меня например кастомный хедер куда я после удачного логина кладу токен/SESSIONID(можно как угодно назвать), это просто рандомный стринг. Я залогинился, записал My-X-Auth хедер в response. Сделал редирект на dashboard. В request хедер My-X-Auth отсутствует. Я понимаю, что я секюрити могу сделать со (Spring Session), но хочу понять, могу ли я сделать так как я делал раньше. авторКакой токен? Счас речь не про OAuth2 случайно? Или все таки может SESSIONID а не токен? - Нет. Как и писал выше - SESSIONID / токен - это просто рандомный стринг который определяет сессию. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 18:54 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
_webdev_, авторИ что за Auth, может Authorization header - Да, только он у меня кастомный и называется например "My-X-Auth" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 19:34 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Да, давай сначала в терминологии и подходах разберемся. При логине нам нужно создавать HTTP Session (речь даже не про спринг). По сути все сводится к: 1. Если имя/пароль верные, то сервер обратно браузеру в Response Headers отдает куки. Назовем ее SESSIONCOOKIE. 2. Т.к. кука - это такой хедер, который с каждым запросом шлется на сервер, то этот SESSIONCOOKIE теперь и будет приходить со всеми последующими на наш сервер. 3. Когда мы на сервере генерили эту SESSIONCOOKIE, то мы ассоциировали ее с каким-то состоянием (как правило за нас это делает Tomcat, мы просто дергаем метод getSession()). Т.е. под капотом у нас есть мапа: Map<String, SessionContent> - в этой мапе ключом является SESSIONCOOKIE, а значением - ну что захотим. Обычно там хранится как минимум имя пользователя который эту сессию создал. 3.1 И т.к. с клиента нам пришел SESSIONCOOKIE, то мы можем проверить есть ли такой ключ в мапе, и если есть - вытащить имя пользователя. Да, название куки не принципиально - это может быть SESSIONID или Auth. Но все-таки мы привыкли называть его SESSIONID, другое название может сбить с толку. Но важно что он не является отдельным хедером, он хранится внутри хедера Cookies. Именно его браузер сохраняет и сам будет добавлять в каждый запрос. И именно из него сервер будет его потом доставать. Если же ты создашь просто хедер SESSIONID, то JS может его и получит, однако после рефреша страницы все состояние JS'a сотрется и прийдется логиниться заново. А вот Cookies браузер сохранит в своем хранилище автоматически. И после рефреша страницы он останется. Так же есть понятие Authorization header'a - это штука совсем другая, это альтернативный способ аутентификации. Это еще один спец хедер. В зависимости от типа авторизации там могут быть разные данные, однако когда речь идет про браузер, то как правило используют тип Basic Auth. В таком случае туда складывают username & password пользователя. Для этого серверу нужно вернуть в запросе информацию о том он хочет авторизовывать именно с помощью Basic Auth. И тогда браузе покажет свое нативное окошко (не HTML & JS), куда пользователь введет имя и пароль. И они при каждом запросе будут слаться на сервер. Этот хедер браузер запомнит на какое-то время, но после рестарта браузера оно потрется. Все другие кастомные хедеры которые ты будешь создавать - их нужно явно в JS слать с каждым запросом. Браузер их не будет добавлять автоматически. И это не то как мы обычно реализуем аутентификацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 20:18 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, Все верно, только боюсь ему надо именно магию спринг и спринг бут и Spring Security. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 22:33 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev - Спасибо, кажется твоим объяснением недостающее звено заполнилось. Stanislav Bashkyrtsev 2. Т.к. кука - это такой хедер, который с каждым запросом шлется на сервер, то этот SESSIONCOOKIE теперь и будет приходить со всеми последующими на наш сервер. Значит в данном случае только такой вариант security. Нужно будет немного переделать свой вариант и найти соответсвующие фильтры и интерсепторы, которые проверяют HttpSession, а не стандартный SpringSecurity Filter Chain. Хотяяя, наверное можно и в стандартном, только надо проверять грубо говоря не мой "My-X-Auth" который я не могу установить в request, a request.getSession().getSessionID(). авторЕсли же ты создашь просто хедер SESSIONID, то JS может его и получит, однако после рефреша страницы все состояние JS'a сотрется и прийдется логиниться заново. А вот Cookies браузер сохранит в своем хранилище автоматически. И после рефреша страницы он останется. - вооот, именно этого понимания мне не хватало, что браузер сделает это для меня и будет слать с каждым запросом эту переменную. Спасибо. Stanislav Bashkyrtsev Так же есть понятие Authorization header'a - это штука совсем другая, это альтернативный способ аутентификации. Это еще один спец хедер. В зависимости от типа авторизации там могут быть разные данные, однако когда речь идет про браузер, то как правило используют тип Basic Auth. В таком случае туда складывают username & password пользователя. Для этого серверу нужно вернуть в запросе информацию о том он хочет авторизовывать именно с помощью Basic Auth. И тогда браузе покажет свое нативное окошко (не HTML & JS), куда пользователь введет имя и пароль. И они при каждом запросе будут слаться на сервер. Этот хедер браузер запомнит на какое-то время, но после рестарта браузера оно потрется. В общем, спасибо. Кажется, я понял, что у меня сейчас только такой вариант имплементации, если я хочу всё в одном проекте. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 08:10 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Все верно, только боюсь ему надо именно магию спринг и спринг бут и Spring Security. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 08:13 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
_webdev_ Да, но у нас в барузере есть различные storages, где мы можем хранить этот ключ, ну а уже на сервере продлять(ttl)/удалять этот ключ и сессию автентификации. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 09:58 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Андрей Панфилов _webdev_ Да, но у нас в барузере есть различные storages, где мы можем хранить этот ключ, ну а уже на сервере продлять(ttl)/удалять этот ключ и сессию автентификации. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 10:22 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
авторНу вот, именно по такому принципу у меня и было организовано. Просто я переименовал стандартное имя "Authorization" в своё.Ну и приходилось опять же - самому слать этот хедер. Authorization браузер без нашего участия может слать. Но это совсем другой тип авторизации где нет сессии (браузер шлет Authorization с кредами каждый раз) и его редко используют. авторСоответственно, можно и дальше использовать магию спринга, но при этом ключ сессии брать не из своего кастомного хедера "My-X-Auth", а из SESSIONID.Да, можно спрингом, можно самому написать. Но наверно надежней все-таки спрингом :) авторИ потом как-то продлять если надо, или она автоматически продляется с каждім запросом.Да, автоматически. В куках есть expiration - браузер считает его от последнего запроса на сервер. авторСоответственно, можно и дальше использовать магию спрингаЭто не должно быть магией - попробуй подебажить спринговые фильтры/интерсепторы да разобраться где там что. авторДа, но у нас в барузере есть различные storages, где мы можем хранить этот ключ, ну а уже на сервере продлять(ttl)/удалять этот ключ и сессию автентификации.Угумс. Cookies по сути это еще один такой storage. Проблема с твоими другими storage'ами - к ним есть доступ у JS, а это не безопасно. Потому как если у тебя будет бага и тебе сделают HTML Injection (aka XSS), то злоумышленник может получить доступ к этому хранилищу и у знать твой SESSIONID (например, его JS возьмет и незаметно пошлет SESSIONID в посте этого форума, ну а там уже останется только скопировать). А вот в Cookies можно задавать флажки при изначальном их создании. Одним из них есть HttpOnly (советую прочесть всю страницу) - он значит что такая кука будет передаваться браузером, однако JS не будет иметь к ней доступ. Открой ради интереса Web Developer в своем браузере (обычно открывается с помощью F12), и посмотри на вкладку Application. У этого форума есть несколько кук, включая ASP.NET_SessionId, у нее проставлен HttpOnly. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 10:26 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
_webdev_ Андрей Панфилов пропущено... Офигеть... Да все вроде по делу.... У вас вопрос на самом деле звучит так: "я пытаюсь сделать невероятную небезопасную хрень, а оно сопротивляется", за такое вам уже пора Станиславу бутылку односолодового высылать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 10:39 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Это не должно быть магией - попробуй подебажить спринговые фильтры/интерсепторы да разобраться где там что. Stanislav Bashkyrtsev Угумс. Cookies по сути это еще один такой storage. Проблема с твоими другими storage'ами - к ним есть доступ у JS, а это не безопасно. Потому как если у тебя будет бага и тебе сделают HTML Injection (aka XSS), то злоумышленник может получить доступ к этому хранилищу и у знать твой SESSIONID (например, его JS возьмет и незаметно пошлет SESSIONID в посте этого форума, ну а там уже останется только скопировать). За HttpOnly отдельное спасбо. Почитаю, Да и за расстановку "по полочкам" - пасиб. Думаю, вопрос исчерпан. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 11:13 |
|
Control Auth Header in Spring MVC,когда Frontend и Backend один проект?
|
|||
---|---|---|---|
#18+
Андрей Панфилов Да все вроде по делу.... У вас вопрос на самом деле звучит так: "я пытаюсь сделать невероятную небезопасную хрень, а оно сопротивляется", за такое вам уже пора Станиславу бутылку односолодового высылать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2021, 11:15 |
|
|
start [/forum/topic.php?fid=59&msg=40063530&tid=2120468]: |
0ms |
get settings: |
27ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
464ms |
get tp. blocked users: |
2ms |
others: | 294ms |
total: | 861ms |
0 / 0 |