URL-адрес Spring Security не совпадает с подстановочным знаком - PullRequest
2 голосов
/ 25 марта 2011

Я пытаюсь реализовать защиту для моего приложения, используя Spring Security. Я перехватываю страницу, используя intercept-url, например:

<http auto-config='true'>
    <intercept-url pattern="/logList*" access="ROLE_ADMIN" />
    <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" />
    <logout />
    <remember-me/>
</http> 

в первый раз я пытаюсь получить доступ к журналу для анонимного пользователя, используя url: localhost / projectname / logList и страница автоматически перенаправляется на страницу входа

но когда я пытаюсь получить доступ к странице журнала с помощью URL localhost/projectname/logList/ анонимный пользователь может получить доступ к странице журнала

почему это может произойти, если шаблон /logList* правильный?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

По умолчанию используется AntPathRequestMatcher.Если вы добавите другой шаблон

<intercept-url pattern="/logList/*" access="ROLE_ADMIN" />, он будет работать.

Вот тесты (обратите внимание, что с RegexRequestMatcher один и тот же шаблон работает как для / logList /, так и / logList):

    @Test
public void antTest1() throws Exception {

    AntPathRequestMatcher pathMatcher = new AntPathRequestMatcher("/loglist*");
    MockHttpServletRequest mockRequest = new MockHttpServletRequest();
     mockRequest.setScheme("http");
     mockRequest.setPathInfo("/logList");
    Assert.assertThat(pathMatcher.matches(mockRequest), is(true));
}

@Test
public void antTest2() throws Exception {


    AntPathRequestMatcher pathMatcher = new AntPathRequestMatcher("/loglist/*");
    MockHttpServletRequest mockRequest = new MockHttpServletRequest();
     mockRequest.setScheme("http");
     mockRequest.setPathInfo("/logList/");
    Assert.assertThat(pathMatcher.matches(mockRequest), is(true));
}

@Test
public void regexTest3() throws Exception {

    RegexRequestMatcher pathMatcher = new RegexRequestMatcher("/logList.*", "GET");
    MockHttpServletRequest mockRequest = new MockHttpServletRequest();
     mockRequest.setScheme("http");
     mockRequest.setMethod("GET");
     mockRequest.setPathInfo("/logList/");
    Assert.assertThat(pathMatcher.matches(mockRequest), is(true));
}

@Test
public void regexTest4() throws Exception {

    RegexRequestMatcher pathMatcher = new RegexRequestMatcher("/logList.*", "GET");
    MockHttpServletRequest mockRequest = new MockHttpServletRequest();
     mockRequest.setScheme("http");
     mockRequest.setMethod("GET");
     mockRequest.setPathInfo("/logList");
    Assert.assertThat(pathMatcher.matches(mockRequest), is(true));
}

Чтобы использовать RegexRequestMatcher, добавьте атрибут 'request-matcher' в http и установите его значение в 'regex':

<http auto-config="true" request-matcher="regex">

0 голосов
/ 25 марта 2011

Имеет ли значение pattern="/logList/**" разницу?

...