从零开始搭建springboot项目(三)、整合shiro搭建权限验证框架

本次创建项目分成下面几个步骤介绍
(1)创建springboot项目;
(2)整合mybatis,搭建数据访问层框架
(3)整合shiro搭建权限验证框架;
(4)自动生成代码;
(5)整合logger搭建日志框架

上一篇我们介绍了如何整和mybatis,搭建数据访问层框架,这一篇我们介绍如何整合shiro,整合权限验证框架。

准备工作:
第一步:pom文件添加依赖,如下添加shiro的依赖包和junit的依赖包,junit的依赖包让我们方便测试;
<!-- shiro start -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.3.2</version>
		</dependency>
        <!-- shiro end -->

		<!--添加junit环境的jar包-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
第二步:数据库中创建相关表,下面贴出的sql脚本可直接复制到数据库中执行;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '主键',
  `username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
  `password_salt` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '盐值',
  `user_identify` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '标识',
  `realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '真实姓名',
  `user_status` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '状态',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_permision
-- ----------------------------
DROP TABLE IF EXISTS `sys_permision`;
CREATE TABLE `sys_permision` (
  `uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `permision_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限名称',
  `permision_parent_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '上层权限uid',
  `permision_type` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限类型',
  `permision_sort` int(10) DEFAULT NULL COMMENT '排序',
  `permision_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限url',
  `permision_related_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '关联权限路径',
  `permision_desc` text COLLATE utf8_unicode_ci COMMENT '描述',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
  `uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `role_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
  `role_desc` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色描述',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Table structure for sys_role_permision
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_permision`;
CREATE TABLE `sys_role_permision` (
  `uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `role_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色uid',
  `permision_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限uid',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
  `uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `user_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `role_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;

二、下面我们将配置shiro的相关属性:
第一步:新建ajax返回值的结果类AjaxResult.java;
package com.itwopqq.springboot.config;

import java.io.Serializable;

/**
 * @author fanzhen
 * @desx
 * @date 2020-04-03
 */
public class AjaxResult implements Serializable {

    /***
     * @desc success or error 返回结果状态值
     */
    private String status;

    /***
     * @desc 返回结果提示信息
     */
    private String msg;

    /***
     * @desc 结果数据
     */
    private Object data;

    /***
     * @desc 成功返回的数据
     */
    public static AjaxResult success(String msg, Object data){

        AjaxResult result = new AjaxResult();
        result.setStatus("success");
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /***
     * @desc 失败返回的数据
     */
    public static AjaxResult error(String msg){
        AjaxResult result = new AjaxResult();
        result.setStatus("error");
        result.setMsg(msg);
        return result;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "AjaxResult{" +
                "status='" + status + '\'' +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

第二步:新建shiro的验证过滤器,我们新建了perms的过滤器PermissionsAuthorizationExtendFilter.java,新建的过滤器需要继承PermissionsAuthorizationFilter.java类,重写PermissionsAuthorizationFilter.java的isAccessAllowed()方法和onAccessDenied()方法,其中isAccessAllowed()方法判断是否拦截,而onAccessDenied()方法表示当isAccessAllowed()返回false后(拦截)后,我们做的处理;
package com.itwopqq.springboot.config;

import com.itwopqq.springboot.system.util.WebUtils;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.thymeleaf.util.StringUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author fanzhen
 * @desx perm权限过滤器
 * @date 2020-04-01
 */
public class PermissionsAuthorizationExtendFilter extends PermissionsAuthorizationFilter {

    /***
     * @desc //判断是否拦截,false为拦截,true为允许
     * @author fanzhen
     * @date 2020-04-01 16:21
     * @param request, response, mappedValue
     * @return boolean
     */
    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        return super.isAccessAllowed(request, response, mappedValue);
    }

    /***
     * @desc  //上面的方法返回false后(被拦截),会进入这个方法;这个方法返回false表示处理完毕(不放行);返回true表示需要继续处理(放行)
     * @author fanzhen
     * @date 2020-04-01 16:21
     * @param request, response, mappedValue
     * @return boolean
     */
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        String requestURI = httpServletRequest.getRequestURI();
        System.out.println("Access Forbidden URI:"+ requestURI);
        Subject subject = this.getSubject(httpServletRequest, httpServletResponse);
        AjaxResult result;
        if(subject.getPrincipal() == null){
            if(WebUtils.isAjax(httpServletRequest)){
                //执行ajax请求返回的错误返回值
                result = AjaxResult.error("您尚未登录或登录时间过长,请重新登录!");
                WebUtils.writeJson(httpServletResponse, result.toString(), 401);
                return false;
            }else {
                this.saveRequestAndRedirectToLogin(httpServletRequest ,httpServletResponse);
            }
        }else if(WebUtils.isAjax(httpServletRequest)){
            //执行ajax请求返回的错误返回值
            result = AjaxResult.error("您没有足够的权限执行该操作!");
            WebUtils.writeJson(httpServletResponse, result.toString(), 401);
            return false;
        }else{
            String unauthorizedUrl = this.getUnauthorizedUrl();
            if(!StringUtils.isEmpty(unauthorizedUrl)){
                org.apache.shiro.web.util.WebUtils.issueRedirect(httpServletRequest, httpServletResponse, unauthorizedUrl);
            }else{
                org.apache.shiro.web.util.WebUtils.toHttp(response).sendError(401);
            }
        }
        return false;
    }
}
第三步:自定义realm文件,realm文件需要继承父类AuthorizingRealm.java,并重写其父类的两个方法,doGetAuthorizationInfo()和doGetAuthenticationInfo(),doGetAuthorizationInfo()方法功能为授权,doGetAuthenticationInfo()方法功能为认证,我们需要按照我们的逻辑重写我们的授权和认证功能;
package com.itwopqq.springboot.config;

import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ILoginService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @desc 自定义realm
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class BootingRealm extends AuthorizingRealm {


    /***
     * 正常流程:先认证,在授权
     */
    @Autowired
    private ILoginService loginService;
    /****
     * 授权
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        String username = (String)principals.getPrimaryPrincipal();
        SysUserDto sysUserDto = loginService.selectByUsername(username);
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        Set<String> perms = new HashSet<>();
        List<SysRoleDto> roles = sysUserDto.getRoles();
        for(SysRoleDto sysRoleDto: roles){
            simpleAuthorizationInfo.addRole(sysRoleDto.getRoleName());
            List<SysPermision> sysPermisions = sysRoleDto.getPerms();
            for(SysPermision sysPermision: sysPermisions){
                perms.add(sysPermision.getPermisionUrl());
            }
        }
        simpleAuthorizationInfo.setStringPermissions(perms);
        return simpleAuthorizationInfo;
    }

    /****
     * 认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        if(token.getPrincipal() == null){
            return null;
        }
        String username = token.getPrincipal().toString();
        SysUserDto sysUser = loginService.selectByUsername(username);
        if(sysUser == null){
            return null;
        }

        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(sysUser.getUsername(), sysUser.getPassword(), sysUser.getRealname());
        simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes(sysUser.getPasswordSalt()));
        return simpleAuthenticationInfo;
    }
}

第四步:新建ShiroConfig.java类,ShiroConfig是我们的shiro配置类,会配置我们的认证realm和拦截路径已经加密方法、session管理等属性,下面贴出代码一一介绍:

package com.itwopqq.springboot.config;

import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ISysPermisionService;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.util.StringUtils;

import javax.servlet.Filter;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Configuration
public class ShiroConfig {

    private static final String DEFAULT_PREMISSION_STRING = "perms[{0}]";

    /***
     * 自定义realm:重写了验证和授权方法
     */
    @Bean("bootingRealm")
    public BootingRealm myShiroRealm(){

        BootingRealm bootingRealm = new BootingRealm();
        bootingRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return bootingRealm;
    }

    /***
     * 凭证匹配器
     * setHashIterations(2);//hash的次数 比如这里的2就代表这 md5(md5(""))
     */
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher(){

        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashIterations(2);
        hashedCredentialsMatcher.setHashAlgorithmName("md5");
        return hashedCredentialsMatcher;
    }

    /***
     * @desc shiro生命周期处理器
     * @author fanzhen
     * @date 2020-04-01 14:39
     * @param
     * @return org.apache.shiro.spring.LifecycleBeanPostProcessor
     */
    @Bean("lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor getlifecycleBeanPostProcessor(){
        return new LifecycleBeanPostProcessor();
    }

    /***
     * 权限管理,配置realm的权限认证
     */
    @Bean("securityManager")
    public SecurityManager getSecurityManager(DefaultWebSessionManager sessionManager){

        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(myShiroRealm());

        //设置session管理器
        defaultWebSecurityManager.setSessionManager(sessionManager);
        return defaultWebSecurityManager;
    }

    /***
     * Filter工厂,设置对应的过滤条件和跳转条件
     * 这里相当于springmvc里面web.xml的配置
     */
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ISysPermisionService sysPermisionService){

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setLoginUrl("/system/sysUser/login");
        shiroFilterFactoryBean.setSuccessUrl("/system/sysUser/admin");
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");
        loadShiroFilterChain(shiroFilterFactoryBean, sysPermisionService);
        /**设置自定义拦截器,当访问某些自定义url时,使用这个filter进行验证**/
        /**如果map里面key值为authc,表示所有名为authc的过滤条件使用这个自定义的filter
        map里面key值为perms,表示所有名为perms的过滤条件使用这个自定义的filter,具体见下方**/
        Map<String, Filter> filter = new HashMap<>();
        filter.put("perms", new PermissionsAuthorizationExtendFilter());
        shiroFilterFactoryBean.setFilters(filter);
        return shiroFilterFactoryBean;
    }

    /***
     * @desc 为某个实例的某个方法的返回值注入为bean的实例
     * Spring静态注入
     */
    @Bean
    public MethodInvokingFactoryBean getMethodInvokingFactoryBean(DefaultWebSessionManager sessionManager) {
        MethodInvokingFactoryBean methodInvokingFactoryBean=new MethodInvokingFactoryBean();
        methodInvokingFactoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
        methodInvokingFactoryBean.setArguments(getSecurityManager(sessionManager));
        return methodInvokingFactoryBean;
    }

    /***
     * @desc 加载shiro权限控制规则(从数据库表中读取)
     */
    public void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean,ISysPermisionService sysPermisionService) {
        System.out.println("===========================================");
        System.out.println(sysPermisionService);
        System.out.println("===========================================");
        List<SysPermision> sysPermisions = sysPermisionService.selectAll();
        Map<String, String> map = new HashMap<>();
//        map.put("/**", "anno");
        for(SysPermision sysPermision: sysPermisions){

            String url = sysPermision.getPermisionUrl();
            String relatedUrl = sysPermision.getPermisionRelatedUrl();
            if(!StringUtils.isEmpty(url)){
                map.put(url,  MessageFormat.format(DEFAULT_PREMISSION_STRING, url));
            }
            if(!StringUtils.isEmpty(relatedUrl)){
                String[] relatedUrls = relatedUrl.split(";");
                for(String  relatedurl: relatedUrls){
                    map.put(relatedurl, MessageFormat.format(DEFAULT_PREMISSION_STRING, relatedurl));
                }
            }
        }

        System.out.println("======================load shiro filter chain start==========================");
        Set<String> keys = map.keySet();
        for(String key: keys){
            System.out.println("==================  url:" + key + "," + map.get(key));
        }
        System.out.println("======================load shiro filter chain end==========================");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    }

    /***
     * @desc 开启shiro aop直接支持 使用代理方式
     */
    @Bean("authorizationAttributeSourceAdvisor")
    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(SecurityManager securityManager){

        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }

    @Bean("defaultAdvisorAutoProxyCreator")
    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
        return defaultAdvisorAutoProxyCreator;
    }

    /***
     * @desc 会话ID生成器
     */
    @Bean(name = "sessionIdGenerator")
    public JavaUuidSessionIdGenerator javaUuidSessionIdGenerator(){
        JavaUuidSessionIdGenerator uuid = new JavaUuidSessionIdGenerator();
        return uuid;
    }

    @Bean(name = "sessionIdCookie")
    public SimpleCookie getSessionIdCookie(){
        SimpleCookie simpleCookie = new SimpleCookie("sid");
        simpleCookie.setHttpOnly(true);
        simpleCookie.setMaxAge(-1);
        return simpleCookie;
    }

    /***
     * @desc 会话DAO
     */
    @Bean(name = "sessionDAO")
    public EnterpriseCacheSessionDAO  enterpriseCacheSessionDAO(){
        EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO();
        sessionDAO.setSessionIdGenerator(javaUuidSessionIdGenerator());
        sessionDAO.setActiveSessionsCacheName("shiro_session_cache");
        return sessionDAO;
    }

    @Bean(name = "sessionValidationScheduler")
    public ExecutorServiceSessionValidationScheduler executorServiceSessionValidationScheduler(){
        ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler();
        scheduler.setInterval(3*60*1000);
        return scheduler;
    }

    @Bean(name = "sessionManager")
    public DefaultWebSessionManager sessionManager(EnterpriseCacheSessionDAO enterpriseCacheSessionDAO){

        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setGlobalSessionTimeout(30*10*60*1000);
        sessionManager.setDeleteInvalidSessions(true);
        sessionManager.setSessionValidationSchedulerEnabled(true);
        sessionManager.setSessionValidationScheduler(executorServiceSessionValidationScheduler());
        sessionManager.setSessionDAO(enterpriseCacheSessionDAO);
        sessionManager.setSessionIdCookieEnabled(true);
        sessionManager.setSessionIdCookie(getSessionIdCookie());
        return sessionManager;
    }

}
第五步:编写代码查询数据库信息;

