簡體   English   中英

Spring Security按角色限制URL訪問

[英]Spring Security Limiting URL access by roles

我正在嘗試在這個小項目上實現SpringSecurity機制,該機制將限制角色與請求URL的交互。

我有兩個角色USERADMINUSER可以看到項目,但不能添加或刪除它們,而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

您是否嘗試過將斜線添加到您的antmatcher模式中,例如:

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

Spring文檔提到:

注意:模式和路徑必須都是絕對的,或者都必須是相對的,才能使兩者匹配。 因此,建議該實現方式的用戶清理模式,以便在模式使用的前綴中以“ /”作為前綴。

此外,Spring Security使用所有表示的匹配規則中的第一個匹配項。 我建議將匹配器從最特定的到最不特定的進行重新排序,否則對api/items的調用將由api/**匹配器進行匹配,而不是由api/items匹配器進行匹配。

.antMatchers("/api/items", "api/items/").hasRole("USER")
.antMatchers("/api/**").hasRole("ADMIN")

@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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM