spring security 登录根据用户角色跳转到不同的页面

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 接口. 
新增加一个类来处理页面的跳转:
package com.yihaomen.accesshandle;
import java.io.IOException;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
public class LoginSuccessHandle implements AuthenticationSuccessHandler{
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication) throws IOException,ServletException {
        
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
        String path = request.getContextPath() ;
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
        if (roles.contains("ROLE_ADMIN")){
            response.sendRedirect(basePath+"app/admin");   
            return;
        }
        response.sendRedirect(basePath+"app/welcome");        
    }
}


同理,spring security 的配置文件也应该相应的修改:
  <!-- 第二种方法, 用自己写的 handle 处理.配置在 mvc-dispatcher-servlet.xml中的 bean --> 
    
    <http auto-config="true">
        <intercept-url pattern="/app/admin*" access="ROLE_ADMIN" />
        <intercept-url pattern="/app/welcome*" access="ROLE_USER" />
        <access-denied-handler ref="accessDeniedHandler"/>        
        <form-login authentication-success-handler-ref="mySuccessHandler"/>
        <logout logout-success-url="/app/logout" />
    </http>
     
    <!-- 第二种方法结束 -->


当然这里用到 ref=mySuccessHandler, 所以需要配置这个 bean
 <bean id="mySuccessHandler" class="com.yihaomen.accesshandle.LoginSuccessHandle">
     </bean>


其实这两种方式很类似,都实现了不同角色的用户登录后跳转到不同的页面。运行程序,用yihaomen/123456登录.



而用管理员admin/123456 登录后



这样很方便的实现了不同角色的用户登录后,跳转到不同的页面.

转载地址:http://ju.outofmemory.cn/entry/58987

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值