2013-05-03 163 views
2

我使用下面的配置的控制器的方法:春季安全hasIpAddress問題

@RequestMapping(value = "/encore/{userName}/{token}", method = RequestMethod.GET) 
@ResponseBody 
@PreAuthorize("hasIpAddress('192.168.1.2/24')") 
public EncoreAccount validateUserRequest(HttpServletRequest request, 
    @PathVariable(value = "userName") String userName, 
    @PathVariable(value = "token") String token) { 
} 

,我有這一個在webmvc-config.xml中

<security:global-method-security pre-post-annotations="enabled" /> 

但是當我運行它,我得到以下異常:

Caused by: 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 

我知道hasIpAddress()是org.springframework.security.web.access.expression.WebSec urityExpressionRoot。

你知道爲什麼它不查找WebSecurityExpressionRoot中的方法嗎?

非常感謝,

回答

2

hasIpAddress()表達可用於網絡安全

org.springframework.security。 網絡 .access.expression.WebSecurityExpressionRoot

@PreAuth使用

org.springframework.security.access.expression。 方法 .MethodSecurityExpressionRoot

你可以用hasIpAddress()但沒有一個方法確保URL(攔截)。

+0

當你閱讀春季安全文檔時,並不明顯。我會把我的筆記放在這裏,你仍然可以用PreAuthorize和spel來做到這一點,儘管這並沒有考慮代理服務器或負載平衡器等事情。 User @PreAuthorize(「#request.getRemoteAddr()。equals('127.0.0.1')」)並將HttpServletRequest請求變量放入方法參數 – chrismarx 2015-06-23 17:52:23