Spring Security:如何在使用多个`http`元素时为用户授权给定的URL?

时间:2013-07-09 16:28:55

标签: java security spring-mvc spring-security authorization

我有一个以模块化方式构建的spring MVC Web应用程序。添加到网站的每个模块都可以定义自己的安全元素(在xml中使用http命名空间)以进行用户授权,这很好并且正常工作。

我现在需要以编程方式检查当前用户是否可以访问给定的URL。我搜索并搜索了很多对WebInvocationPrivilegeEvaluator的引用,这很好,除了我的应用程序目前有6个,我不确定使用哪个(它有6 <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,打印:
假的 假的 真正
真正
真正

示例2:同一用户未获得URL授权,打印:
假的 假
真正
真正
真正

但如果我尝试浏览网址,我会获得第二个网址的正确403

更新

如果我使用接受上下文的WebInvocationPrivilegeEvaluator的其他方法,我会得到相同的结果。我尝试了许多使用不同http元素保护它们的URL,并返回相同的布尔值(按相同顺序)。

如果我使用分配了不同角色的其他用户,我会遇到同样的问题,即不同网址的结果总是相同的(当用户有权访问它们时) ,除了这次打印以下内容:

真正
真正
真正


更新

我尝试使用<sec:authorize标记时出现更奇怪的结果,好像它只是使用了第一个WebInvocationPrivilegeEvaluator

1 个答案:

答案 0 :(得分:1)

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

我同时获得WebInvocationPrivilegeEvaluator和FilterSecurityInterceptor

UserDbAuthenticationFilter

我浏览每个并测试用于该领域的特定ROLE上的FilterSecurityInterceptor:

Dim i As Integer = 0
Dim temp_data As String
Dim clean As String = String.Empty
While Not sr.EndOfStream
    temp_data = reader.ReadLine()
    Dim sTemp = temp_data .Split("|")                 

    For Each j As String In sTemp 
        clean = j
        clean = clean.Replace("'", "").Replace("""", "").Replace(",", "")            
        sTemp(i) = clean
        i += 1
    Next
End While