2016-07-01 2 views
0

다른 네임 스페이스를 가진 두 개의 폼 - 로그인을 만들고 싶습니다. 하나는 사용자 로그인 (네임 스페이스 기본값 "/")이고 다른 하나는 네임 스페이스 "/ admin"이있는 관리자 로그인입니다. 프로그램을 실행하면 User에 대한 form-login이 정상적으로 실행됩니다. 그러나 Admin 실행을위한 form-login은 실패합니다.스프링 보안에서 다른 네임 스페이스를 가진 다중 로그인 폼

이 내 파일 봄 보안입니다 :

<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 pattern="/login*" security="none" /> 
<http pattern="/admin/" security="none" /> 

<http pattern="/admin/**"> 
    <intercept-url pattern='admin/**' access='ROLE_ADMIN' /> 
    <access-denied-handler error-page="/user/403.jsp" /> 
    <form-login login-page="/adminLogin" default-target-url="/adminAccess" 
     authentication-failure-url="/adminLogin?error" username-parameter="username" 
     password-parameter="password" /> 
    <logout logout-success-url="/adminLogin?logout" /> 
    <http-basic /> 
</http> 
<http> 
    <intercept-url pattern="/user" access="ROLE_USER" /> 
    <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /> 
    <access-denied-handler error-page="/user/403.jsp" /> 
    <form-login login-page="/login" default-target-url="/userAccess" 
     authentication-failure-url="/login?error" username-parameter="username" 
     password-parameter="password" /> 
    <logout logout-success-url="/login?logout" /> 
</http> 

<beans:bean id="daoAuthenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <beans:property name="userDetailsService" ref="userDetailsService" /> 
</beans:bean> 

<beans:bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <beans:property name="providers"> 
     <beans:list> 
      <beans:ref local="daoAuthenticationProvider" /> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

<authentication-manager erase-credentials="false"> 
    <authentication-provider user-service-ref="userDetailsService"> 
    </authentication-provider> 
</authentication-manager> 

내가 관리자 (네임 스페이스 "/ 관리자")에 대한 양식 로그인에서 로그인 오류가 messeage "HTTP 상태 404 일이 생긴 -이 어떤 조치 네임 스페이스 [/ 관리자]와 액션 이름 [j_spring_security_check] 컨텍스트 경로 [/ 자바 프레임 워크]와 관련된에 대한 매핑되지 않습니다 "

내 web.xml 파일의 차 필터 :.

0 내 struts.xml 파일에

조치 :

<package name="default" namespace="/" extends="struts-default"> 
    <action name="login"> 
     <result>USER_LOGIN_SPRING_SECURITY</result> 
    </action> 
    <action name="userAccess" class="springAdminAction" method="execute"> 
     <result name="success">USER_SPRING_SECURITY</result> 
    </action> 

패턴 admin/** 같은
<package name="admin" namespace="/admin" extends="default-web-admin"> 
<action name="adminAccess" class="springAdminAction" method="execute"> 
     <result name="success">ADMIN_SPRING_SECURITY</result> 
    </action>  
<action name="adminLogin"> 
     <result>ADMIN_LOGIN_SPRING_SECURITY</result> 
    </action> 

답변

0

봐는 <http pattern="/admin/**">에 첨가제입니다.

<http pattern="/admin/**"> 
    <intercept-url pattern='/admin/**' access='ROLE_ADMIN' /> 

/admin/admin/** 대신 /admin/**의 봄 보안 보호 URL을하라는 메시지를 표시합니다.

<http pattern="/admin/**"> 
    <intercept-url pattern='/**' access='ROLE_ADMIN' /> 

편집 :

당신의 오류에서 : 다음

시도하십시오는 도움이 될 수 있는지 여부를 확인 서버에 대한 URL POST가 /admin/j_spring_security_check해야

HTTP Status 404 - There is no Action mapped for namespace [/admin] and action name [j_spring_security_check] associated with context path [/Java-framework].

하지만, Spring 보안 폼 로그인이 인증 프로세스를 트리거하는 기본 URL은 /j_spring_security_check입니다.

이로 인해 스프링 보안이 성공하고 /admin/j_spring_security_check이라는 요청이 Struts 필터로 전달되고 그 오류가 발생합니다.

j_spring_security_check이 URL은 <form-login>login-processing-url 속성을 통해 대체 할 수 있습니다 :

login-processing-url="/admin/j_spring_security_check" 

다음에 이것을 시도하십시오 :

<form-login login-page="/adminLogin" 
      login-processing-url="/admin/j_spring_security_check" 
      default-target-url="/adminAccess" 
      authentication-failure-url="/adminLogin?error" 
      username-parameter="username" 
      password-parameter="password" /> 

Edited2 :

당신의 다른 오류에서 ,

HTTP Status 404 - There is no Action mapped for namespace [/admin] and action name [j_spring_security_logout] associated with context path [/Java-framework]

원인은 양식 로그 아웃의 기본 URL이 j_spring_security_logout 인 것과 유사합니다. logout-url을 통해 재정의 할 수 있습니다.

<logout logout-url="/admin/j_spring_security_logout" 
     logout-success-url="/adminLogin?logout" /> 
+0

예, 내가 생각하는 당신이 진정한 이야기하지만, 그것은 그 위의 오류가 해결되지 않습니다처럼

귀하의 로그 아웃 필터를 볼 수 있습니다. 내 문제는 네임 스페이스 "/ admin"과 스프링 보안의 동작을 매핑 할 수 없다는 것입니다. 네임 스페이스 기본값 인 "/"로 잘 작동합니다. – joseJv

+0

@joseJv springSecurityFilterChain의 필터 순서가 web.xml의 struts 필터 앞에있는 경우 양식 작업은 struts 필터를 적용하기 전에 스프링 보안으로 처리해야합니다. 귀하의 URL이 봄 보안으로 구성된 패턴과 일치하면 봄 보안으로 처리됩니다. web.xml의 필터와 struct xml의 구성을 확인하십시오. 가능한 경우 스프링 보안에 대한 스택 추적을 게시하고 힌트를 제공해야합니다. – Wilson

+0

web.xml의 주문 필터가 사실이라고 생각합니다. 왜냐하면, 나는 사용자 (네임 스페이스 "/")에 대한 양식 로그인을 가지고 있기 때문입니다. 잘 작동한다. Admin (네임 스페이스 "/ admin")에 대한 양식 로그인만으로 작동하지 않습니다. 내 스택 추적에 특별한 것이 표시되지 않습니다. "HTTP 상태 404 - 네임 스페이스 [/ admin]에 매핑 된 작업이없고 컨텍스트 경로 [/ Java-framework]와 연결된 작업 이름 [j_spring_security_check]이 있습니다." 내 스트럿을 위에서 확인합니까? 나를위한 봄 보안 파일 xml? – joseJv

관련 문제