我正在尝试通过扩展WebSecurityExpressionRoot来实现自定义方法,以便在sec:autorize taglig中使用,如下所示:
<sec:authorize access="uiAuthz('allevents', 'myVal')">
...
</sec:authorize>
实施如下:
public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {
public boolean uiAuthz(String uiElement, String val) {
...
}
...
}
然而,无论我尝试什么,uiAuthZ方法的参数总是被视为单个String参数“'allevents,myVal'”。
我有没有办法让Spring Security框架将它们解析为多个参数?
似乎我可以使用StringTokenizer等来处理一个简单的情况,如上例所示,但是当我必须传递字符串的ArrayList时就会出现问题。
答案 0 :(得分:1)
您如何将CustomWebExpressionRoot与应用程序集成?为此,您需要确保创建一个注册自定义根的自定义WebExpressionHandler。例如:
<强> CustomExpressionHandler.java 强>
public class CustomExpressionHandler extends DefaultWebSecurityExpressionHandler {
@Override
protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
WebSecurityExpressionRoot root = new CustomWebSecurityExpresssionRoot(authentication, fi);
root.setPermissionEvaluator(this.getPermissionEvaluator());
root.setTrustResolver(new AuthenticationTrustResolverImpl());
root.setRoleHierarchy(this.getRoleHierarchy());
return root;
}
}
<强> security.xml文件强>
<http ...>
<expression-handler ref="webExpressionHandler"/>
</http>
<b:bean id="webExpressionHandler"
class="sample.CustomExpressionHandler"/>
您可以在https://github.com/rwinch/spring-security-sample/tree/custom-webexpressionroot
找到完整的示例