Spring Security Ограничение доступа к URL по ролям - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь реализовать механизм 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

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

Вы пробовали добавлять косые черты к вашим шаблонам antmatcher, например:

antMatchers("/api/**").hasRole("ADMIN")

В документации Spring упоминается:

Примечание: шаблон и путь должны быть оба абсолютными или должны быть относительными, чтобы оба соответствовали друг другу. Поэтому пользователям этой реализации рекомендуется санировать шаблоны, чтобы поставить перед ними префикс «/», поскольку это имеет смысл в контексте, в котором они используются.

Кроме того, Spring Security использует первое совпадение всех указанных правил сопоставления. Я бы порекомендовал изменить порядок сопоставлений с наиболее специфичных на менее специфичные, так как в противном случае вызов api/items будет сопоставляться сопоставителем api/** вместо сопоставления сопоставителем api/items.

.antMatchers("/api/items", "api/items/").hasRole("USER")
.antMatchers("/api/**").hasRole("ADMIN")
1 голос
/ 22 апреля 2019

Помимо @GetMapping или @PostMapping вы можете добавить следующую аннотацию для управления доступом на основе ролей

@PreAuthorize("hasAnyRole('ROLE_ADMIN')")
@PostMapping(value = "/api/addItem",consumes = {"application/json"},produces = {"application/json"})
@ResponseBody
public Item addItem(@RequestBody Item item) {
    itemService.addItem(item);
    return item;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...