我有一个以模块化方式构建的 Spring MVC Web 应用程序。添加到网站的每个模块都可以为用户授权定义自己的安全元素(使用http
xml 中的命名空间),这很好并且有效。
我现在需要以编程方式检查当前用户是否有权访问给定的 URL。WebInvocationPrivilegeEvaluator
我已经搜索和搜索并找到了许多对<http:
. 我已经尝试循环所有 6 个并对每个执行检查,但这会返回奇怪的结果。
例子:
我可以使用以下方法获取所有 bean:
private Collection<WebInvocationPrivilegeEvaluator> privEvals;
....
privEvals = (List<WebInvocationPrivilegeEvaluator>) applicationContext.getBeansOfType(WebInvocationPrivilegeEvaluator.class).values();
并像这样循环检查:
public void checkForUrl(String url) {
for(WebInvocationPrivilegeEvaluator privEval:privEvals) {
System.out.println(privEval.isAllowed(url, SecurityContextHolder.getContext().getAuthentication()));
}
}
示例 1:用户被授权访问 URL,打印:
false
false
true
true
true
true
示例 2:同一用户未获得 URL 授权,打印:
false
false
true
true
true
true
但是,如果我尝试浏览 URL,我会得到403
第二个 URL 的正确值。
更新
如果我使用WebInvocationPrivilegeEvaluator
接受上下文的其他方法,我会得到相同的结果。我尝试了许多使用不同http
元素保护它们的 URL,并返回相同的布尔值(以相同的顺序)。
如果我使用分配了不同角色的不同用户,我会遇到相同的问题,即不同 URL 的结果始终相同(当用户有权或无权访问它们时),除了这次打印以下内容:
false
真真
真假
真假
真
_
更新
我曾尝试使用<sec:authorize
具有更奇怪结果的标签,看起来好像它只是使用第一个WebInvocationPrivilegeEvaluator
.