我想创建一个类来添加自定义方法,以便在spring安全表达式语言中通过注释进行基于方法的授权。
例如,我想创建一个像'customMethodReturningBoolean‘这样的自定义方法,以便以某种方式使用:
@PreAuthorize("customMethodReturningBoolean()")
public void myMethodToSecure() {
// whatever
}
我的问题是。如果可能,我应该创建哪个类的子类来创建我的自定义方法,我应该如何在spring xml配置文件中配置它,并有人给我一个以这种方式使用的自定义方法的示例?
发布于 2011-07-09 19:25:00
您需要创建两个类的子类。
首先,设置一个新的方法表达式处理程序
<global-method-security>
<expression-handler ref="myMethodSecurityExpressionHandler"/>
</global-method-security>
myMethodSecurityExpressionHandler
将是覆盖createEvaluationContext()
的DefaultMethodSecurityExpressionHandler
的子类,在MethodSecurityEvaluationContext
上设置MethodSecurityExpressionRoot
的子类。
例如:
@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;
}
发布于 2013-02-16 06:05:34
上面提到的这些技术都不再有效。看起来Spring似乎已经花了很长时间来阻止用户覆盖SecurityExpressionRoot。
编辑14年11月19日Setup Spring以使用安全注释:
<beans ... xmlns:sec="http://www.springframework.org/schema/security" ... >
...
<sec:global-method-security pre-post-annotations="enabled" />
创建一个bean,如下所示:
@Component("mySecurityService")
public class MySecurityService {
public boolean hasPermission(String key) {
return true;
}
}
然后在您的jsp中执行如下操作:
<sec:authorize access="@mySecurityService.hasPermission('special')">
<input type="button" value="Special Button" />
</sec:authorize>
或者注释一个方法:
@PreAuthorize("@mySecurityService.hasPermission('special')")
public void doSpecialStuff() { ... }
此外,您可以在@PreAuthorize
注释中使用Spring Expression Language来访问当前的身份验证和方法参数。
例如:
@Component("mySecurityService")
public class MySecurityService {
public boolean hasPermission(Authentication authentication, String foo) { ... }
}
然后更新您的@PreAuthorize
以匹配新的方法签名:
@PreAuthorize("@mySecurityService.hasPermission(authentication, #foo)")
public void doSpecialStuff(String foo) { ... }
https://stackoverflow.com/questions/6632982
复制相似问题