model包:
a)、SysUser.java

package com.itwopqq.springboot.system.model;

import java.io.Serializable;
import java.util.Date;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysUser implements Serializable {

    private String uid;

    /***
     * 用户名
     */
    private String username;

    /***
     * 密码
     */
    private String password;

    /***
     * 盐值
     */
    private String passwordSalt;

    /***
     * 标识位
     */
    private String userIdentify;

    /***
     * 真实姓名
     */
    private String realname;

    /***
     * 创建时间
     */
    private Date createTime;

    /***
     * 用户状态
     */
    private String userStatus;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPasswordSalt() {
        return passwordSalt;
    }

    public void setPasswordSalt(String passwordSalt) {
        this.passwordSalt = passwordSalt;
    }

    public String getUserIdentify() {
        return userIdentify;
    }

    public void setUserIdentify(String userIdentify) {
        this.userIdentify = userIdentify;
    }

    public String getRealname() {
        return realname;
    }

    public void setRealname(String realname) {
        this.realname = realname;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(String userStatus) {
        this.userStatus = userStatus;
    }
}

b)、SysPermision.java

package com.itwopqq.springboot.system.model;

import java.io.Serializable;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysPermision implements Serializable {

    private String uid;

    /***
     * 权限名称
     */
    private String permisionName;

    /***
     * 上级权限名称
     */
    private String permisionParentUid;

    /***
     * 权限类型
     */
    private String permisionType;

    /***
     * 权限排序
     */
    private Integer permisionSort;

    /***
     * 权限路径
     */
    private String permisionUrl;

    /***
     * 权限关联路径
     */
    private String permisionRelatedUrl;

    /***
     * 权限描述
     */
    private String permisionDesc;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getPermisionName() {
        return permisionName;
    }

    public void setPermisionName(String permisionName) {
        this.permisionName = permisionName;
    }

    public String getPermisionParentUid() {
        return permisionParentUid;
    }

    public void setPermisionParentUid(String permisionParentUid) {
        this.permisionParentUid = permisionParentUid;
    }

    public String getPermisionType() {
        return permisionType;
    }

    public void setPermisionType(String permisionType) {
        this.permisionType = permisionType;
    }

    public Integer getPermisionSort() {
        return permisionSort;
    }

    public void setPermisionSort(Integer permisionSort) {
        this.permisionSort = permisionSort;
    }

    public String getPermisionUrl() {
        return permisionUrl;
    }

    public void setPermisionUrl(String permisionUrl) {
        this.permisionUrl = permisionUrl;
    }

    public String getPermisionRelatedUrl() {
        return permisionRelatedUrl;
    }

    public void setPermisionRelatedUrl(String permisionRelatedUrl) {
        this.permisionRelatedUrl = permisionRelatedUrl;
    }

    public String getPermisionDesc() {
        return permisionDesc;
    }

    public void setPermisionDesc(String permisionDesc) {
        this.permisionDesc = permisionDesc;
    }
}

