Я разрабатываю приложение, в котором я хочу иметь контроль доступа на основе ролей, к сожалению, я не нашел хорошего примера с использованием spring webflux. Мой oauth2.client.provider - Okta.
Вот мой SecurityWebFilterChain:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.pathMatchers("/*").permitAll()
.pathMatchers("/admin").hasRole("admins");
}
В эта статья я обнаружил, что мне нужно настроить сервер ресурсов. Подскажите, пожалуйста, как это сделать.
Спасибо за ответ, но в этой статье представлена простая конфигурация без ролевого контроля доступа.
Чтобы это работало, вам необходимо использовать промежуточный выпуск Spring Boot 2.1. M3 или выше подойдет. Добавьте необходимые зависимости для поддержки Spring Security 5.1 OIDC:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
Затем создайте приложение Okta OIDC "Web" и скопируйте свои настройки в src/main/resources/application.yml.
spring:
security:
oauth2:
client:
provider:
okta:
issuer-uri: https://dev-737523.oktapreview.com/oauth2/default
registration:
login:
okta:
client-id: {clientId}
client-secret: {clientSecret}
scope: openid email profile
Перезагрузите приложение, перейдите в http: // локальный: 8080, и вы должны быть перенаправлены в Okta для входа в систему. Введите действительные учетные данные, и вы будете перенаправлены обратно в свое приложение после успешного входа в систему.
Чтобы ограничить доступ на основе ролей, вам необходимо создать группы для ваших пользователей.
Создайте группу ROLE_ADMIN и ROLE_USER (Пользователи> Группы> Добавить группу) и добавьте в них пользователей. Вы можете использовать учетную запись, с которой вы зарегистрировались, или создать нового пользователя (Пользователи> Добавить человека). Перейдите к API> Серверы авторизации, щелкните вкладку Серверы авторизации и измените значение по умолчанию. Щелкните вкладку Претензии и Добавить заявку. Назовите его «группы» или «роли» и включите его в идентификатор. Установите тип значения «Группы» и установите фильтр как регулярное выражение «. *» (Чтобы включить их все).
Тогда вы сможете использовать что-то вроде:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.pathMatchers("/*").permitAll()
.pathMatchers("/admin").hasAuthority("ROLE_ADMIN");
}
Вы также должны иметь возможность использовать @PreAuthorize, как указано в это сообщение в блоге.
Я сделал это, но это не ролевой контроль доступа
Я обновил свой ответ, включив в него контроль доступа на основе ролей.
Я пробовал это раньше. Когда я пытаюсь загрузить «/ admin», я получаю всплывающее окно «Требуется аутентификация». Я хочу, чтобы меня перенаправили на страницу входа в okta.
Возможно, вам потребуется добавить @EnableWebFluxSecurity в свой класс конфигурации. Наверное, .and().oauth2Login() тоже. См. Этот класс для примера: github.com/oktadeveloper/okta-spring-webflux-react-example/b lob /…
Эта статья должна работать для вас лучше: developer.okta.com/blog/2018/09/24/…