我有一个以模块化方式构建的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
。
答案 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