логинами и паролями. Устраняем любимую путаницу Авторизация Отвечает на вопрос: “Можно ли тебе сюда?” Имеет дело с правами, ролями, доступами... 7 Наша главная тема сегодня Но начнём с этой
✢ На каждый запрос срабатывает только одна ✢ В spring-boot-starter-security из коробки 6 цепочек: ◦ Для статики ◦ Для ошибок, для ... ◦ Для всего остального 11 фильтров
@Secured("ROLE_USER") public String secure() { return "Hello Security"; } } @PreAuthorize("hasRole('ADMIN')") @PostAuthorize("hasPermission(filterObject, 'read')") SpEL Но должно же у них быть что-то общее?
UserDetails; у нас это карта) credentials — это обычно пароль (String) authorities — список разрешений/доступов details — что угодно (IP, свойства и т.п.) authenticated — признак успешной проверки
= SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication(); assert authentication.isAuthenticated(); ✢ Опосредованно через аннотации: @RequestMapping("/foo") public String foo(@AuthenticationPrincipal User user) { // do stuff with user } почти
String foo(Principal principal) { Authentication authentication = (Authentication) principal; User user = (User) authentication.getPrincipal(); // do stuff with user } почти Но откуда он попадает во все эти места?
✢ Как правило, за нас это делает Spring Security ✢ Но иногда можно/нужно самим: @Configuration public class ApplicationConfiguration extends AsyncConfigurerSupport { @Override public Executor getAsyncExecutor() { return new DelegatingSecurityContextExecutorService(newFixedThreadPool(5)); } } А как же реактивщина?
использует reactor.util.context.Context ✢ Для веб-приложений работает за счёт ReactorContextWebFilter ✢ Нуждается в @EnableWebFluxSecurity и @EnableReactiveMethodSecurity
возвращать null. ✢ Метод getPassword() может вернуть null: ◦ Критичные данные могут стираться из памяти после успешной аутентификации. ◦ См. CredentialsContainer#eraseCredentials Кстати, о паролях...
Не безопасны, не рекомендованы, вызывают головную боль и предупреждения в IDE ➖ scrypt, bcrypt Широко распространённые варианты (не только в экосистеме JVM) pbkdf2, argon2 Современные намеренно-ресурсоёмкие алгоритмы
механизмов проверки ✢ Предоставляет средства работы с паролями ✢ Основные классы: ◦ Authentication, AuthenticationManager ◦ SecurityContext, SecurityContextHolder ◦ UserDetails, UserDetailsService