Spring security Spring Security-基于角色的不同筛选器入口点

Spring security Spring Security-基于角色的不同筛选器入口点,spring-security,Spring Security,我正在开发一个webapp,它支持两种类型的用户-用户和管理员 网站有两个部分-用户端和管理端。我正在使用SpringSecurity来保护这两个站点,它运行得非常好,只是我遇到了一点问题 基本上,如果用户未登录并试图访问站点任何部分的页面,则应将其定向到其他登录页面。例如: 用户未登录并尝试访问只有用户才能看到的页面->用户被截获并定向到LoginPageOne.jsp 另一种情况是: 用户未登录并尝试访问只有管理员才能看到的页面->用户被截获并定向到LoginPageTwo.jsp

我正在开发一个webapp,它支持两种类型的用户-用户和管理员

网站有两个部分-用户端和管理端。我正在使用SpringSecurity来保护这两个站点,它运行得非常好,只是我遇到了一点问题

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

  • 用户未登录并尝试访问只有用户才能看到的页面->用户被截获并定向到LoginPageOne.jsp
另一种情况是:

  • 用户未登录并尝试访问只有管理员才能看到的页面->用户被截获并定向到LoginPageTwo.jsp
我尝试了很多方法,但都没有成功。首先,我尝试在applicationContext-security.xml中创建两组独立的截取URL,它们将使用不同的入口点引用,而入口点引用又将指向不同的登录URL。此操作失败-Web应用程序甚至无法启动

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

我已经在互联网站上搜索了很多次,但还没有找到解决问题的方法,因此非常感谢您的帮助:-)

谢谢,

一种方法是扩展AuthenticationProcessingFilter以覆盖

protected String determineFailureUrl(HttpServletRequest request, 
                                     AuthenticationException failed);
然后,根据请求URL和身份验证异常,确定入口点URL。

配置示例:

<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"/>

从第3版开始,Spring安全性引入了
org.springframework.Security.web.authentication.DelegatingAuthenticationEntryPoint

它充当一个代理,允许您向其中注入许多入口点,并在运行时决定应为特定请求选择哪个入口点

它的使用非常简单,但如果您有任何问题,请在评论中告诉我。

其他选项


我感到困惑-为什么不将他们引导到同一个登录页面,如果他们登录并具有正确的角色,那么他们将被引导到其原始目的地?对不起,我应该详细说明我为什么要这样做。基本上,我们提供了一个注册链接和一个登录框。我希望只有一个链接,而不是一个写着“单击此处注册为用户”的链接和另一个写着“单击此处注册为管理员”的链接。因此,我相信我需要使用jsp。如果我可以使用某种逻辑来输出正确的注册链接,但想不出一种方法……我可能错了,但该方法不是只有在用户尝试登录后才被调用(而不是在Spring Security中断用户时)吗。这两个loginFormUrl似乎导致应用程序在启动时失败-知道如何通过spring配置传入这些url吗?这样做比硬编码到定制的过滤器入口点要好得多,因为它本身没有意义,而且目标资源也不能保证将来是活动的。在这里包括答案的基本部分,并提供链接供参考。
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.
}