@bitwheeze

Правильно ли я понимаю spring security?

Здрасьте,

пытаюсь понять spring security. Все примеры какие то неподходящие под мою задачу или я что то не понимаю. Очень много всего и все варианты решения слишком разные.

У меня приходят запросы, в которых посажены две куки - account и token. Account это по сути имя пользователя, а token собственно кастомный токен, который надо периодически проверять, что он валидный.

Я создал класс AppPrincipal, который реализует интерфейс UserDetails.
В кастомном фильтре я извлекаю вышеуказанные куки и создаю объект AppPrincipal.

Но дальше не пойму как его использовать. Насколько я понимаю, мне надо как то principal сунуть в SecurityContextHolder.

Если я правильно все понял, надо вызвать
SecurityContextHolder.getContext().setAuthentication()


Но оно требует класс с интерфейсом Authentification. Надо мне какие то готовые использовать и есть ли подходящие, или надо самому создать свой класс реализующий интерфейс Authentification?

Как потом в ендпоинтах проверять? Просто вызвать SecurityContextHolder.getContext().isAuthentificated() и в случае чего делать отлуп или как то можно аннотации использовать или центральной конфигурацией? У меня webflux вида

@RequestMapping(value = "/stats/{account}", method = RequestMethod.GET)
    public Mono<List<PersonalStatsRecord>> getPersonalStatsAccount(@PathVariable String account) {
        return Mono.just(sessionRepository.getStatsForAccount(account));
    }


Буду очень благодарен, если подскажите, верной дорогой ли я иду или "все ...ня Миша" и надо все переделывать?

Спасибо
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
@VictorZZZZ
Тебе надо создать конфигурацию для твоего security.
Это Bean который наследуется от WebSecurityConfigurerAdapter

В нём переопределить метод configure. И там указывать какие эндпоинты должны проходить под авторизованным пользователем, а какие ты хочешь разрешить без авторизации.
Например как-то так:
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/stats/**").permitAll()
                .antMatchers(new String[]{
                        "/register",
                        "/admin/**"}).hasRole("ADMIN")
                .antMatchers("/**").authenticated().and()
                    .formLogin()
                        .loginPage("/login")
                        .loginProcessingUrl("/authenticateTheUser")
                        .failureUrl("/login?error=true")
                        .defaultSuccessUrl("/")
                .and()
                    .logout()
                    .logoutSuccessUrl("/login")
                  .permitAll();
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы