我正在开发一个webapp,允许用户使用两种类型 - 用户和管理员。
网站有两个部分 - 用户端和管理员端。我正在使用Spring Security来保护这两个站点并且它的工作非常好,除非我遇到了一些问题。
基本上,如果用户未登录并尝试访问网站任一部分的页面,则应将其定向到其他登录页面。例如:
另一种情况是:
我试图通过多种方式做到这一点而没有任何成功。首先,我尝试在我的applicationContext-security.xml中创建两个单独的intercept-urls集,它们将使用不同的入口点引用,这些引用点又将指向不同的登录URL。这失败了 - 网络应用甚至无法启动。
现在我正在尝试扩展AuthenticationProcessingFilterEntryPoint,但我不知道如何根据用户尝试访问的资源转发用户。我希望我能找到用户访问资源所需的角色,并根据它将它们转发到正确的页面,但我不确定这是否可行。
我已经对互联网进行了一些搜索,并且没有设法找到解决我问题的方法,所以对此有任何帮助将不胜感激: - )
谢谢, 蒙古包。
答案 0 :(得分:1)
从版本3开始,Spring Security引入了org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint
。
它充当代理,允许您向其中注入许多入口点,并在运行时决定应该为特定请求选择哪个点。
使用起来非常简单,但如果您遇到任何问题 - 请在评论中告诉我。
答案 1 :(得分:0)
一种方法是扩展 AuthenticationProcessingFilter 以覆盖
protected String determineFailureUrl(HttpServletRequest request,
AuthenticationException failed);
然后,根据请求URL和身份验证例外,确定入口点URL。
答案 2 :(得分:0)
配置示例:
<http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint" >
<intercept-url pattern="/user" access="ROLE_USER"/>
<intercept-url pattern="/admin" access="ROLE_ADMIN"/>
<form-login login-page="/adminlogin" authentication-failure-url= "/adminlogin?error=true" default-target-url="/admin" />
</http>
<beans:bean id="authenticationProcessingFilterEntryPoint"
class="your.package.CustomAuthenticationProcessingFilterEntryPoint">
<beans:property name="loginFormUrl" value="/adminlogin"/>
<beans:property name="userLoginFormUrl" value="/userlogin"/>
<beans:property name="forceHttps" value="false"/>
和 班级:
public class CustomAuthenticationProcessingFilterEntryPoint extends AuthenticationProcessingFilterEntryPoint {
@Override
protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) {
//check request.getRequestURI() and return where you need to redirect user.
}
答案 3 :(得分:0)