Spring Security - 基于角色的不同过滤器入口点

时间:2009-11-05 09:43:19

标签: spring-security

我正在开发一个webapp,允许用户使用两种类型 - 用户和管理员。

网站有两个部分 - 用户端和管理员端。我正在使用Spring Security来保护这两个站点并且它的工作非常好,除非我遇到了一些问题。

基本上,如果用户未登录并尝试访问网站任一部分的页面,则应将其定向到其他登录页面。例如:

  • 用户未登录并尝试访问只有用户可以看到的页面 - >用户被拦截并被定向到LoginPageOne.jsp

另一种情况是:

  • 用户未登录并尝试访问只有管理员才能看到的页面 - >用户被拦截并被定向到LoginPageTwo.jsp

我试图通过多种方式做到这一点而没有任何成功。首先,我尝试在我的applicationContext-security.xml中创建两个单独的intercept-urls集,它们将使用不同的入口点引用,这些引用点又将指向不同的登录URL。这失败了 - 网络应用甚至无法启动。

现在我正在尝试扩展AuthenticationProcessingFilterEntryPoint,但我不知道如何根据用户尝试访问的资源转发用户。我希望我能找到用户访问资源所需的角色,并根据它将它们转发到正确的页面,但我不确定这是否可行。

我已经对互联网进行了一些搜索,并且没有设法找到解决我问题的方法,所以对此有任何帮助将不胜感激: - )

谢谢, 蒙古包。

4 个答案:

答案 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)