Я пытаюсь реализовать механизм SpringSecurity в этом небольшом проекте, который ограничит взаимодействия с URL-адресом запроса по ролям.
У меня есть две роли ПОЛЬЗОВАТЕЛЬ и ADMIN , ПОЛЬЗОВАТЕЛЬ может видеть элементы, но не может добавлять или удалять их, в то время как ADMIN может сделать оба.
Теперь проблема, запросы от роли USER и даже не прошедшие проверку подлинности пользователи для создания / удаления / чтения элемента разрешены каким-либо образом. Мне кажется, что мое приложение где-то неправильно настроено.
SecurityConfig:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}12345").roles("USER").and()
.withUser("admin").password("{noop}12345").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("api/**").hasRole("ADMIN")
.antMatchers("api/items", "api/items/").hasRole("USER")
.anyRequest().authenticated()
.and().csrf().disable().headers().frameOptions().disable();
}
}
Контроллер:
@RestController
public class ItemController {
@Autowired
private ItemService itemService;
@GetMapping("/api/items")
public List<Item> getItems() {
return itemService.getAllItems();
}
@PostMapping(value = "/api/addItem",consumes = {"application/json"},produces = {"application/json"})
@ResponseBody
public Item addItem(@RequestBody Item item) {
itemService.addItem(item);
return item;
}
@DeleteMapping(value = "api/deleteItem/{id}")
@ResponseBody
public String deleteItem(@PathVariable int id) {
itemService.deleteItem(id);
return "Deleted";
}
}
Я отправляю запросы на следующие URL:
http://localhost:8080/api/items // GET
http://localhost:8080/api/addItem // POST
http://localhost:8080/api/deleteItem/4 // DELETE