簡體   English   中英

在Spring Security中使用不同的名稱空間為多個表單登錄設置攔截器

[英]Make Interceptors for multiple form-login with different namespace in Spring Security

我有兩個http模式,它與兩個登錄表單相對應。 一種用於使用名稱空間默認“ /”的用戶登錄,一種用於使用名稱空間“ / admin”的管理員登錄。 我為每個登錄表單設置攔截器時遇到問題。

當我在管理員的登錄表單中輸入錯誤的網址時,發生了錯誤。 (例如... / admin / sdfsdfa)。 我沒有重定向到管理員的登錄表單

"Unable to load page,because Too many redirects".

我的spring-security.xml:

<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="/**" access="ROLE_ADMIN" />
    <form-login login-page="/admin/adminLogin"
        login-processing-url="/admin/j_spring_security_check"
        default-target-url="/admin/adminAccess" authentication-failure-url="/admin/adminLogin?error"
        username-parameter="username" password-parameter="password" />
    <logout logout-url="/admin/j_spring_security_logout"
        logout-success-url="/adminLogin?logout" />
</http>
<http>
    <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>

當我使用用戶的登錄表單登錄時(命名空間默認為“ /”)。 它運作良好,可以攔截所有請求,因此,如果沒有登錄成功,我們將無法訪問任何URL。 它會自動將url重定向到url用戶的登錄形式。

但是,當我使用管理員的登錄表單(命名空間默認為“ / admin”)登錄時。 我看到彈簧安全攔截器工作不正確或不起作用。 在管理員“ / admin”的名稱空間。 當我輸入錯誤的網址時(例如... / admin / sdfnsdfe)。 它不會重定向到管理員的登錄表單中,並顯示錯誤“由於重定向過多,無法加載頁面”。 我認為url與上述所有模式都匹配,因此發生了錯誤。 現在我需要做些什么來解決這個問題? 您是否認為我應該使用戶登錄的名稱空間是“ / user”,替換名稱空間默認的“ /”?

當您輸入/admin/sdfsdfa之類的URL時,URL匹配/admin/** ,您可以使用<intercept-url pattern="/**" access="ROLE_ADMIN" />將其定義為安全資源。

由於用戶未通過身份驗證,因此將其重定向到登錄頁面/admin/adminLogin 重定向后,請求URL與/admin/**的模式匹配, /admin/adminLogin再次重定向到/admin/adminLogin 結果,您獲得了Too many redirects

請嘗試使用security="none"設置/admin/adminLogin登錄頁面並添加:

<http pattern="/admin/adminLogin" security="none" />

之前

<http pattern="/admin/**">

這可以為/admin/adminLogin的請求路徑禁用安全篩選器鏈

暫無
暫無

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

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