[英]Spring Security Limiting URL access by roles
我正在嘗試在這個小項目上實現SpringSecurity機制,該機制將限制角色與請求URL的交互。
我有兩個角色USER和ADMIN , USER可以看到項目,但不能添加或刪除它們,而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.