c)、SysRole.java

package com.itwopqq.springboot.system.model;

import java.io.Serializable;
import java.util.Date;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysRole implements Serializable {

    /****
     * 角色uid
     */
    private String uid;

    /****
     * 角色名称
     */
    private String roleName;

    /****
     * 角色描述
     */
    private String roleDesc;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }
}

d)、SysPermision.java

package com.itwopqq.springboot.system.model;

import java.io.Serializable;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysPermision implements Serializable {

    private String uid;

    /***
     * 权限名称
     */
    private String permisionName;

    /***
     * 上级权限名称
     */
    private String permisionParentUid;

    /***
     * 权限类型
     */
    private String permisionType;

    /***
     * 权限排序
     */
    private Integer permisionSort;

    /***
     * 权限路径
     */
    private String permisionUrl;

    /***
     * 权限关联路径
     */
    private String permisionRelatedUrl;

    /***
     * 权限描述
     */
    private String permisionDesc;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getPermisionName() {
        return permisionName;
    }

    public void setPermisionName(String permisionName) {
        this.permisionName = permisionName;
    }

    public String getPermisionParentUid() {
        return permisionParentUid;
    }

    public void setPermisionParentUid(String permisionParentUid) {
        this.permisionParentUid = permisionParentUid;
    }

    public String getPermisionType() {
        return permisionType;
    }

    public void setPermisionType(String permisionType) {
        this.permisionType = permisionType;
    }

    public Integer getPermisionSort() {
        return permisionSort;
    }

    public void setPermisionSort(Integer permisionSort) {
        this.permisionSort = permisionSort;
    }

    public String getPermisionUrl() {
        return permisionUrl;
    }

    public void setPermisionUrl(String permisionUrl) {
        this.permisionUrl = permisionUrl;
    }

    public String getPermisionRelatedUrl() {
        return permisionRelatedUrl;
    }

    public void setPermisionRelatedUrl(String permisionRelatedUrl) {
        this.permisionRelatedUrl = permisionRelatedUrl;
    }

    public String getPermisionDesc() {
        return permisionDesc;
    }

    public void setPermisionDesc(String permisionDesc) {
        this.permisionDesc = permisionDesc;
    }
}

e)、SysRolePermision.java

package com.itwopqq.springboot.system.model;

import java.io.Serializable;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysRolePermision implements Serializable {

    private String uid;

    /***
     * 角色uid
     */
    private String roleUid;

    /***
     * 权限uid
     */
    private String permisionUid;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getRoleUid() {
        return roleUid;
    }

    public void setRoleUid(String roleUid) {
        this.roleUid = roleUid;
    }

    public String getPermisionUid() {
        return permisionUid;
    }

    public void setPermisionUid(String permisionUid) {
        this.permisionUid = permisionUid;
    }
}

