2017-08-16 75 views
0

我想只允許特定用戶訪問他們的修改頁面。Spring Web Security中的自定義方法

例如,我想用戶3是唯一一個能夠訪問的URL:/用戶/ 3 /編輯

對於這一點,我已經把我的SecurityConfiguration.java:

.authorizeRequests() 
.antMatchers("/user/{id}/edit").access("@MyClass.checkId(#id)"); 

MyClass.java如下:

@Component 
public class MyClass{ 


    public boolean checkId(Long id) { 
     if(id == SecurityUtils.getCurrentUserId()){ //I have this configured and working 
      return true; 
     } 
     return false; 
    } 
} 

然而,當去到以下網址:用戶/ 4 /編輯登錄的用戶3(這些例子),我似乎無法進入checkId方法,並沒有什麼發生了,我的頁面加載其中的所有內容。

你有什麼想法嗎? antMatchers.access()是否要走?

謝謝你的時間!

回答

1

您需要繼承兩個類。

首先,設置一個新的方法表達處理機

<global-method-security> 
    <expression-handler ref="myMethodSecurityExpressionHandler"/> 
</global-method-security> 

myMethodSecurityExpressionHandler會)DefaultMethodSecurityExpressionHandler的一個子類,其覆蓋createEvaluationContext(,設置MethodSecurityExpressionRoot對MethodSecurityEvaluationContext一個子類。

例如:

@Override 
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) { 
    MethodSecurityEvaluationContext ctx = new MethodSecurityEvaluationContext(auth, mi, parameterNameDiscoverer); 
    MethodSecurityExpressionRoot root = new MyMethodSecurityExpressionRoot(auth); 
    root.setTrustResolver(trustResolver); 
    root.setPermissionEvaluator(permissionEvaluator); 
    root.setRoleHierarchy(roleHierarchy); 
    ctx.setRootObject(root); 

    return ctx; 
} 
+2

謝謝你的回答,雖然這似乎是一個副本 - 這個答案的口吻:https://stackoverflow.com/a/6634438/5749754,一字不換,甚至沒有提到它!不過謝謝你,至少我找到了我想找的東西...... –

0

還有另一種解決方案,它可以在使用Expression-Based Access Control一個非常優雅的方式來實現,這種情況下,你可以使用@PreAuthorize註釋和裏面驗證主要用戶ID。例如:

@PreAuthorize("#id == principal.userNumber") 
    @RequestMapping(method = RequestMethod.POST, value = "/user/{id}/edit") 
    public void userUpdate(Long id){ .. } 

請只是確保了UserDetails接口的實現有userNumber財產。

你可以看到更多有關Expression-Based Access Control

另一種方法是注入Principal對象插入到請求處理方法是這樣的:

@RequestMapping(method = RequestMethod.POST, value = "/user/{id}/edit") 
public void userUpdate(Long id, Principal myPrincipal){ 

    MyUserDetails user = (MyUserDetails) myPrincipal; 
    if (user.getUserNumber == id) { ... } 
    .... 
} 
相關問題