Я пытаюсь определить правила доступа на уровне метода, но это не работает.
Конфигурация безопасности
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().
withUser("user").password("user").roles("USER").and().
withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/v2/**").authenticated()
.and()
.httpBasic()
.realmName("Secure api")
.and()
.csrf()
.disable();
}
}
ПримерКонтроллер
@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@RequestMapping(value = "/home", method = RequestMethod.GET)
String home() {
return "Hello World";
}
}
Всякий раз, когда я пытаюсь получить доступ к /v2/home с помощью user:user
, он выполняется нормально, разве он не должен выдавать мне ошибку «Отказано в доступе» из-за того, что «пользователь» не имеет ROLE_ADMIN
?
На самом деле я думаю о том, чтобы отказаться от правил доступа на уровне метода и придерживаться правил http() ant, но я должен знать, почему это не работает для меня.