2014-09-01 96 views
2

基本上我有一個允許普通用戶使用的控制器,並且我希望管理員可以通過不同的路徑訪問同一個控制器。 所以,我想這會工作:彈出覆蓋子類中的@PreAuthorize註釋

@RestController 
@PreAuthorize("hasRole('USER')") 
@RequestMapping(value = "/user") 
public class UserController { 
    @RequestMapping(value = "/name", method = RequestMethod.GET) 
    public String getName() { 
     return service.getCurrentUserName(); 
    } 
} 

@RestController 
@PreAuthorize("hasRole('ADMIN')") 
@RequestMapping(value = "/admin") 
public class UserController extends UserController{ 
} 

但我可以與用戶角色同時調用/用戶/名稱和/管理/名稱。所以它會忽略子類上的PreAuthorize註釋。

有沒有什麼方法可以重新使用UserController方法,只需向它們添加一個不同的安全PreAuthorize而不用爲Admin重寫它們?

回答

0

控制器方法在超類中註冊,所以超類註解適用。

我知道有一種動態註釋的唯一方法是在@PreAuthorize中使用#root。你可以修改父類的方法:

@RestController 
@PreAuthorize("hasRole(#root.target.requiredRole)") 
@RequestMapping(value = "/user") 
public class UserController { 
    protected String getRequiredRole() { 
     return "USER"; 
    } 
    ... 
} 

而對於子類:

@RestController 
@RequestMapping(value = "/admin") 
public class AdminController extends UserController { 
    protected String getRequiredRole() { 
     return "ADMIN"; 
    } 
    ... 
} 

這樣,父類將正常需要管理員角色呼籲AdminController對象時的方法,因爲字符串值@PreAuthorize將由SpEL預處理,同時仍需要USER角色才能獲得真實的UserController

+0

@danial post編輯 – 2014-09-02 14:34:35