2011-03-25 3 views
2

Je tente d'implémenter la sécurité de mon application en utilisant la sécurité de printemps. j'intercepter la page en utilisant intercept-url, par exemple:Spring Security L'intercept-url ne correspond pas au caractère générique

<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> 

à la première fois que je tente d'accéder au journal pour l'utilisateur anonyme en utilisant url: localhost/projectname/logList et la page redirigera automatiquement vers la page de connexion

mais quand j'essaie d'accéder à la page du journal en utilisant l'adresse localhost/projectname/logList/ l'utilisateur anonyme peut accéder à la page du journal

pourquoi il peut arriver quand le modèle /logList* est correct?

+0

êtes-vous _sure_ que la 2ème fois que vous accédez à l'URL, vous ne l'avez pas déjà une session authentifiée? Il n'y a pas d'autre explication quant à la raison pour laquelle vous serez redirigé vers la page de connexion la première fois que vous essayez de le faire, mais pas la deuxième fois. Pouvez-vous clarifier les étapes exactes que vous prenez? –

Répondre

2

Par défaut, AntPathRequestMatcher est utilisé. Si vous ajoutez un autre motif

alors cela fonctionnera.

Voici les tests (Notez que avec RegexRequestMatcher, même modèle fonctionne pour les deux/logList/et/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)); 
} 

Pour utiliser RegexRequestMatcher, ajoutez l'attribut 'demande-matcher' http et définir sa valeur à « regex »:

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

+0

Juste une note que "request-matcher" nécessite Spring Sec 3.1+. L'équivalent dans les versions inférieures est "path-type". –

+0

J'ai utilisé path-type = "regex" en utilisant spring sec 3.0, mais l'erreur NullPointerExecption s'est produite. Je télécharge toujours le printemps sec 3.1+ –

0

Est-ce que pattern="/logList/**" fait la différence?

+0

J'ai essayé d'utiliser ** pattern, mais il n'y a pas de différence –

Questions connexes