2017-08-16 109 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) { ... } 
    .... 
} 
相关问题