Вопрос по дополнению OpenID Connect

Добрый день.

Подскажите, пожалуйста, возможно ли использование дополнения OpenID Connect в следующем сценарии и направление, в котором двигаться:
При запуске приложения мы попадаем на логин-скрин, далее у нас есть вариант авторизоваться с логином/паролем или нажав на условную кнопку “Login with OIDC” авторизоваться с помощью OIDC.

Добрый день!

Сам аддон так не умеет. Вы можете реализовать эту функциональность в своём проекте. Вот пример, который показывает как это сделать.

@gorbunkov
Максим, используя пример, реализовали вот такой класс:

@Configuration
open class BoretsOidcConfiguration {
    @Bean
    open fun claimsRolesMapper(
        resourceRoleRepository: ResourceRoleRepository,
        rowLevelRowRepository: RowLevelRoleRepository
    ): ClaimsRolesMapper = DefaultClaimsRolesMapper(resourceRoleRepository, rowLevelRowRepository)

    @Bean
    open fun oidcUserService(oidcUserMapper: MySynchronizingOidcUserMapper) = DefaultJmixOidcUserService(oidcUserMapper)

    @EnableWebSecurity
    @Order(JmixOrder.HIGHEST_PRECEDENCE + 100)
    open class BoretsOAuth2LoginSecurityConfiguration : WebSecurityConfigurerAdapter() {
        @Autowired
        lateinit var jmixOidcUserService: JmixOidcUserService

        @Autowired
        lateinit var clientRegistrationRepository: ClientRegistrationRepository

        override fun configure(httpSecurity: HttpSecurity) {
            http.apply(SecurityConfigurers.uiSecurity())
                .and()
                .oauth2Login { configurer ->
                    configurer.userInfoEndpoint()
                        .oidcUserService(jmixOidcUserService)
                        .and()
                        .successHandler { request, response, auth ->
                            DefaultRedirectStrategy().sendRedirect(request, response, "/#main")
                        }
                }
                .logout { configurer ->
                    configurer.logoutSuccessHandler(oidcLogoutSuccessHandler())
                }
            http.csrf().disable()
        }

        private fun oidcLogoutSuccessHandler(): OidcClientInitiatedLogoutSuccessHandler {
            val successHandler = OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository)
            successHandler.setPostLogoutRedirectUri("{baseUrl}")
            return successHandler
        }
    }

}

И вроде бы все работает, но если попытаться разлогиниться и снова войти, то возникает получаем ошибку (не всегда):
image
Если пройти по ссылке, то произойдет вход в систему.

Может быть есть что-то я упускаю, а для вас на виду?

Попробуйте дать явные разрешения на некоторые ендпойнты ваадина, как сделано здесь:

http.authorizeHttpRequests(authorize -> {
                        authorize
                                //if we don't allow /vaadinServlet/PUSH URL the Session Expired toolbox won't
                                //be shown in the web browser
                                .antMatchers("/vaadinServlet/PUSH/**").permitAll()
                                .anyRequest().authenticated();
                    })

Этим чуть другая проблема решалась, но, возможно, вашей тоже поможет.

@gorbunkov
Они вместе с SecurityConfigurers.uiSecurity() не дружат:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method ‘springSecurityFilterChain’ threw exception; nested exception is java.lang.IllegalStateException: authorizeHttpRequests cannot be used in conjunction with authorizeRequests. Please select just one.

В SecurityConfigurers.uiSecurity() есть метод, который конфигурирует ui url initUiUrls(HttpSecurity http)

http.requestMatchers()
   .antMatchers("/**")
   .and()
   .authorizeRequests()
   .anyRequest().permitAll();

Полагаю, что /** включают в себя /vaadinServlet/PUSH/**.

Да, я вам дал ссылку на пример из мастера, где уже выпилено использование WebSecurityConfigurerAdapter и заменено на SecurityFilterChain. В release_1_3 можно найти подходящий код, но в любом случае вы правы, что uiSecurity() уже включает этот шаблон URL.

Тогда сходу, боюсь, не подскажу ничего:(