2016-08-05 70 views
0

例如Spring安全性基於REST風格的角色控制

/user/{userId}/* # Only user with userId and admin can access 
/order/{orderId}/* # Only the order owner of orderId and admin can access 

當前解決方案中,@Current註釋是一個定製的注射是涉及token傳遞給服務器。 @PathVariable("user-id") UserEntity user從路徑得到了與Spring的數據

@PreAuthorize("#user.id == #u?.id") 
public UserDTO access(@P("user") @Current UserEntity requestUser, 
         @P("u") @PathVariable("user-id") UserEntity user) 

@PreAuthorize("#user.id == #uid && (#order == null || #order?.user?.id == #uid)") 
public Message access(@Current @P("user") UserEntity user, 
         @PathVariable("user-id") @P("uid") Long uid, 
         @PathVariable("order-id") @P("order") OrderEntity order) 

我們得到了太多的詮釋,有沒有簡單的方法來配置他們呢?

試圖

  1. 使用.antMatchers("/user/[0-9]+/*").hasRole("ROLE_USER")不能自定義的用戶檢查。
  2. AOP太複雜了,根本無法做到網址。

回答

1

我建議你使用方法安全性來實現細粒度的邏輯來實現資源訪問。在我看來,基於網址的身份驗證僅對簡單用例有效。

我也建議使用AOP自定義註釋來實現你的方法的安全性(而不是使用@PreAuthorize)如果您的授權邏輯需要幾行代碼...

例如,你可以截獲標註的方法調用:

@Before("@annotation(your.annotations.AllowedToOwner) && @annotation(ann)") 
public void checkOwner(JoinPoint joinPoint, AllowedToOwner ann) throws Throwable { 

    // check owner, throws AccessDeniedException if check fails... 
} 
+0

也許這只是可行的方法。 – wener

+0

@wener這是我通常應用於我的項目的方法。也許有更好的方法來實現你想要的,但我發現這種方法非常可讀和有效。 – davioooh