У пользователя есть authority "ROLE_ADMIN". Какое выражение в @PreAuthorize сработает?
- Почему hasRole("ROLE_ADMIN") не работает?
hasRole('ADMIN') сам добавляет префикс ROLE_ и сравнивает с authority ROLE_ADMIN; hasAuthority('ROLE_ADMIN') сравнивает строку буквально. Оба сработают; hasRole('ROLE_ADMIN') — нет (с Spring Security 6 даже ошибка).
- Роли — грубые группы, authorities — тонкие права (orders:write)
- Из JWT scope приходят как SCOPE_xxx
- Префикс настраивается GrantedAuthorityDefaults
А ещё Права проверять через hasAuthority — меньше путаницы
Подробно
Это источник постоянной путаницы, особенно при переходе на JWT, где список прав приходит из токена. Правило простое: hasRole('X') проверяет наличие authority 'ROLE_X', а hasAuthority('X') ищет ровно 'X'. Поэтому если в токене лежит 'ADMIN' без префикса, hasRole('ADMIN') не сработает — нужно либо hasAuthority('ADMIN'), либо настроить конвертер, добавляющий префикс при разборе токена. Заодно стоит помнить, что method security требует включения через @EnableMethodSecurity и работает через прокси, а значит подвержена той же проблеме self-invocation, что и @Transactional.
Что хотят услышать
- Различие и префикс.
- Роли против прав.
Частые ошибки
- Писать hasRole('ROLE_ADMIN') — получится проверка на ROLE_ROLE_ADMIN.
- Забыть настроить конвертер прав при переходе на JWT.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓hasRole('ADMIN') — префикс ROLE_ подставится сам
- ✗hasRole('ROLE_ADMIN') — роль всегда указывают полным именем
- ✗hasAuthority('ADMIN') — authority сравнивается как есть
- ✗Оба варианта hasRole('ADMIN') и hasAuthority('ADMIN') сработают одинаково
Что спросят дальше
- Как настроить извлечение прав из claim в JWT?
- Почему @PreAuthorize не срабатывает при вызове метода внутри того же класса?
Разбор темы
- Аутентификация: JWT, OAuth2/OIDC и method security
Структура и валидация JWT, проблема отзыва, роли OAuth2 и authorization code flow, OIDC, и авторизация на уровне методов.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.