使用spring verison 3.2和security 3.2
您好, 我正在查看我们的应用程序中的一个问题,即当我们应该获得HTTP 403响应时,我们会收到HTTP 422响应。 问题似乎是在检查安全凭证之前,JSR 303验证是在请求处理程序框架内发生的。这显然会留下一个漏洞,因为如果没有经过适当授权的会话,就可以找出有效请求的样子。
我在ServletInvocationHandlerMethod(spring的代码)中跟踪了这段代码的问题:
public final Object invokeForRequest(NativeWebRequest request,
ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
if (logger.isTraceEnabled()) {
StringBuilder builder = new StringBuilder("Invoking [");
builder.append(this.getMethod().getName()).append("] method with arguments ");
builder.append(Arrays.asList(args));
logger.trace(builder.toString());
}
Object returnValue = invoke(args);
if (logger.isTraceEnabled()) {
logger.trace("Method [" + this.getMethod().getName() + "] returned [" + returnValue + "]");
}
return returnValue;
}
对getMethodArgumentValues的调用会导致每个参数都被验证。这包括验证JSR 303注释。
对invoke()的调用将调用由AbstractSecurityInterceptor包装的控制器上的实际方法,并检查该请求是否已获得授权。这意味着在验证检查后发生授权检查。
这是否发生是因为我没有正确配置拦截器?安全拦截器应该在调用堆栈中进一步包裹吗?
我们是否错误地使用JSR 303?
还有其他解决方法吗?