SpringSecurity、Spring Social、SpringSession、TX-LCN、Spring Cloud Data Flow、JWT 架构(五)

今天继续SpringSecurity,今天我们来聊基于角色的权限用户登录,我们来看下面的这个思路图:

上面就是基于角色的权限控制图,接下来我们来实现他:

第一步:定义两个页面。一个是User可以访问的,一个是admin可以访问的。其中User普通用户可以访问的我们定义为userWelCome.jsp,管理员admin可访问的我们定义为:adminWelCome.jsp

第二步:创建处理用户登录成功以后访问的处理对象及实现:

package com.alibaba;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

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.GrantedAuthority;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;

/**
 * 用户登录成功以后进行处理
 *@description:
 *@author chendawei
 */
public class LoginDispatcherHandler extends SimpleUrlAuthenticationSuccessHandler{

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
    
    @Override
    protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        
        String targetUrl = determineTargetUrl(authentication);

        if (response.isCommitted()) {
            System.out.println("Can't redirect");
            return;
        }

        redirectStrategy.sendRedirect(request, response, targetUrl);

    }
    
    /**
     * 此方法提取当前已登录用户的角色并返回
     * 适当的URL根据他的角色。
     * @param authentication
     * @return
     */
    protected String determineTargetUrl(Authentication authentication) {
        String url = "";

        Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

        List<String> roles = new ArrayList<String>();

        for (GrantedAuthority a : authorities) {
            roles.add(a.getAuthority());
        }

        if (isAdmin(roles)) {
            url = "/SpringSecurityPageController/toAdminWelComePageJsp";
        } else if (isUser(roles)) {
            url = "/SpringSecurityPageController/toUserWelComePageJsp";
        } else {
            url = "/SpringSecurityPageController/gotoUserLoginPageJsp";
        }

        return url;
    }

    private boolean isUser(List<String> roles) {
        if (roles.contains("ROLE_USER")) {
            return true;
        }
        return false;
    }

    private boolean isAdmin(List<String> roles) {
        if (roles.contains("ROLE_ADMIN")) {
            return true;
        }
        return false;
    }

    public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
        this.redirectStrategy = redirectStrategy;
    }

    protected RedirectStrategy getRedirectStrategy() {
        return redirectStrategy;
    }
}
第三步:修改springsecurity.xml文件。其中在<http>标签里删除default-target-url和always-use-default-target属性,添加authentication-success-handler-ref属性。在<http>标签外添加<beans:bean id="loginDispatcherHandler" class="com.alibaba.LoginDispatcherHandler"></beans:bean>。然后添加每个角色可以访问的资源。

删除部分如下图:

添加部分如下图:

图一:

图二: 

图三:

上图中,具有ADMIN角色的用户可以访问以toAdmin开头的页面资源, 具有USER角色的用户可以访问以toUser开头的页面资源。

第四步:在user列表中定义用户和用户所拥有的角色:

 第五步:查看结果。我们用chendawei用户和zhaoxiuping两个用户访问登录界面,应该会跳转到不同的页面。

用chendawei用户访问:

访问的结果,注意观察地址栏里面的变化:

用zhaoxiuping用户访问:

访问的结果,注意观察地址栏里面的变化:

以上就是基于角色的权限用户登录。有个问题大家可以看到我们的用户的列表都定义在了springsecurity.xml中这样做很不好,不利于用户的动态添加和删除等扩展,比较好的办法就是将用户的这些信息等配置到数据库中,这样就可以动态的扩展了。下一篇我们来说一下这个实现的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值