pring security 做的登录程序,不同角色的用户登录之后,可能会跳转到不同的页面,在默认情况下的配置,都是跳转到同一个页面,因为在 form-login 中设置的 default-target-url 就是登录后应该跳转到的页面。如何使得不同角色的用户登录后跳转到不同的页面呢? 至少有两种方法:
1. 方法一, 就在 form-login 的 default-target-url 上做处理,比如如果用 spring mvc 的controller 来做的话,就比较容易。
2. 方法二, 实现 spring 提供的 AuthenticationSuccessHandler 接口.
方法一, 就在 form-login 的 default-target-url 上做处理,比如如果用 spring mvc 的controller 来做的话,就比较容易。
在前面例子的基础上,增加如下代码:
@RequestMapping(value="/dispatch", method = RequestMethod.GET)
public View dispatch(ModelMap model,HttpServletRequest request) {
String path = request.getContextPath() ;
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
Set<String> roles = AuthorityUtils.authorityListToSet(SecurityContextHolder.getContext()
.getAuthentication().getAuthorities());
if (roles.contains("ROLE_ADMIN")) {
return new RedirectView(basePath + "app/admin");
}
return new RedirectView(basePath + "app/welcome");
}
同时 spring security 的配置如下:
<!-- 第一种方法,可以用 default-target-url 作为一个controller 来跳转.比较简单 -->
<http auto-config="true">
<intercept-url pattern="/app/welcome*" access="ROLE_USER" />
<intercept-url pattern="/app/admin*" access="ROLE_ADMIN" />
<form-login login-page="/app/login" default-target-url="/app/dispatch"
authentication-failure-url="/app/loginfailed" />
<logout logout-success-url="/app/logout" />
</http>
<!-- 第一种方法结束 -->
这是一种比较简单的跳转方法, 在以前做系统的时候,基本都是采用这种方法,跳转到一个页面之后,再跳转到另外一个页面。
2. 方法二, 实现 spring 提供的 AuthenticationSuccessHandler 接口.
新增加一个类来处理页面的跳转:
Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
/*String path = request.getContextPath() ;
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";*/
System.out.println(request.getContextPath());
if (roles.contains("ROLE_ADMIN")){
/*response.sendRedirect(basePath+"app/admin");
return;*/
//如果是要跳转到某个页面的,比如我们的那个whoim的则
new DefaultRedirectStrategy().sendRedirect(request, response, "/ADMIN");
return;
}
/*response.sendRedirect(basePath+"app/welcome");*/
new DefaultRedirectStrategy().sendRedirect(request, response, "/USER");
return;
然后