Я хочу разрешить только запросы от локального хоста для определенного шаблона URL. Я пробовал это до сих пор:
<sec:intercept-url pattern = "/blabla/**" access = "hasIpAddress('127.0.0.1')" />
Но это не работает, и я получил следующее утверждение в выводе журнала:
Access is denied (user is anonymous); redirecting to authentication entry point
Итак, мой вопрос: как разрешить доступ анонимных пользователей только с локального хоста?
Взгляните на метод HttpSecurity::anonymous
, включающий и обеспечивающий конфигурацию AnonymousConfigurer<H extends HttpSecurityBuilder<H>>
анонимной аутентификации.
В вашем классе конфигурации Spring Security должен быть переопределяющий метод:
@Override
public void configure(HttpSecurity http) throws Exception {
http.and()
.anonymous()... // enables and configures the anonymous access
.and()
.authorizeRequests()...
Можно ли выразить это отношение and()
в конфигурации на основе XML?
Is it possible to express this and() relation in XML based configuration?
Согласно документации здесь https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html ниже должно работать.
Здесь мы определили, что область «blabla» приложения (определяемая шаблоном URL) должна быть доступна только анонимным пользователям, чей IP-адрес соответствует 127.0.0.1.
<sec:intercept-url pattern = "/blabla/**"
access = "isAnonymous() and hasIpAddress('127.0.0.1')"/>
когда я пытался использовать hasIpAddress('127.0.0.1')
, он разрешал доступ только с IP-адреса, но запрещал доступ с localhost
. Я заставил его работать, добавив его версию IP6 hasIpAddress('127.0.0.1') or hasIpAddress('::1')
В итоге я использовал следующее:
http.authorizeRequests()
// restrict all requests unless coming from localhost IP4 or IP6
.antMatchers("/**").access("hasIpAddress(\"127.0.0.1\") or hasIpAddress(\"::1\")")
Я пробовал только с hasIpAddress("127.0.0.1")
, который работал нормально, если я помещал этот IP-адрес в URL-адрес браузера, но он не работал с запросом его от localhost
в качестве псевдонима.
Попробуйте добавить номер порта с IP
<sec:intercept-url pattern = "/blabla/**" access = "hasIpAddress('127.0.0.1:portnumber')" />