Дано:
Проект на spring+kotlin. Реализовано получение access_token через БД и доступ к ресурсам с его помощью.
Задача:
Реализовать возможность доступа к ресурсам для юзеров, залогинившихся через форму логина в браузере.
Проблема:
Работает только один из способов авторизации. Если добавить аннотацию @EnableResourceServer - работает способ доступа с токеном. При запросе любой страницы в браузере просто выводит ошибку "неавторизован", в т.ч. по адресу /login. Если на /login зайти с прикреплением токена - выведет 404. Если аннотацию @EnableResourceServer убрать - работает доступ через форму логина в браузере и получение токена, но все запросы с прикреплением токена перенаправляют на /login, т.е. токен не воспринимается.
Вопрос:
Как же сделать так, чтобы работало?
По идее надо написать что-то тут, но часы гугленья не дали понимания что именно:
@Configuration
@EnableWebSecurity
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
class WebSecurityConfiguration : WebSecurityConfigurerAdapter() {
@Bean
fun passwordEncoder() = BCryptPasswordEncoder()
@Bean
fun authenticationProvider(): DaoAuthenticationProvider {
val authenticationProvider = DaoAuthenticationProvider()
authenticationProvider.setUserDetailsService(userDetailsService)
authenticationProvider.setPasswordEncoder(passwordEncoder())
return authenticationProvider
}
@Bean
override fun authenticationManagerBean(): AuthenticationManager {
return super.authenticationManagerBean()
}
@Autowired
lateinit var userDetailsService: UserServiceImpl
@Autowired
fun configureGlobal(auth: AuthenticationManagerBuilder) {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder())
.and()
.authenticationProvider(authenticationProvider())
}
override fun configure(http: HttpSecurity) {
http
.csrf().disable()
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin().permitAll()
}
}
Дополнительная информация:
Ссылка на весь проект на GitHub: https://github.com/mohaxspb/springSecurityExample/tree/v0.0.1
Для запуска и работы надо поставить postgresql и создать там под юзером postgres с паролем testtest БД с именем springbootdb - далее при запуске в БД создана будет таблица с юзерами и туда будет добавлен юзер, под коим можно логиниться с логином test@test.ru и паролем password. Для получения токена надо указать client_id: client_id и client_secret: client_secret (эти данные также пишутся в БД при старте сервера)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей