2016-10-07 4 views
1

В поисках ответа на вопрос this, я играл с методами фильтрации запроса на основе Ip-адреса. У меня есть следующий метод:Не удалось оценить выражение 'hasIpAddress (..)' в PreAuthorize

@RequestMapping(value = "/payment", method = POST) 
@PreAuthorize("hasIpAddress('XXX.XXX.X.XX')") 
public String pay(PaymentDto paymentDto){ 
    System.out.println("Payment received"); 
    return "OK"; 
} 

Однако, при исполнении, это бросает мне ошибку:

{"errorMessage":"Internal Server Error","errorId":"26b1a1ba-3ae8-4497-9f1c-7370ea5116ff","errorDetails":{"message":"Failed to evaluate expression 'hasIpAddress('XXX.XXX.X.XX')'","exception":"java.lang.IllegalArgumentException","errors":null}} 

Что происходит?

Это Java ошибка:

org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 0): Method call: Method hasIpAddress(java.lang.String) cannot be found on org.springframework.security.access.expression.method.MethodSecurityExpressionRoot type 
    at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:211) ~[spring-expression-4.2.3.RELEASE.jar!/:4.2.3.RELEASE] 
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:125) ~[spring-expression-4.2.3.RELEASE.jar!/:4.2.3.RELEASE] 
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:85) ~[spring-expression-4.2.3.RELEASE.jar!/:4.2.3.RELEASE] 
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131) ~[spring-expression-4.2.3.RELEASE.jar!/:4.2.3.RELEASE] 

ответ

2

Doc , hasIpAddress is Web Security Expression and not available for @PreAuthorize. You can use like this

<http use-expressions="true"> 
    <intercept-url pattern="/admin*" 
     access="hasRole('admin') and hasIpAddress('xxx.xx.xx.xxx')"/> 
    ... 
    </http> 

или

http 
    .authorizeRequests() 
    .antMatchers("/tokens").access(
      "hasIpAddress('xxx.x.xx.xx')) 

Но не как

@PreAuthorize("hasIpAddress('XXX.XXX.X.XX')") 
public String pay(PaymentDto paymentDto){ 
Смежные вопросы