在sec中指定多个方法参数:授权访问实现

时间:2014-11-17 05:49:12

标签: spring-security taglib

我正在尝试通过扩展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时就会出现问题。

1 个答案:

答案 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

找到完整的示例