dto 包
f)、SysRoleDto.java

package com.itwopqq.springboot.system.dto;

import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.model.SysRole;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysRoleDto extends SysRole {

    private List<SysPermision> perms;

    public List<SysPermision> getPerms() {
        return perms;
    }

    public void setPerms(List<SysPermision> perms) {
        this.perms = perms;
    }
}

g)、SysUserDto.java

package com.itwopqq.springboot.system.dto;

import com.itwopqq.springboot.system.model.SysUser;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
public class SysUserDto extends SysUser {

    private List<SysRoleDto> roles;

    public List<SysRoleDto> getRoles() {
        return roles;
    }

    public void setRoles(List<SysRoleDto> roles) {
        this.roles = roles;
    }
}

mapper包
h)、SysUserMapper.java

package com.itwopqq.springboot.system.mapper;

import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysUser;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Repository
public interface SysUserMapper {

    /***
     * @desc 获取所有用户
     * @author fanzhen
     * @date 2020-03-29 16:04
     * @return SysUser
     */
    List<SysUser> selectAll();

    SysUserDto selectByUsername(@Param(value = "username") String username);

    int insertOneModel(SysUserDto sysUserDto);
}

i)、SysPermisionMapper.java

package com.itwopqq.springboot.system.mapper;

import com.itwopqq.springboot.system.model.SysPermision;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Repository
public interface SysPermisionMapper {

    List<SysPermision> selectByRoleId(@Param(value = "roleId") String roleId);

    List<SysPermision> selectAll();

    int insertOneModel(SysPermision sysPermision);
}

j)、SysRoleMapper.java

package com.itwopqq.springboot.system.mapper;

import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.model.SysRole;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Repository
public interface SysRoleMapper {

    List<SysRoleDto> selectRolesByUserId(@Param(value = "userId") String userId);

    int insertOneModel(SysRole sysRole);
}

k)、SysUserRoleMapper.java

package com.itwopqq.springboot.system.mapper;

import com.itwopqq.springboot.system.dto.SysUserDto;
import org.springframework.stereotype.Repository;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Repository
public interface SysUserRoleMapper {

    int insertBatch(SysUserDto sysUserDto);
}

l)、SysRolePermisionMapper.java

package com.itwopqq.springboot.system.mapper;

import com.itwopqq.springboot.system.dto.SysRoleDto;
import org.springframework.stereotype.Repository;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Repository
public interface SysRolePermisionMapper {

    int insertBatch(SysRoleDto sysRoleDto);
}

mapping包
m)、SysUserMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwopqq.springboot.system.mapper.SysUserMapper">

    <resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUser">
        <result column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="password_salt" jdbcType="VARCHAR" property="passwordSalt" />
        <result column="user_identify" jdbcType="VARCHAR" property="userIdentify" />
        <result column="realname" jdbcType="VARCHAR" property="realname" />
        <result column="user_status" jdbcType="VARCHAR" property="userStatus" />
        <result column="create_time" jdbcType="VARCHAR" property="createTime" />
    </resultMap>

    <resultMap id="DtoBaseResultMap" type="com.itwopqq.springboot.system.dto.SysUserDto" extends="BaseResultMap">

    </resultMap>

    <select id="selectAll" resultMap="BaseResultMap">
        SELECT uid, username, password, password_salt, user_identify, realname, user_status, create_time
        FROM sys_user
    </select>

    <select id="selectByUsername" parameterType="java.lang.String" resultMap="DtoBaseResultMap">
        SELECT uid, username, password, password_salt, user_identify, realname, user_status, create_time
        FROM sys_user
        WHERE username = #{username}
        LIMIT 1
    </select>

    <insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
        INSERT INTO sys_user(uid, username, password, password_salt, user_identify, realname, user_status, create_time)
        VALUES
        (#{uid}, #{username}, #{password}, #{passwordSalt}, #{userIdentify}, #{realname}, #{userStatus}, #{createTime});
    </insert>
</mapper>

n)、SysPermisionMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwopqq.springboot.system.mapper.SysPermisionMapper">

    <resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysPermision">
        <result column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="permision_name" jdbcType="VARCHAR" property="permisionName" />
        <result column="permision_parent_uid" jdbcType="VARCHAR" property="permisionParentUid" />
        <result column="permision_type" jdbcType="VARCHAR" property="permisionType" />
        <result column="permision_sort" jdbcType="INTEGER" property="permisionSort" />
        <result column="permision_url" jdbcType="VARCHAR" property="permisionUrl" />
        <result column="permision_related_url" jdbcType="VARCHAR" property="permisionRelatedUrl" />
        <result column="permision_desc" jdbcType="VARCHAR" property="permisionDesc" />
    </resultMap>

    <select id="selectByRoleId" parameterType="java.lang.String" resultMap="BaseResultMap">
        SELECT B.uid, B.permision_name, B.permision_parent_uid, B.permision_type, B.permision_sort, B.permision_url, B.permision_related_url, B.permision_desc
        FROM sys_role_permision A LEFT JOIN sys_permision B
        ON A.permision_uid = B.uid
        WHERE A.role_uid = #{roleId}
    </select>

    <select id="selectAll" resultMap="BaseResultMap">
        select uid, permision_name, permision_parent_uid, permision_type, permision_sort, permision_url, permision_related_url, permision_desc
        FROM sys_permision
    </select>

    <insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.model.SysPermision">
        INSERT INTO sys_permision(uid, permision_name, permision_parent_uid, permision_type, permision_sort, permision_url, permision_related_url, permision_desc)
        VALUES(#{uid}, #{permisionName}, #{permisionParentUid}, #{permisionType}, #{permisionSort}, #{permisionUrl}, #{permisionRelatedUrl}, #{permisionDesc})
    </insert>
</mapper>

o)、SysRoleMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwopqq.springboot.system.mapper.SysRoleMapper">

    <resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysRole">
        <result column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="role_name" jdbcType="VARCHAR" property="roleName" />
        <result column="role_desc" jdbcType="VARCHAR" property="roleDesc" />
    </resultMap>
    
    <resultMap id="DtoBaseResultMap" type="com.itwopqq.springboot.system.dto.SysRoleDto" extends="BaseResultMap">

    </resultMap>

    <select id="selectRolesByUserId" parameterType="java.lang.String" resultMap="DtoBaseResultMap">
        SELECT B.uid,  B.role_name,  B.role_desc FROM sys_user_role A LEFT JOIN sys_role B ON A.role_uid = B.uid
        WHERE A.user_uid = #{userId}
    </select>

    <insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.model.SysRole">
        INSERT INTO sys_role(uid, role_name, role_desc)
        VALUES (#{uid}, #{roleName}, #{roleDesc})
    </insert>
</mapper>

p)、SysUserRoleMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwopqq.springboot.system.mapper.SysUserRoleMapper">

    <resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUserRole">
        <result column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="user_uid" jdbcType="VARCHAR" property="userUid" />
        <result column="role_uid" jdbcType="VARCHAR" property="roleUid" />
    </resultMap>

    <insert id="insertBatch" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
        INSERT INTO sys_user_role(uid, user_uid, role_uid) VALUES
        <foreach collection="roles" item="item" separator=",">
            (REPLACE(uuid(),'-',''), #{uid}, #{item.uid})
        </foreach>
    </insert>
</mapper>

q)、SysRolePermisionMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwopqq.springboot.system.mapper.SysUserRoleMapper">

    <resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUserRole">
        <result column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="user_uid" jdbcType="VARCHAR" property="userUid" />
        <result column="role_uid" jdbcType="VARCHAR" property="roleUid" />
    </resultMap>

    <insert id="insertBatch" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
        INSERT INTO sys_user_role(uid, user_uid, role_uid) VALUES
        <foreach collection="roles" item="item" separator=",">
            (REPLACE(uuid(),'-',''), #{uid}, #{item.uid})
        </foreach>
    </insert>
</mapper>

service包
r)、ILoginService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.dto.SysUserDto;

