Подскажите, пожалуйста, возможно ли использование дополнения 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
}
}
}
И вроде бы все работает, но если попытаться разлогиниться и снова войти, то возникает получаем ошибку (не всегда):
Если пройти по ссылке, то произойдет вход в систему.
Может быть есть что-то я упускаю, а для вас на виду?
Попробуйте дать явные разрешения на некоторые ендпойнты ваадина, как сделано здесь:
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)
Да, я вам дал ссылку на пример из мастера, где уже выпилено использование WebSecurityConfigurerAdapter и заменено на SecurityFilterChain. В release_1_3 можно найти подходящий код, но в любом случае вы правы, что uiSecurity() уже включает этот шаблон URL.