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