2017-08-11 74 views
2

我的Spring REST程序是使用Json Web Tokens(JWT)的Stephen Zerhusen演示程序的輕微擴展,它工作正常 - 至今爲止。我添加了一個Option對象,並且我可以使用一個Option類(@Entity)和一個OptionRepository接口(擴展JpaRepository)來GET,PUT和POST在Spring Rest中,如何覆蓋GET和PUT調用?

我現在試圖但是失敗,將返回的數據限制爲只是登錄用戶有權享有什麼。舉個例子,假設我登錄的用戶僅有權選項值1,3,和5

  • 如果我有一個像GET /選項我不應該返回選項值服務電話2或4
  • 如果我有一個像GET/option/2這樣的服務調用,我應該返回一個HTTP 404結果。

據我所知,一旦用戶登錄,我可以通過主體對象引用獲取他們的用戶信息。 Such a solution was offered in this previous stackoverflow question,其他網頁也提供類似的解決方案。

我的直接問題是要找到哪裏可以影響/選項的GET和PUT行爲。以下是我添加到現有工作演示中的所有內容。首先是定義類的實體。

@Entity 
@Table(name="choice") 
public class Option implements Serializable { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id = Utilities.INVALID_ID; 

    @Column(name="value", length=50, nullable=false) 
    private String value; 

    @Column(name="name", length=100, nullable=false) 
    private String name; 

    public Long getId() { return this.id; } 
    public void setId(Long id) { this.id = id; } 

    public String getValue() { return this.value; } 
    public void setValue(String value) { this.value = value; } 

    public String getName() { return this.name; } 
    public void setName(String name) { this.name = name; } 
} 

現在JpaRepository接口擴展:

@RepositoryRestResource(collectionResourceRel="option", path="option") 
public interface OptionRepository extends JpaRepository<Option, Long> { 
} 

我只加這兩個文件的程序和GET,PUT和POST的工作。順便說一句,事實證明,如果我註釋掉@RepositoryRestResource語句,調用/ option/1將返回HTTP 404.一些文檔表明它不是必需的,但我想它確實是。

現在過濾輸出。讓我們假裝通過讓服務器始終返回Option(id = 5)來進行過濾。我這樣做的:

@RepositoryRestResource(collectionResourceRel="option", path="option") 
public interface OptionRepository extends JpaRepository<Option, Long> { 
    @RequestMapping(path = "/option/{id}", method = RequestMethod.GET) 
    @Query("from Option o where o.id = 5") 
    public Iterable<Option> getById(@PathVariable("id") Long id); 
} 

當我運行該服務器,並做GET /選項/ 1等我回來......選項1,不選5.不使用@Query。

什麼是影響GET,PUT等所需的魔法?

謝謝,

傑羅姆。

+0

不要忘記接受/ upvote答案,如果它幫助你..) – Cepr0

回答

0

您可以使用Resource Processor操作返回的資源:

@Component 
public class OptionResourceProcessor implements ResourceProcessor<Resource<Option>> { 

    @Override 
    public Resource<Option> process(Resource<Option> resource) { 
     Option option = resource.getContent(); 
     if (/* Logged User is not allowed to get this Option */) { 
      throw new MyCustomException(...); 
     } else { 
      return resource; 
     } 
    } 
} 

然後,您可以創建自定義Exception handler,例如:

@ControllerAdvice 
public class ExceptionsHandler { 

    @ExceptionHandler(MyCustomException.class) 
    public ResponseEntity<?> handleMyCustomException(MyCustomException e) { 
     return new ResponseEntity<>(new MyCustomMessage(e), HttpStatus.FORBIDDEN); 
    } 
} 

要添加一些邏輯來PUT/POST/DELETE請求即可使用自定義Event Handler,例如:

@RepositoryEventHandler(Option.class) 
public class OptionEventHandler { 

    @HandleBeforeSave 
    public void handleBeforeSave(Option option) { 
     if (/* Logged User is not allowed to save this Option */) { 
      throw new MyCustomException(...); 
     } 
    } 
} 

你可以在我的示例中找到更多SDR使用示例project ...

相關問題