Похоже, что /api/**
разрешено всем, и это не то, что вы хотите.В конце концов, вы хотели аутентификацию токена для JWT
.antMatchers("/api/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/api/**").permitAll()
.antMatchers("/auth/**").permitAll()
.and()
.antMatcher("/api/**") // if we mention the antmatcher first , it will apply only if the url starts with /api
.authorizeRequests()
.anyRequest()
.authenticated()
Spring Security работает в два этапа
- Аутентификация - докажите, что вы тот, кто выскажи, что ты!
- Авторизация - тебе разрешено делать то, что ты собираешься делать?Также известный как контроль доступа
Давайте рассмотрим пример фильтра безопасности (псевдокод удаляет лишние методы)
http
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.antMatchers("/auth/**").permitAll()
.anyRequest().denyAll()
.httpBasic()
.formLogin()
.oauth2ResourceServer().jwt()
Этот фильтр принимает любой из трех различных методов аутентификации
- http-basic - https://tools.ietf.org/html/rfc7617
- OAuth2 токены (с использованием JWT) - https://tools.ietf.org/html/rfc6749
- логин формы (HTTP POST с телом)
Каждая из этих конфигураций вставляет фильтр.Этот фильтр автоматически обнаружит , если учетные данные являются частью запроса, и выполнит аутентификацию только при наличии учетных данных.
Самое важное, что нужно понимать, это , если учетных данных нет как часть входящего запроса, фильтр ничего не будет делать (контроль доступа не будет), и цепочка фильтров продолжится.
Как только Spring Security пройдет через все фильтры аутентификация , пришло времяавторизация или контроль доступа.Есть ли у этого запроса разрешения для вызова этого URL?
- Конечной точке требуется проверка подлинности
.antMatchers("/api/**").authenticated()
Это говорит Spring Securityчто, пока запрос аутентифицирован, вы можете вызывать все, что начинается с / api . Не важно, откуда взялась аутентификация.Это может быть просто, это может быть форма входа в систему или маркер на предъявителя. Это последнее утверждение очень важно понять.Если в вашей цепочке фильтров есть несколько методов аутентификации, любой из них будет работать.
Конечная точка не требует аутентификации .antMatchers("/api/**").permitAll()
Если конечная точка открыта , то мы используем allowAll.Здесь мы сообщаем Spring Security, что к этим конечным точкам можно получить доступ или без аутентификации.
Если я размещу два сопоставителя на одном пути, как в вопросе
.antMatchers("/api/**").permitAll()
.antMatchers("/api/**").authenticated()
Spring Security будет проходить черезих по порядку, и используйте первый удар.В этом случае permitAll
возвращает true, доступ предоставлен.Нет необходимости проверять другие конфигурации авторизации.
Так как это должно быть? Насколько я понимаю, вы хотите, чтобы /api/**
был защищен.И вам все равно, какие группы, роли или области действия есть у пользователя.Пока пользователь проходит аутентификацию, к конечным точкам /api/**
можно получить доступ.В этом случае вы хотите иметь
.antMatchers("/api/**").authenticated()
и не хотите использовать permitAll