public interface ILoginService {


    /***
     * @desc 通过用户名称查询一条数据
     * @author fanzhen
     * @date 2020-03-29 21:46
     * @return com.itwopqq.springboot.system.model.SysUser
     */
    SysUserDto selectByUsername(String username);
}

s)、ISysPermisionService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.model.SysPermision;

import java.util.List;

public interface ISysPermisionService {

    /***
     * @desc 查询所有的有效的权限数据
     * @author fanzhen
     * @date 2020-03-30 20:33
     * @return java.util.List<com.itwopqq.springboot.system.model.SysPermision>
     */
    List<SysPermision> selectAll();

    /***
     * @desc 插入一条权限数据
     * @author fanzhen
     * @date 2020-03-30 20:33
     * @return java.util.List<com.itwopqq.springboot.system.model.SysPermision>
     */
    int insertOneModel(SysPermision sysPermision);
}

t)、ISysRolePermisionService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.dto.SysRoleDto;

public interface ISysRolePermisionService {

    int insertBatch(SysRoleDto sysRoleDto);
}

u)、ISysRoleService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.model.SysRole;

public interface ISysRoleService {

    int insertOneModel(SysRole sysRole);

}

v)、ISysUserRoleService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.dto.SysUserDto;

public interface ISysUserRoleService {

    int insertBatch(SysUserDto sysUserDto);
}

w)、ISysUserService.java

package com.itwopqq.springboot.system.service;

import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysUser;

import java.util.List;

public interface ISysUserService {

    List<SysUser> selectAll();

    int insertOneModel(SysUserDto sysUserDto);
}

serviceimpl包
x)、LoginServiceimpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysPermisionMapper;
import com.itwopqq.springboot.system.mapper.SysRoleMapper;
import com.itwopqq.springboot.system.mapper.SysUserMapper;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ILoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class LoginServiceimpl implements ILoginService {

    @Autowired
    SysUserMapper sysUserMapper;

    @Autowired
    SysRoleMapper sysRoleMapper;

    @Autowired
    SysPermisionMapper sysPermisionMapper;
    @Override
    public SysUserDto selectByUsername(String username) {

        SysUserDto sysUserDto = sysUserMapper.selectByUsername(username);
        if(sysUserDto == null){
            return null;
        }
        List<SysRoleDto> sysRoleDtos = sysRoleMapper.selectRolesByUserId(sysUserDto.getUid());
        for(SysRoleDto sysRoleDto:sysRoleDtos){
            List<SysPermision> sysPermisions = sysPermisionMapper.selectByRoleId(sysRoleDto.getUid());
            sysRoleDto.setPerms(sysPermisions);
        }
        sysUserDto.setRoles(sysRoleDtos);
        return sysUserDto;
    }
}

y)、SysPermisionServiceImpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.mapper.SysPermisionMapper;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ISysPermisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class SysPermisionServiceImpl implements ISysPermisionService {

    @Autowired
    SysPermisionMapper sysPermisionMapper;

    @Override
    public List<SysPermision> selectAll() {
        return sysPermisionMapper.selectAll();
    }

    @Override
    public int insertOneModel(SysPermision sysPermision) {
        return sysPermisionMapper.insertOneModel(sysPermision);
    }
}

z)、SysRolePermisionServiceImpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.mapper.SysRolePermisionMapper;
import com.itwopqq.springboot.system.service.ISysRolePermisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class SysRolePermisionServiceImpl implements ISysRolePermisionService {

    @Autowired
    SysRolePermisionMapper sysRolePermisionMapper;
    @Override
    public int insertBatch(SysRoleDto sysRoleDto) {
        if(sysRoleDto == null || sysRoleDto.getPerms() == null ||sysRoleDto.getPerms().size()==0){
            return 0;
        }
        return sysRolePermisionMapper.insertBatch(sysRoleDto);
    }
}

aa)、SysRoleServiceImpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.mapper.SysRoleMapper;
import com.itwopqq.springboot.system.model.SysRole;
import com.itwopqq.springboot.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService {


    @Autowired
    SysRoleMapper sysRoleMapper;

    @Override
    public int insertOneModel(SysRole sysRole) {
        return sysRoleMapper.insertOneModel(sysRole);
    }
}

bb)、SysUserRoleServiceImpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysUserRoleMapper;
import com.itwopqq.springboot.system.model.SysUserRole;
import com.itwopqq.springboot.system.service.ISysUserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class SysUserRoleServiceImpl implements ISysUserRoleService {

    @Autowired
    SysUserRoleMapper sysUserRoleMapper;

    @Override
    public int insertBatch(SysUserDto sysUserDto){
        return sysUserRoleMapper.insertBatch(sysUserDto);
    }
}

cc)、SysUserServiceImpl.java

package com.itwopqq.springboot.system.serviceimpl;

import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysUserMapper;
import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ISysUserService;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@Service
public class SysUserServiceImpl implements ISysUserService {

    @Autowired
    public SysUserMapper sysUserMapper;
    @Override
    public List<SysUser> selectAll() {
        return sysUserMapper.selectAll();
    }

