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