Аутентификация с помощью OAuth2 в Webflux Spring

Я разрабатываю приложение, в котором я хочу иметь контроль доступа на основе ролей, к сожалению, я не нашел хорошего примера с использованием spring webflux. Мой oauth2.client.provider - Okta.

Вот мой SecurityWebFilterChain:

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        return http
                .authorizeExchange()
                .pathMatchers("/*").permitAll()
                .pathMatchers("/admin").hasRole("admins");
}

В эта статья я обнаружил, что мне нужно настроить сервер ресурсов. Подскажите, пожалуйста, как это сделать.

Эта статья должна работать для вас лучше: developer.okta.com/blog/2018/09/24/…

Matt Raible 13.10.2018 19:09

Спасибо за ответ, но в этой статье представлена ​​простая конфигурация без ролевого контроля доступа.

jker 13.10.2018 19:14
0
2
1 139
1

Ответы 1

Чтобы это работало, вам необходимо использовать промежуточный выпуск 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, как указано в это сообщение в блоге.

Я сделал это, но это не ролевой контроль доступа

jker 13.10.2018 19:17

Я обновил свой ответ, включив в него контроль доступа на основе ролей.

Matt Raible 13.10.2018 23:01

Я пробовал это раньше. Когда я пытаюсь загрузить «/ admin», я получаю всплывающее окно «Требуется аутентификация». Я хочу, чтобы меня перенаправили на страницу входа в okta.

jker 14.10.2018 08:51

Возможно, вам потребуется добавить @EnableWebFluxSecurity в свой класс конфигурации. Наверное, .and().oauth2Login() тоже. См. Этот класс для примера: github.com/oktadeveloper/okta-spring-webflux-react-example/b‌ lob /…

Matt Raible 15.10.2018 01:36

Другие вопросы по теме