我有两个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“/ admin”的命名空间。当我输入错误的网址时(例如... / admin / sdfnsdfe)。它不会重定向到管理员的登录表单 它显示错误“无法加载页面,因为重定向太多”。 我认为网址已经匹配以上所有模式,所以错误发生了。 现在我需要做些什么才能解决这个问题? 你认为我应该为用户登录命名空间是“/ user”替换命名空间默认“/”?
答案 0 :(得分:0)
当您输入/admin/sdfsdfa
之类的网址时,网址会匹配/admin/**
模式,您可以使用<intercept-url pattern="/**" access="ROLE_ADMIN" />
将其定义为安全资源。
由于用户未经过身份验证,因此会将其重定向到登录页面/admin/adminLogin
。重定向后,请求网址与/admin/**
的模式匹配,并再次重定向到/admin/adminLogin
。结果,您得到Too many redirects
。
请尝试使用/admin/adminLogin
设置security="none"
的登录页面并添加:
<http pattern="/admin/adminLogin" security="none" />
之前
<http pattern="/admin/**">
这可以禁用/admin/adminLogin