在Spring Security 3.0中,我们拥有AuthenticationProcessingFilter使用determineTargetUrl()方法的类,该方法根据不同的角色返回url。
AuthenticationProcessingFilter
determineTargetUrl()
现在,我们将转向Spring Security 3.1.0.RC3,AuthenticationProcessingFilter由于从新版本中删除了类,因此我现在应该如何根据不同的角色确定url 。任何人都可以通过一些代码简要地介绍我的步骤,以便我可以实现自定义过滤器以重定向到不同角色的不同页面。
根据角色确定目标URL的最佳方法是在Spring Security配置中指定目标URL,如下所示。这将在Spring 3.0或3.1中运行
<http> ... <form-login login-page="/login" default-target-url="/default"/> </http>
然后创建一个处理default-target-url的控制器。控制器应根据侧滚进行重定向或转发。下面是使用Spring MVC的示例,但是任何类型的控制器都可以使用(例如Struts,Servlet等)。
@Controller public class DefaultController { @RequestMapping("/default") public String defaultAfterLogin(HttpServletRequest request) { if (request.isUserInRole("ROLE_ADMIN")) { return "redirect:/users/sessions"; } return "redirect:/messages/inbox"; } }
这种方法的优点是它不与任何特定的Security实现耦合,不与任何特定的MVC实现耦合,并且可以与Spring Security命名空间配置一起轻松使用。完整的示例可以在我今年在SpringOne上提出的SecureMail项目中找到。
另一种选择是你可以创建一个自定义AuthenticationSuccessHandler。该实现可能扩展SavedRequestAwareAuthenticationSuccessHandler,它是默认的AuthenticationSuccessHandler。然后可以使用命名空间将其连接,如下所示。
<sec:http> <sec:form-login authentication-success-handler-ref="authSuccessHandler"/> </sec:http> <bean:bean class="example.MyCustomAuthenticationSuccessHandler"/>
我不建议这样做,因为它与Spring Security API有关,最好在可能的情况下避免这样做。