Springframework:JSR 303验证在安全验证之前进行

时间:2015-07-31 13:52:25

标签: java spring validation spring-security

使用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?

还有其他解决方法吗?

0 个答案:

没有答案