Хорошо, у меня есть приложение Vaadin (Vaadin 8 по устаревшим причинам), которое я интегрирую с Spring Security.
Это прекрасно работает, и пользователи без прав администратора получают отказ в доступе:
@Secured("ROLE_ADMIN")
@SpringView(name = AdminHomeView.NAME)
class AdminHomeView : View, VerticalLayout(){
companion object {
const val NAME = "admin/home"
}
@PostConstruct
internal fun init(){
val label = Label()
label.id = "label.msg"
label.value = "This is the protected admin section. You are authenticated and authorized."
this.addComponents(
label
)
}
}
Но если я заменю @Secured
на @RolesAllowed
, аннотация игнорируется, и пользователи без прав администратора могут получить доступ к представлению.
Это мой конфиг:
@Configuration
@EnableWebSecurity
@EnableVaadin
@EnableVaadinSharedSecurity
@EnableGlobalMethodSecurity(
securedEnabled = true,
prePostEnabled = true,
jsr250Enabled = true,
proxyTargetClass = true
)
class VaadinAwareSecurityConfiguration : WebSecurityConfigurerAdapter {
private val userDetailsService: UserDetailsService
@Inject
constructor(userDetailsService: UserDetailsService) : super() {
this.userDetailsService = userDetailsService
}
override fun configure(http: HttpSecurity) {
http
.csrf().disable() //vaadin has its own csrf protection, therefore this must be disabled
.httpBasic().disable()
.formLogin().disable()
.authorizeRequests()
.antMatchers("/login").anonymous()
.antMatchers("/vaadinServlet/UIDL/**").permitAll()
.antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.addLogoutHandler(logoutHandler())
.logoutUrl("/logout")
.logoutSuccessUrl("/login?goodbye").permitAll()
.and()
.exceptionHandling()
.authenticationEntryPoint(LoginUrlAuthenticationEntryPoint("/login"))
}
override fun configure(web: WebSecurity) {
web
.ignoring().antMatchers(
"/VAADIN/**"
)
}
override fun configure(auth: AuthenticationManagerBuilder) {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder())
}
private fun logoutHandler():LogoutHandler{
return VaadinSessionClosingLogoutHandler()
}
@Bean
fun passwordEncoder(): PasswordEncoder {
return BCryptPasswordEncoder(12)
}
@Bean
fun myAuthenticationManager():AuthenticationManager{
return super.authenticationManagerBean()
}
}
Я что-то упустил?