簡體   English   中英

在Spring Rest中,如何覆蓋GET和PUT調用?

[英]In Spring Rest, how do I override the GET and PUT calls?

我的Spring REST程序是使用Json Web令牌(JWT)的Stephen Zerhusen演示的略微擴展,可以正常運行-就目前而言。 我添加了一個Option對象,並且可以僅使用Option類(@Entity)和OptionRepository接口(擴展JpaRepository)進行GET,PUT和POST

我現在正在嘗試但未成功將返回的數據限制為已登錄用戶所擁有的權限。 例如,假設我的登錄用戶僅具有選項值1、3和5的權限。

  • 如果我有像GET / option這樣的服務呼叫,則不應返回Option值2或4。
  • 如果我有像GET / option / 2這樣的服務呼叫,我應該返回HTTP 404結果。

我了解,一旦用戶登錄,我就可以通過Principal對象引用獲取其用戶信息。 在先前的stackoverflow問題中提供了這樣的解決方案 ,其他頁面也提供了類似的解決方案。

我的直接問題是找到可以影響/ option的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的調用將返回HTTP404。一些文檔表明不需要它,但我想實際上是必需的。

現在過濾輸出。 讓我們通過使服務器始終返回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 / option / 1時,我回來了……選項1,而不是選項5。不使用@Query。

影響GET,PUT等所需的魔術是什么?

謝謝,

傑羅姆。

您可以使用資源處理器來處理返回的資源:

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

然后,您可以創建自定義異常處理程序 ,例如:

@ControllerAdvice
public class ExceptionsHandler {

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

要向PUT / POST / DELETE請求添加一些邏輯,可以使用自定義事件處理程序 ,例如:

@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使用示例...

暫無
暫無

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

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