    @Override
    public int insertOneModel(SysUserDto sysUserDto) {

        String salt = new SecureRandomNumberGenerator().nextBytes().toHex();
        sysUserDto.setPasswordSalt(salt);
        SimpleHash simpleHash = new SimpleHash("md5", sysUserDto.getPassword(), salt, 2);
        sysUserDto.setPassword(simpleHash.toHex());
        return sysUserMapper.insertOneModel(sysUserDto);
    }
}

controller包:
dd)、LoginController.java

package com.itwopqq.springboot.system.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-31
 */
@RequestMapping("/system/sysUser")
@Controller
public class LoginController {

    @GetMapping("/loginss")
    @ResponseBody
    public String login(String username, String password){
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return "success";
    }

    @GetMapping("/openstank")
    @ResponseBody
    public String openstank(){
        System.out.println("1111");
        System.out.println("2222");
        return "success";
    }

    @GetMapping("/openstank2")
    @ResponseBody
    public String openstanks(){
        System.out.println("1111");
        System.out.println("2222");
        return "success";
    }

    @RequestMapping("/login")
    public ModelAndView login(){

        ModelAndView mav = new ModelAndView("login");
        return mav;
    }

    @RequestMapping("/admin")
    public ModelAndView admin(){

        ModelAndView mav = new ModelAndView("admin");
        return mav;
    }
}

ee)、SysUserController.java

package com.itwopqq.springboot.system.controller;

import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ISysUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-29
 */
@RestController
@RequestMapping("/system/sysUser")
public class SysUserController {

    @Autowired
    public ISysUserService sysUserService;

    @GetMapping("/selectAll")
    public List<SysUser> selectAll(){

        List<SysUser> sysUsers = sysUserService.selectAll();
        return sysUsers;
    }
}

PageController.java

package com.itwopqq.booting;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.Map;

/**
 * @author fanzhen
 * @desx
 * @date 2020-03-23
 */
@RequestMapping("/page")
@Controller
public class PageController {

    @RequestMapping("/userinfo")
    public ModelAndView userinfo(String name, String age) throws Exception{

        Map<String, Object> user = new HashMap<>();
        user.put("name", name);
        user.put("age", age);
        ModelAndView mav = new ModelAndView("userinfo");
        mav.addObject("user", user);
        return mav;
    }
}

页面:
login.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>userinfo</title>
</head>
<body>
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
</body>
</html>

userinfo.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:java="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>userinfo</title>
    <input type="button" value="测试ajax请求" id="test_ajax" />
</head>
<body>
<b>用户名:<b th:text="${user.name}"></b></b>
<b>年龄:<b th:text="${user.age}"></b></b>
</body>
<script src="/js/jquery-1.12.3.min.js"></script>
<script>
    $(function () {
        $.ajax({
            url: '/system/sysUser/openstank2',
            success: function (json) {
                console.log(json);
            },
            error: function (json) {
                console.log(json);
                console.log(json.responseText);
            }
        })
    })
</script>
</html>

welcome.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
    <b>hello, world!</b>
</body>
</html>

上面代码列出完毕,整体的包结构图如下:
在这里插入图片描述

在这里插入图片描述

接下来我们来校验我们的shiro搭建的情况:
首先我们通过junit来插入相关测试数据:
插入4条权限数据:
‘/system/sysUser/openstank’;
‘/system/sysUser/openWatch’;
‘/system/sysUser/openstank2’;
‘/system/sysUser/openWatch2’;
插入两条角色数据:
‘管理员’;
‘查询员’;
插入两条用户数据:
‘admin’;
‘fanzhen’;

SpringbootApplicationTests.java

package com.itwopqq.booting;

import com.itwopqq.booting.system.dto.SysRoleDto;
import com.itwopqq.booting.system.dto.SysUserDto;
import com.itwopqq.booting.system.model.SysPermision;
import com.itwopqq.booting.system.service.*;
import com.itwopqq.booting.system.util.UUIDUtil;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
class bootingApplicationTests {

    @Autowired
    public ISysUserService sysUserService;

    @Autowired
    private ISysRoleService sysRoleService;

    @Autowired
    private ISysUserRoleService sysUserRoleService;

    @Autowired
    private ISysPermisionService sysPermisionService;

    @Autowired
    private ISysRolePermisionService sysRolePermisionService;

    @Test
    void contextLoads() {
        System.out.println("=============junit test start===============");
        SysPermision sysPermision = new SysPermision();
        sysPermision.setUid(UUIDUtil.getUUID());
        sysPermision.setPermisionUrl("/system/sysUser/openstank");
        sysPermision.setPermisionName("stank管理");
        sysPermision.setPermisionType("1");
        sysPermision.setPermisionSort(1);

        SysPermision sysPermision1 = new SysPermision();
        sysPermision1.setUid(UUIDUtil.getUUID());
        sysPermision1.setPermisionUrl("/system/sysUser/openWatch");
        sysPermision1.setPermisionName("watch管理");
        sysPermision1.setPermisionType("1");
        sysPermision1.setPermisionSort(2);

        sysPermisionService.insertOneModel(sysPermision);
        sysPermisionService.insertOneModel(sysPermision1);

        List<SysPermision> sysPermisionList = new ArrayList<>();
        sysPermisionList.add(sysPermision);
        sysPermisionList.add(sysPermision1);

        SysRoleDto sysRoleDto = new SysRoleDto();
        sysRoleDto.setUid(UUIDUtil.getUUID());
        sysRoleDto.setRoleName("管理员");
        sysRoleDto.setRoleDesc("管理员角色");
        sysRoleDto.setPerms(sysPermisionList);

        sysRoleService.insertOneModel(sysRoleDto);
        sysRolePermisionService.insertBatch(sysRoleDto);

        List<SysRoleDto> sysRoleDtoList = new ArrayList<>();
        sysRoleDtoList.add(sysRoleDto);

        SysUserDto sysUserDto = new SysUserDto();
        sysUserDto.setUid(UUIDUtil.getUUID());
        sysUserDto.setUsername("admin");
        sysUserDto.setPassword("123456");
        sysUserDto.setRealname("管理员");
        sysUserDto.setCreateTime(new Date());
        sysUserDto.setUserIdentify("1");
        sysUserDto.setUserStatus("1");
        sysUserDto.setRoles(sysRoleDtoList);

        sysUserService.insertOneModel(sysUserDto);
        sysUserRoleService.insertBatch(sysUserDto);
        System.out.println("=============junit test end===============");
    }

