【发布时间】:2013-06-20 06:04:48
【问题描述】:
我需要发明一种新型注释,其中一个字段是 Spring Expression Language (aka SpEL) 表达式字符串。
经过一番谷歌搜索和检查现有类后,我发现评估表达式的方式可能是这样的(如果我有任何错误,请纠正我):
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("isAnonymous()"); // well, this is only an example
SecurityExpressionRoot context = ... obtaining the instance of subclass of SecurityExpressionRoot ...
System.out.println(exp.getValue(context)); // just an example
但问题是:最适合我的情况的 MethodSecurityExpressionRoot 是本地包。甚至还有一个task about making it public in Spring Security JIRA 一年没有得到开发者关注。
即使它不是本地包,我仍然对从哪里获取 SecurityExpressionRoot 类的方法 setTrustResolver、setRoleHierarchy 和 setPermissionEvaluator 的对象知之甚少,这似乎是必需的功能正常。
所以,我的问题是:如何正确获取正确的 SecurityExpressionRoot-subclass 实例以及如何使用所需对象填充它?
【问题讨论】:
-
你为什么不用
DefaultMethodSecurityExpressionHandler?如果我可以问,您的用例有什么特别之处,您需要一个新的注释? -
感谢您指出
DefaultMethodSecurityExpressionHandler的方向,但您能否展示一下它应该用于的方式?MethodInvocation是什么东西,在那儿传来传去?你如何使用它? --- 我的特殊用例是使用带注释的控制器构建导航菜单;在某些情况下,我希望根据 SpEL 安全表达式隐藏一些菜单项(例如,如果用户未通过身份验证或没有“个人资料”角色等,则不显示“我的个人资料”菜单项); -
@Ralph,我想要的是在我自己的自定义代码中手动评估 SpEL 表达式,使用已经存在的
SecurityExpressionRoot,而不是使用一些新功能扩展基本SecurityExpressionRoot,用于 Spring 内部某个地方的常规评估。 -
如果你在 JSP 中构建菜单,你可以使用 Spring 的
<security:authorize access="${menuItem.securityExpression}">标签让你的生活更轻松。
标签: spring spring-security spring-el