2013-09-22 2 views
2

저는 스프링 보안을 처음 사용하고있어서 문제가 있습니다. 제한 될 것으로 예상되는 페이지에 액세스하려고하면 요청 된 페이지가 표시되고, 403 페이지도 아니고 로그인 페이지로 리디렉션되거나, 로그에 오류가 없으며, 스프링 보안이 전혀 구현되지 않은 것처럼 표시되지 않습니다. 단지를 테스트하기 위해,스프링 보안은 액세스를 제한하지 않습니다.

INFO: Checking whether login URL '/security/credentials' is accessible with your configuration 

내가 제한된 페이지로 로그인 페이지를 변경 시도 : 응용 프로그램이 나는 봄 보안이 적어도 시작 하더군요 로그에 다음을 참조 배포

실제로 제한되어 있고 다음과 같은 결과를 얻었습니다. 적어도 시뮬레이션에서 제한적이라는 말을 들었습니다.

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <welcome-file-list> 
     <welcome-file> 
     index.html 
     </welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
     <param-value>messages</param-value> 
    </context-param> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     WEB-INF/applicationContext.xml 
    </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <filter> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
     <init-param> 
     <param-name>logLevel</param-name> 
     <param-value>TRACE</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</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> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/applicationContext.xml 
     </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 

    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

봄 보안 구성 파일을 내 applicationContext.xml에서 수입

의 web.xml :

INFO: Checking whether login URL '/dashboard' is accessible with your configuration 

org.springframework.security.config.http.DefaultFilterChainValidator checkLoginPageIsntProtected 
WARNING: Anonymous access to the login page doesn't appear to be enabled. This is almost certainly an error. Please check your configuration allows unauthenticated access to the configured login page. (Simulated access was rejected: org.springframework.security.access.AccessDeniedException: Access is denied) 

나는 다음과 같은 설정이있다.

실제로 /security/** 요청에는 인증 (access="permitAll")가 필요 없다고 봄을 말하고있다으로

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <http auto-config="true" use-expressions="true"> 
     <form-login 
     login-page="/security/credentials" 
     login-processing-url="/security/signin" 
     default-target-url="/dashboard" 
     authentication-failure-url="/security/signin_failed" /> 
     <intercept-url pattern="/resources/**" access="permitAll"/> 
     <intercept-url pattern="/security/**" access="permitAll" /> 
     <intercept-url pattern="/favicon.ico" access="permitAll"/> 
     <intercept-url pattern="/**" access="denyAll"/> 
     <logout logout-success-url="/security/signout" /> 
     <remember-me /> 
    </http> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider> 
     <user-service> 
      <user name="test" password="password" authorities="ROLE_USER" /> 
     </user-service> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 
+0

액세스하려는 제한된 페이지의 전체 URL을 제공해주십시오. – coder

+0

내가 액세스하려고하는 페이지의 전체 URL은 mydomain/dashboard입니다. – user2805089

답변

0

<remember-me /> 태그를 제거하거나 먼저 쿠키를 모두 삭제 한 후에 사용해 보시기 바랍니다. 그것은 당신이 대시 보드를/액세스 할 수 있기 때문에 쿠키를 기존의 표시

편집 : 당신은 UrlRewriteFilter 봄 보안 전에 구성한 가 최종 URL 이잖아 보안 필터를 튀어 주어진 뭐죠 확인하거나 UrlRewriteFilter을 비활성화 한 후에 시도 할 수 있습니다 ?

+0

로그인 한 적이 없지만 어쨌든 쿠키를 삭제했으며 여전히 동일한 문제가 발생합니다. 또한 로그인 한 경우에도 액세스를 차단해야하는 denyAll 액세스 세트가 있습니다. – user2805089

+0

보안을 강화하기 전에 UrlRewriteFilter를 구성 했습니까? 스프링 보안 필터에 지정된 최종 URL을 확인하거나 UrlRewriteFilter를 비활성화 할 수 있습니까? – coder

+0

방금 ​​필터의 순서를 바꿨으므로 올바르게 작동합니다. 이 주석을 대답으로 표시하는 방법을 모르겠습니다. – user2805089

1

봄이 제대로 작동하고 스프링 security.xml : 당신에 대한 액세스를 제한하고 싶다면

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

을 인증 된 사용자 만 지정할 수 있습니다.

... 
<intercept-url pattern="/security/**" access="isAuthenticated()" /> 
... 

또는 특정 역할 (특정 역할과 ROLE_XXX 교체)에 대한 액세스를 제한하기를 원한다면 :

... 
<intercept-url pattern="/security/**" access="hasRole('ROLE_XXX')" /> 
... 

(분명한 이유) 관련 URL이 제한 될 수없는 로그인 참고 :

login-page="/security/credentials" 
    login-processing-url="/security/signin" 
    default-target-url="/dashboard" 
    authentication-failure-url="/security/signin_failed" /> 

그러니 오히려 /login/ 같은 것을 시작하는 대신 /security/ 또는 (당신이 그들을 사용해야하는 경우) 그들 각각에 대해 특정 차단 URL을 추가하도록 변경 :

... 
<intercept-url pattern="/security/credentials" access="permitAll" /> 
<intercept-url pattern="/security/signin" access="permitAll" /> 
<intercept-url pattern="/security/signin_failed" access="permitAll" /> 
<intercept-url pattern="/security/**" access="isAuthenticated()" /> 
... 

스프링은 맨 위에서 발견되는 첫 번째 규칙을 사용하므로 더 구체적인 URL을 먼저 선언해야합니다.

+0

예/security/**는 허용되어야합니다. 문제는/대시 보드에 대한 요청이 허용되고 거부되어야한다는 것입니다. – user2805089

+0

위와 같이 앱을 구성했는데 로그인과 로그 아웃에 모두 문제가 없습니다. 뒤로 버튼을 사용할 때 로그인이 실패하면 브라우저의 뒤로 버튼을 클릭하면 로그인 화면으로 이동합니다. 그것은 로그 아웃 후에도 똑같이 행동합니다. 이것에 대한 어떤 수정? – tmh

관련 문제