    @Test
    public void test2(){

        System.out.println("=============junit test start===============");
        SysPermision sysPermision = new SysPermision();
        sysPermision.setUid(UUIDUtil.getUUID());
        sysPermision.setPermisionUrl("/system/sysUser/openstank2");
        sysPermision.setPermisionName("stank查询");
        sysPermision.setPermisionType("1");
        sysPermision.setPermisionSort(1);

        SysPermision sysPermision1 = new SysPermision();
        sysPermision1.setUid(UUIDUtil.getUUID());
        sysPermision1.setPermisionUrl("/system/sysUser/openWatch2");
        sysPermision1.setPermisionName("watch查询");
        sysPermision1.setPermisionType("1");
        sysPermision1.setPermisionSort(2);

        sysPermisionService.insertOneModel(sysPermision);
        sysPermisionService.insertOneModel(sysPermision1);

        List<SysPermision> sysPermisionList = new ArrayList<>();
        sysPermisionList.add(sysPermision);
        sysPermisionList.add(sysPermision1);

        SysRoleDto sysRoleDto = new SysRoleDto();
        sysRoleDto.setUid(UUIDUtil.getUUID());
        sysRoleDto.setRoleName("查询员");
        sysRoleDto.setRoleDesc("查询员角色");
        sysRoleDto.setPerms(sysPermisionList);

        sysRoleService.insertOneModel(sysRoleDto);
        sysRolePermisionService.insertBatch(sysRoleDto);

        List<SysRoleDto> sysRoleDtoList = new ArrayList<>();
        sysRoleDtoList.add(sysRoleDto);

        SysUserDto sysUserDto = new SysUserDto();
        sysUserDto.setUid(UUIDUtil.getUUID());
        sysUserDto.setUsername("fanzhen");
        sysUserDto.setPassword("123456");
        sysUserDto.setRealname("查询员");
        sysUserDto.setCreateTime(new Date());
        sysUserDto.setUserIdentify("1");
        sysUserDto.setUserStatus("1");
        sysUserDto.setRoles(sysRoleDtoList);

        sysUserService.insertOneModel(sysUserDto);
        sysUserRoleService.insertBatch(sysUserDto);
        System.out.println("=============junit test end===============");
    }
}

启动程序:

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:62251,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Users/fanzhen/Library/Caches/IntelliJIdea2019.1/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Users/fanzhen/Documents/ideaworkspaces/booting/target/classes:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-web/2.2.6.RELEASE/spring-boot-starter-web-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter/2.2.6.RELEASE/spring-boot-starter-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot/2.2.6.RELEASE/spring-boot-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-autoconfigure/2.2.6.RELEASE/spring-boot-autoconfigure-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-logging/2.2.6.RELEASE/spring-boot-starter-logging-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/fanzhen/Documents/local-repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/fanzhen/Documents/local-repository/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar:/Users/fanzhen/Documents/local-repository/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar:/Users/fanzhen/Documents/local-repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/fanzhen/Documents/local-repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/fanzhen/Documents/local-repository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-json/2.2.6.RELEASE/spring-boot-starter-json-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-databind/2.10.3/jackson-databind-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-core/2.10.3/jackson-core-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.3/jackson-datatype-jdk8-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.3/jackson-datatype-jsr310-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.3/jackson-module-parameter-names-2.10.3.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-tomcat/2.2.6.RELEASE/spring-boot-starter-tomcat-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.33/tomcat-embed-core-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-el/9.0.33/tomcat-embed-el-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.33/tomcat-embed-websocket-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-validation/2.2.6.RELEASE/spring-boot-starter-validation-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar:/Users/fanzhen/Documents/local-repository/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final.jar:/Users/fanzhen/Documents/local-repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-web/5.2.5.RELEASE/spring-web-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-beans/5.2.5.RELEASE/spring-beans-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-webmvc/5.2.5.RELEASE/spring-webmvc-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-aop/5.2.5.RELEASE/spring-aop-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-context/5.2.5.RELEASE/spring-context-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-expression/5.2.5.RELEASE/spring-expression-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.3.3/mybatis-spring-boot-starter-1.3.3.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-jdbc/2.2.6.RELEASE/spring-boot-starter-jdbc-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/zaxxer/HikariCP/3.4.2/HikariCP-3.4.2.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-jdbc/5.2.5.RELEASE/spring-jdbc-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-tx/5.2.5.RELEASE/spring-tx-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.3.3/mybatis-spring-boot-autoconfigure-1.3.3.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/mybatis/3.4.6/mybatis-3.4.6.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/mybatis-spring/1.3.2/mybatis-spring-1.3.2.jar:/Users/fanzhen/Documents/local-repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-test/2.2.6.RELEASE/spring-boot-starter-test-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-test/2.2.6.RELEASE/spring-boot-test-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-test-autoconfigure/2.2.6.RELEASE/spring-boot-test-autoconfigure-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/Users/fanzhen/Documents/local-repository/net/minidev/json-smart/2.3/json-smart-2.3.jar:/Users/fanzhen/Documents/local-repository/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/Users/fanzhen/Documents/local-repository/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/Users/fanzhen/Documents/local-repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar:/Users/fanzhen/Documents/local-repository/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter/5.5.2/junit-jupiter-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-api/5.5.2/junit-jupiter-api-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/fanzhen/Documents/local-repository/org/junit/platform/junit-platform-commons/1.5.2/junit-platform-commons-1.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-params/5.5.2/junit-jupiter-params-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-engine/5.5.2/junit-jupiter-engine-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/vintage/junit-vintage-engine/5.5.2/junit-vintage-engine-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar:/Users/fanzhen/Documents/local-repository/org/junit/platform/junit-platform-engine/1.5.2/junit-platform-engine-1.5.2.jar:/Users/fanzhen/Documents/local-repository/junit/junit/4.12/junit-4.12.jar:/Users/fanzhen/Documents/local-repository/org/mockito/mockito-junit-jupiter/3.1.0/mockito-junit-jupiter-3.1.0.jar:/Users/fanzhen/Documents/local-repository/org/assertj/assertj-core/3.13.2/assertj-core-3.13.2.jar:/Users/fanzhen/Documents/local-repository/org/hamcrest/hamcrest/2.1/hamcrest-2.1.jar:/Users/fanzhen/Documents/local-repository/org/mockito/mockito-core/3.1.0/mockito-core-3.1.0.jar:/Users/fanzhen/Documents/local-repository/net/bytebuddy/byte-buddy/1.10.8/byte-buddy-1.10.8.jar:/Users/fanzhen/Documents/local-repository/net/bytebuddy/byte-buddy-agent/1.10.8/byte-buddy-agent-1.10.8.jar:/Users/fanzhen/Documents/local-repository/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/Users/fanzhen/Documents/local-repository/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/Users/fanzhen/Documents/local-repository/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-core/5.2.5.RELEASE/spring-core-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-jcl/5.2.5.RELEASE/spring-jcl-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-test/5.2.5.RELEASE/spring-test-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/xmlunit/xmlunit-core/2.6.4/xmlunit-core-2.6.4.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-core/1.3.2/shiro-core-1.3.2.jar:/Users/fanzhen/Documents/local-repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar:/Users/fanzhen/Documents/local-repository/commons-beanutils/commons-beanutils/1.8.3/commons-beanutils-1.8.3.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-spring/1.3.2/shiro-spring-1.3.2.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-web/1.3.2/shiro-web-1.3.2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar" com.itwopqq.booting.BootingApplication
Connected to the target VM, address: '127.0.0.1:62251', transport: 'socket'

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.6.RELEASE)

