Доброго времени суток всем! Столкнулся со следующей проблемой: собираю
Front-end (
Angular 2+ TypeScript) Webpack-ом. Приложение должно быть полностью засекьюрено, заходя на любую страницу требуется наличие роли
(ADMIN,USER).
Webpack же оптимизирует код одним из своих плагинов(
CommonsChunkPlugin), в результате получается множество небольших кусочков: Js, один html фаил, и assets, как на скриншоте ниже:
Я вижу следующий сценарии защиты, но, как мне кажется, он не идеальный:
С помощью
Spring Security определим доступ, к примеру так:
.antMatchers("/home", "/")
.hasAnyRole("USER", "ADMIN")
Определим кастомную форму логирования :
.formLogin().loginPage("/login")
.usernameParameter("username").passwordParameter("password")
Так же реализуем следующие интерфейсы, чтобы они отдавали исключительно статусы, кроме –
AuthentificationEntryPoint, т.к мне от него еще редирект нужен :
AuthentificationSuccessHandler, AuthentificationFailureHandler, AuthentificationEntryPoint
В купе с этим на клиенте при загрузке каждого следующего компонента необходимо делать запрос на наличие роли у данного
принципала(ну, как я это понимаю, может что еще спросить надо, буду рад помощи), и если ее нет, то редирект на страницу логирования. По идее, это должен сделать сам спринг при запросе на сервер, т.к я требую к каждому ресурсу роль. Но если я перенесу все на клиента, и сделаю на всех ресурсах
permitAll(), то можно же, по идее, взять мой код, убрать проверку и сервер останется вообще без защиты на ресурсы.
Если же перекинуть все на сервер, то придется открыть доступ ко всем ресурсам, т.к я не знаю, какой из чанков отвечает за форму логирования, а мне необходимо, чтобы она загрузилась, и можно было залогиниться. Чтобы было понятнее: при таком подходе я, конечно, могу засекьюрить URL-лы :
/admin, /user, но когда я зайду на тот же
/user, то могу спокойно пойти туда, где прав у меня нету, допустим “
/admin/dashboard”, главное, это не через URL обращаться, а через внутренние
router-link перейти, и приложение запрос сделает не к
localhost:8080/admin/dashboard, а к
localhost:8080/4.chunk.js, т.е к ресурсу, к которому открыт доступ. Повторюсь, т.к я не знаю, какой из чанков за что отвечает и, соответственно, не могу ограничить к ним доступ.
Большое спасибо за внимание, надеюсь, вы подскажете наиболее рациональное решение!