2017-08-12 81 views
1

我已經有了一個應用程序,它通過Spring MVC提供一些web內容,還有一些在同一個URI下的JSON。如何使用Spring Security來保護REST API(而不是視圖)?

@Controller 
public class SomeController { 

    @RequestMapping(value = {"/someUri"}, method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE) 
    public String getView() { 
     return "index.html"; 
    } 

    @RequestMapping(path = "/someUri", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody String getJson() { 
     return "{ \"some\": \"json\" }"; 
    } 

,現在我想,以確保只有REST API產生的MediaType.APPLICATION_JSON_VALUE與春季安全。

當我在每種方法上添加@PreAuthorize@Secured註釋時,它都能正常工作。但我想全局配置它,例如在WebSecurityConfiguration#configure(HttpSecurity http)方法中。是否有可能以全球任何方式確保產生特定媒體類型的端點?

回答

1

你可以使用MediaTypeRequestMatcher

允許匹配基於從ContentNegotiationStrategy解決MediaTypeHttpServletRequest。默認情況下,匹配過程將執行以下操作:

  • ContentNegotiationStrategy將解決MediaType的當前請求
  • 已傳遞到構造每個matchingMediaTypes將針對從解決MediaType實例進行比較ContentNegotiationStrategy
  • 如果matchingMediaTypes之一是從ContentNegotiationStrategy返回的解決MediaType的一個兼容,則返回true

例如,請考慮下面的例子

GET/
Accept: application/json 
ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy() 
MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON); 
assert matcher.matches(request) == true // returns true 
0

AFAIK Spring安全並不需要對url生成的媒體類型做任何事情。安全約束適用於URL模式。當你談論@PreAuthorized和@Secured時,我假設你正在尋找一個全球授權機制。是的,你可以做這樣的事情

@Configuration 
@EnableWebSecurity 
public class SecSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
      .antMatchers("/admin/**").hasRole("ADMIN"); 
    } 
    ... 
} 

但它是把所有需要授權某種像/安全子域的您的REST API的一個好主意,/ **,這樣就可以應用安全直接到單一模式。否則,您需要逐個註冊所有模式。

相關問題