2020-04-06 21:02:14.842  INFO 7720 --- [           main] com.itwopqq.booting.BootingApplication   : Starting BootingApplication on fanzhendeAir.bbrouter with PID 7720 (/Users/fanzhen/Documents/ideaworkspaces/booting/target/classes started by fanzhen in /Users/fanzhen/Documents/ideaworkspaces/booting)
2020-04-06 21:02:14.854  INFO 7720 --- [           main] com.itwopqq.booting.BootingApplication   : The following profiles are active: dev
2020-04-06 21:02:16.472  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'shiroConfig' of type [com.itwopqq.booting.config.ShiroConfig$$EnhancerBySpringCGLIB$$5b577a0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.530  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionIdGenerator' of type [org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.532  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionDAO' of type [org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.535  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionValidationScheduler' of type [org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.539  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionIdCookie' of type [org.apache.shiro.web.servlet.SimpleCookie] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.543  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionManager' of type [org.apache.shiro.web.session.mgt.DefaultWebSessionManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.812  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'hashedCredentialsMatcher' of type [org.apache.shiro.authc.credential.HashedCredentialsMatcher] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.858  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'mybatis-org.mybatis.spring.boot.autoconfigure.MybatisProperties' of type [org.mybatis.spring.boot.autoconfigure.MybatisProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.864  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration' of type [org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$4d033398] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.866  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.876  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.905  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'dataSource' of type [com.zaxxer.hikari.HikariDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.238  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sqlSessionFactory' of type [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.244  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sqlSessionTemplate' of type [org.mybatis.spring.SqlSessionTemplate] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.246  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysUserMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.248  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysUserMapper' of type [com.sun.proxy.$Proxy63] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.251  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysRoleMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.253  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysRoleMapper' of type [com.sun.proxy.$Proxy64] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.255  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionMapper' of type [com.sun.proxy.$Proxy65] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'loginServiceimpl' of type [com.itwopqq.booting.system.serviceimpl.LoginServiceimpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'bootingRealm' of type [com.itwopqq.booting.config.BootingRealm] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.259  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'securityManager' of type [org.apache.shiro.web.mgt.DefaultWebSecurityManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.262  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'getMethodInvokingFactoryBean' of type [org.springframework.beans.factory.config.MethodInvokingFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.265  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionServiceImpl' of type [com.itwopqq.booting.system.serviceimpl.SysPermisionServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
===========================================
com.itwopqq.booting.system.serviceimpl.SysPermisionServiceImpl@51a6cc2a
===========================================
2020-04-06 21:02:17.288  INFO 7720 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-04-06 21:02:17.639  INFO 7720 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
======================load shiro filter chain start==========================
==================  url:/system/sysUser/openWatch,perms[/system/sysUser/openWatch]
==================  url:/system/sysUser/openWatch2,perms[/system/sysUser/openWatch2]
==================  url:/system/sysUser/openstank,perms[/system/sysUser/openstank]
==================  url:/system/sysUser/openstank2,perms[/system/sysUser/openstank2]
======================load shiro filter chain end==========================
2020-04-06 21:02:17.807  INFO 7720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'authorizationAttributeSourceAdvisor' of type [org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:18.322  INFO 7720 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-04-06 21:02:18.336  INFO 7720 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-04-06 21:02:18.337  INFO 7720 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-04-06 21:02:18.453  INFO 7720 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-04-06 21:02:18.453  INFO 7720 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3487 ms
2020-04-06 21:02:18.809  INFO 7720 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-04-06 21:02:19.171  INFO 7720 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-04-06 21:02:19.176  INFO 7720 --- [           main] com.itwopqq.booting.BootingApplication   : Started BootingApplication in 5.316 seconds (JVM running for 6.961)

启动日志中下面这段输出的是我们需要访问验证的权限路径:

======================load shiro filter chain start==========================
==================  url:/system/sysUser/openWatch,perms[/system/sysUser/openWatch]
==================  url:/system/sysUser/openWatch2,perms[/system/sysUser/openWatch2]
==================  url:/system/sysUser/openstank,perms[/system/sysUser/openstank]
==================  url:/system/sysUser/openstank2,perms[/system/sysUser/openstank2]
======================load shiro filter chain end==========================

验证:
在我们没有登录过的情况下,我们输入
http://localhost:8080/page/userinfo?name=fanzhen&&age=2访问,
可以看到console打印了下面这句话;

AjaxResult{status='error', msg='您尚未登录或登录时间过长,请重新登录!', data=null}

这是因为userinfo.html页面中另有ajax的请求,该请求被我们的自定义拦截器(PermissionsAuthorizationExtendFilter.java)拦截了,并返回了我们错误的异常信息;
在这里插入图片描述
我们用前面创建的账号模拟登录,访问路径如下

http://localhost:8080/system/sysUser/loginss?username=admin&&password=123456
在这里插入图片描述
在访问之前的路径
http://localhost:8080/page/userinfo?name=fanzhen&&age=2;控制台未打印未登录的日志信息;

好了,接下来我们来试着访问没有权限的页面;
因为前面我们刚模拟登录了有权限的页面;
第一步:访问有权限的页面:/system/sysUser/openstank2
在这里插入图片描述

第二步:访问无权限(/system/sysUser/openstank)的页面,系统将会根据我们在ShiroConfig.java类里面的约束跳转到/403页面
如下,因为我们未设置/403映射的页面,所以页面会报错。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值