0

我有一个以模块化方式构建的 Spring MVC Web 应用程序。添加到网站的每个模块都可以为用户授权定义自己的安全元素(使用httpxml 中的命名空间),这很好并且有效。

我现在需要以编程方式检查当前用户是否有权访问给定的 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.

4

1 回答 1

1

旧帖子,但我遇到了这个问题,并没有找到真正的答案。我的实现是使用特定角色选择良好的安全领域来识别领域。

我得到了 WebInvocationPrivilegeEvaluator 和 FilterSecurityInterceptor

    ApplicationContext context = AppContext.getApplicationContext(); 
    Map<String, WebInvocationPrivilegeEvaluator> wipes = context.getBeansOfType(WebInvocationPrivilegeEvaluator.class);
    Map<String, FilterSecurityInterceptor> filters = context.getBeansOfType(FilterSecurityInterceptor.class);

我浏览每个并在用于领域的特定角色上测试 FilterSecurityInterceptor :

    for (int i = 0; i < wipes.size(); i++) {
        privilegeEvaluator=(DefaultWebInvocationPrivilegeEvaluator) wipes.values().toArray()[i];
        FilterSecurityInterceptor filter = (FilterSecurityInterceptor) filters.values().toArray()[i];
        if (filter.getSecurityMetadataSource().getAllConfigAttributes().toString().contains("hasRole('SPECIFIC_ROLE')")) return privilegeEvaluator;
    }
于 2015-08-13T10:08:08.893 回答