2010-11-11 14 views
11

Pozdrawiam wszystkich, używam ochrony wiosennej 3.0.2, urlRewrite 3.1.0 , i mam problem z bezpieczeństwem wiosennym, że mam regułę, że wszystkie strony w aplikacji wymagają uwierzytelnienia, z wyjątkiem niektórych stron, więc moje zabezpieczenia. XML jest:Wiosenny problem bezpieczeństwa z błędem 404?

<http use-expressions="true" > 
<intercept-url pattern="/" access="permitAll" /> 
<intercept-url pattern="/error" filter="none" /> 
<intercept-url pattern="/**" access="isAuthenticated()" /> 
. 
. 
.</http> 

w web.xml i zdefiniowaniu stronę błędu

<error-page> 
    <error-code>404</error-code> 
    <location>/p/error</location> 
</error-page> 

i kwestia jest taka, że ​​jeśli nie jestem zalogowany użytkownik, a wpisany jakiś adres URL, który nie istnieje w aplikacji, jak app/notFoundUrl, ochrona wiosenna dopasowała tę stronę do wzorca/**, który wymaga uwierzytelnienia, więc t użytkownik nie jest przekierowywany do strony błędu zgodnie z oczekiwaniami, ale przekierowany na stronę logowania, a następnie przekierowany na stronę błędu i przekierowany na stronę błędu i chciałby, jeśli użytkownik wpisał zły adres URL, jeśli jest zalogowany, czy nie, przekierowany bezpośrednio na stronę błędu.

myślę, że problem jest związany z web.xml, oto ona:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- Beans in these files will makeup the configuration of the root web application context --> 
    <!-- Bootstraps the root web application context before servlet initialization--> 
    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Deploys the 'projects' dispatcher servlet whose configuration resides in /WEB-INF/servlet-config.xml--> 
    <servlet> 
     <servlet-name>p</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
      /WEB-INF/servlet-config.xml   
      </param-value> 
     </init-param> 
    </servlet> 

    <!-- Maps all /p URLs to the 'p' servlet --> 
    <servlet-mapping> 
     <servlet-name>p</servlet-name> 
     <url-pattern>/p/*</url-pattern> 
    </servlet-mapping> 

    <error-page> 
    <error-code>404</error-code> 
    <location>/p/error</location> 
    </error-page> 


    <!-- force encoding on the requests --> 
    <filter> 
    <filter-name>encoding-filter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>utf-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>encoding-filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 



    <filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 

    </filter> 
    <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 





    <!-- Security --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     /WEB-INF/application-config.xml 
     /WEB-INF/app-security.xml 
     /WEB-INF/mvc-config.xml 
    </param-value> 
    </context-param> 


    <session-config> 
     <session-timeout>1</session-timeout> 
    </session-config> 


</web-app> 

jakieś pomysły jak rozwiązać ten problem?

Odpowiedz

6

Powiedziałeś:

chcę, że jeśli użytkownik wpisze zły url jeśli on zalogowany czy nie, on przekierowany do strony błędu bezpośrednio

Wiosna bezpieczeństwo przechwyci każde żądanie zanim dowie się, czy jego adres URL jest poprawny, czy nie, więc sposobem na jego uzyskanie będzie przechwycenie wszystkich poprawnych adresów URL z pewnymi wzorami i dodanie na końcu ogólnego wzorca, do którego mógłby uzyskać dostęp każdy.

<intercept-url pattern="/" access="permitAll" /> 
<intercept-url pattern="/validUrl1Pattern" access="permitAll" /> 
<intercept-url pattern="/validUrl2Pattern" access="permitAll" /> 
<intercept-url pattern="/validUrl2Pattern" access="permitAll" /> 
... 
<intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> 

Problem tej konfiguracji polega na tym, że prawdopodobnie trudno jest znaleźć wzorce dla wszystkich poprawnych adresów URL, jeśli aplikacja jest złożona.

+1

"Zasadniczo dobrą praktyką jest domyślnie odmawianie dostępu, a nie tylko zabezpieczanie potrzebnych zasobów." - cytat z samouczka [Spring Security] (http://static.springsource.org/spring-security/site/tutorial.html) –

2

Dodaj/błąd do listy elementów <intercept-url/>, aby nie wymagał uwierzytelnienia, aby uzyskać do niego dostęp.

+0

znaczy tylko dodanie tej reguły?

+0

Mam wyjątek odmowy dostępu, ponieważ strona, która nie istnieje, jest zgodna z wzorcem "/ **", który używa reguły access = "isAuthenticated () "oraz w przypadku niezalogowanego użytkownika rolą jest anonyomus, więc użytkownik jest przekierowywany z powrotem do strony logowania –

+0

post zostały poddane edycji, jakiejkolwiek pomocy? –

3

Po ustawieniu atrybutu access="true", powiadamiasz Spring-Security, aby sprawdził, czy użytkownik ma atrybut bezpieczeństwa (który jest zwykle rolą) o nazwie "true". Nie sądzę, że to jest twój cel?

ominąć zabezpieczenia, można ustawić filters="none" i pominąć atrybut dostępu: <intercept-url pattern="/errorpage" filters="none" />

widzieć documentation of <intercept-url>

3

Tak po prostu dodać to:

<intercept-url pattern="/error/**" access="permitAll" /> 

Że zrobi to tak, że każdy może dostać się do wszystkich stron z błędami.

+0

post zostały poddane edycji, każda pomoc? –

Powiązane problemy