簡體   English   中英

Spring Security中具有不同名稱空間的多個登錄表單

[英]Multiple login form with different namespace in Spring Security

我想創建兩個具有不同名稱空間的表單登錄,一個用於用戶登錄(名稱空間默認為“ /”),一個用於使用名稱空間“ / admin”的管理員登錄。 當我運行程序時,用戶的表單登錄運行良好。 但是,管理員運行的表單登錄失敗。

這是我的文件春季安全性:

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

當我登錄到Admin的表單登錄名(名稱空間為“ / admin”)時,錯誤發生,消息為“ HTTP狀態404-沒有為名稱空間[/ admin]和名稱為[j_spring_security_check]的操作映射了上下文路徑[/” Java框架]。

我的web.xml文件中的訂單過濾器:

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

<!-- Define filter for Struts 2 -->
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/* </url-pattern>
</filter-mapping>

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

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

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

看起來admin/**模式在<http pattern="/admin/**">

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

這將提示Spring Security受保護的URL /admin/admin/**而不是/admin/**

請嘗試以下內容,看看是否有幫助:

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

編輯:

從您的錯誤:

HTTP狀態404-沒有與上下文路徑[/ Java-framework]關聯的名稱空間[/ admin]和操作名稱[j_spring_security_check]映射的操作。

到服務器的POST地址應該是/admin/j_spring_security_check ,但是Spring Security Form Login用來觸發認證過程的默認URL是/j_spring_security_check

這會導致Spring Security通過身份驗證,並且/admin/j_spring_security_check的請求將傳遞給Struts過濾器,並且您收到該錯誤。

可以通過<form-login>上的login-processing-url屬性覆蓋j_spring_security_check 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" />

編輯2:

從另一個錯誤,

HTTP狀態404-沒有與上下文路徑[/ Java-framework]關聯的名稱空間[/ admin]和操作名稱[j_spring_security_logout]映射的操作

原因相似,表單注銷的默認URL為j_spring_security_logout 您可以通過logout-url覆蓋它。

您的注銷過濾器如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM