资源下载链接:https://download.csdn.net/download/dayonglove2018/13960978

shiro是轻量级的权限管控框架.很早前就接触过.不过一直没有实现了,因为本人不太容易理解权限,角色,用户(太抽像了0.0).最近几天又想起来这个shiro,所以又研究了一下.没想到实现了(哈哈哈....).话不多说了.直接上代码.

目录结构:

pom.xml配置

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions></dependency><!--文本短信--><dependency><groupId>com.jdcloud.sdk</groupId><artifactId>sms</artifactId><version>1.2.0</version></dependency><!--shiro--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- mybatisPlus 核心库 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><!-- 引入阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- spark依赖 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>2.2.0</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.11</artifactId><version>2.2.0</version></dependency><!-- hivecontext要用这个依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.11</artifactId><version>2.2.0</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>14.0.1</version></dependency></dependencies>

application.properties

server.port=2080spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/work?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
mybatis-plus.mapper-locations=classpath:mapper/*.xml
# 主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.global-config.db-config.db-type=mysql
# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

MyBatisPlusConfig.java

package com.example.demo.cofig;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {/*** mybatis-plus SQL执行效率插件*/@Beanpublic PerformanceInterceptor performanceInterceptor() {return new PerformanceInterceptor();}/*** 分页插件*/@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}

ShiroConfig.java

package com.example.demo.shiro.config;import com.example.demo.shiro.realm.CustomRealm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;/*** shiro的配置类*/
@Configuration
public class ShiroConfig {@Bean@ConditionalOnMissingBeanpublic DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();defaultAAP.setProxyTargetClass(true);return defaultAAP;}@Beanpublic CustomRealm shiroRealm() {CustomRealm customRealm = new CustomRealm();return customRealm;}@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(shiroRealm());return securityManager;}/*** 拦截* @param securityManager* @return*/@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> map = new HashMap<>();// 退出登录map.put("/logout", "logout");map.put("/**", "authc");// 登录shiroFilterFactoryBean.setLoginUrl("/login");// 首页shiroFilterFactoryBean.setSuccessUrl("/index");shiroFilterFactoryBean.setUnauthorizedUrl("/error");shiroFilterFactoryBean.setFilterChainDefinitionMap(map);return shiroFilterFactoryBean;}/*** 交给spring容器管理* @param securityManager* @return*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}
}

定义的Realm类

package com.example.demo.shiro.realm;import com.example.demo.shiro.bean.Permissions;
import com.example.demo.shiro.bean.Role;
import com.example.demo.shiro.bean.User;
import com.example.demo.shiro.service.LoginService;
import com.example.demo.shiro.service.UserService;
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.springframework.beans.factory.annotation.Autowired;/*** shiro 的 Realm类*/
public class CustomRealm extends AuthorizingRealm {@Autowiredprivate LoginService loginService;@Autowiredprivate UserService userService;@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {String name = (String) principalCollection.getPrimaryPrincipal();User user = loginService.getUserByName(name);//        User userInfo = userService.getUserByName(name);SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();for (Role role : user.getRoles()){info.addRole(role.getRoleName());for (Permissions permissions : role.getPermissions()){info.addStringPermission(permissions.getPermissionsName());}}return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {if(authenticationToken.getPrincipal() == null){return null;}String name = authenticationToken.getPrincipal().toString();User user = loginService.getUserByName(name);if(null == user){return null;} else {SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(name, user.getPassWord(), getName());return info;}}
}

与数据库对应的一些实体:

UserInfo

package com.example.demo.shiro.bean.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 用户 与数据库对应*/
@Data
@NoArgsConstructor
@AllArgsConstructor
// @TableName中的值对应着表名
@TableName("user")
public class UserInfo {/*** ID*/@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/private String userName;/*** 密码*/private String passWord;
}

UserRoleInfo

package com.example.demo.shiro.bean.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 用户角色中间为 与数据库对应*/
@Data
@NoArgsConstructor
@AllArgsConstructor
// @TableName中的值对应着表名
@TableName("user_role")
public class UserRoleInfo {/*** ID*/@TableId(type = IdType.AUTO)private Long id;/*** 用户ID*/private Long userId;/*** 角色ID*/private Long roleId;
}

RoleInfo

package com.example.demo.shiro.bean.po;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 角色类 与数据库对应*/
@Data
@NoArgsConstructor
@AllArgsConstructor
// @TableName中的值对应着表名
@TableName("role")
public class RoleInfo {/*** 角色ID*/private Long id;/*** 角色名称*/private String roleName;}

RolePermissionsInfo

package com.example.demo.shiro.bean.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 角色与权限中间类 与数据库对应*/
@Data
@NoArgsConstructor
@AllArgsConstructor
// @TableName中的值对应着表名
@TableName("role_permissions")
public class RolePermissionsInfo {/*** ID*/@TableId(type = IdType.AUTO)private Long id;/*** 角色ID*/private Long roleId;/*** 权限ID*/private Long permissionsId;
}

PermissionsInfo

package com.example.demo.shiro.bean.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 权限类,与数据库是对应的*/
@Data
@NoArgsConstructor
@AllArgsConstructor
// @TableName中的值对应着表名
@TableName("permissions")
public class PermissionsInfo {/*** ID*/@TableId(type = IdType.AUTO)private Long id;/*** 权限名称*/private String permissionsName;
}

业务传递实体

User

package com.example.demo.shiro.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Set;/*** 用户 传递使用*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {/*** ID*/private Long id;/*** 用户名(登录名) 唯一*/private String userName;/*** 密码*/private String passWord;/*** 用户对应的角色集合*/private Set<Role> roles;
}

UserRole

package com.example.demo.shiro.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 用户和角色 传递使用*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRole {/*** ID*/private Long id;/*** 用户ID*/private Long userId;/*** 角色ID*/private Long roleId;
}

Role

package com.example.demo.shiro.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Set;/*** 角色类 传递使用*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role {/*** ID*/private Long id;/*** 角色名称*/private String roleName;/*** 角色对应权限集合*/private Set<Permissions> permissions;
}

RolePermissions

package com.example.demo.shiro.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 角色与权限中间的类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RolePermissions {/*** ID*/private Long id;/*** 角色ID*/private Long roleId;/*** 权限ID*/private Long permissionsId;
}

Permissions

package com.example.demo.shiro.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 权限类 传递使用*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Permissions {/*** 主键ID*/private Long id;/*** 权限名*/private String permissionsName;
}

dao层

UserDao

package com.example.demo.shiro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.shiro.bean.po.UserInfo;public interface UserDao extends BaseMapper<UserInfo> {UserInfo selectUserByName(String name);
}

UserRoleDao

package com.example.demo.shiro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.shiro.bean.UserRole;
import com.example.demo.shiro.bean.po.UserRoleInfo;import java.util.List;public interface UserRoleDao extends BaseMapper<UserRoleInfo> {List<UserRoleInfo> getByUserId(Long userId);
}

RoleDao

package com.example.demo.shiro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.shiro.bean.po.RoleInfo;import java.util.List;public interface RoleDao extends BaseMapper<RoleInfo> {List<RoleInfo> selectByUserId(Long userId);
}

RolePermissionsDao

package com.example.demo.shiro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.shiro.bean.po.RolePermissionsInfo;import java.util.List;public interface RolePermissionsDao extends BaseMapper<RolePermissionsInfo> {List<RolePermissionsInfo> selectByRoleId(Long roleId);
}

PermissionsDao

package com.example.demo.shiro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.shiro.bean.po.PermissionsInfo;public interface PermissionsDao extends BaseMapper<PermissionsInfo> {}

service层

我把接口和实现类写在一起了.如果开发项目就按规范的来

LoginService

package com.example.demo.shiro.service;import com.example.demo.shiro.bean.User;public interface LoginService {User getUserByName(String userName);
}

LoginServiceImpl

package com.example.demo.shiro.service;import com.example.demo.shiro.bean.Permissions;
import com.example.demo.shiro.bean.Role;
import com.example.demo.shiro.bean.User;
import com.example.demo.shiro.bean.po.PermissionsInfo;
import com.example.demo.shiro.bean.po.RoleInfo;
import com.example.demo.shiro.bean.po.RolePermissionsInfo;
import com.example.demo.shiro.bean.po.UserRoleInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashSet;
import java.util.List;
import java.util.Set;@Service
public class LoginServiceImpl implements LoginService {@Autowiredprivate UserService userService;@Autowiredprivate RoleService roleService;@Autowiredprivate PermissionsService permissionsService;@Autowiredprivate UserRoleService userRoleService;@Autowiredprivate RolePermissionsService rolePermissionsService;/*** 根据用户名查询用户 用户名唯一* @param userName* @return*/@Overridepublic User getUserByName(String userName) {User user = getMapByName(userName);return user;}/*** 根据用户名查询用户* @param userName* @return*/private User getMapByName(String userName){User user2 = userService.getUserByName(userName);List<UserRoleInfo> userRoleList = userRoleService.getByUserId(user2.getId());Set<Role> roleInfoSet = new HashSet<>();for (UserRoleInfo userRole : userRoleList) {Role role = new Role();RoleInfo roleInfo = roleService.getById(userRole.getRoleId());BeanUtils.copyProperties(roleInfo, role);Set<Permissions> permissionsSet = new HashSet<>();List<RolePermissionsInfo> rolePermissionsInfoList = rolePermissionsService.getByRoleId(roleInfo.getId());for (RolePermissionsInfo rolePermissionsInfo : rolePermissionsInfoList) {Permissions permissions = new Permissions();PermissionsInfo permissionsInfo = permissionsService.getById(rolePermissionsInfo.getPermissionsId());BeanUtils.copyProperties(permissionsInfo, permissions);permissionsSet.add(permissions);}role.setPermissions(permissionsSet);roleInfoSet.add(role);}user2.setRoles(roleInfoSet);return user2;}
}

UserService

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.shiro.bean.User;
import com.example.demo.shiro.bean.po.UserInfo;public interface UserService extends IService<UserInfo> {User getUserByName(String name);}

UserServiceImpl

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.shiro.bean.User;
import com.example.demo.shiro.bean.po.UserInfo;
import com.example.demo.shiro.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class UserServiceImpl extends ServiceImpl<UserDao, UserInfo> implements UserService{@Autowiredprivate UserDao userDao;@Overridepublic User getUserByName(String name) {User user = new User();UserInfo userInfo = userDao.selectUserByName(name);user.setId(userInfo.getId());user.setPassWord(userInfo.getPassWord());user.setUserName(userInfo.getUserName());
//        user.setRoles();return user;}}

UserRoleService

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.shiro.bean.UserRole;
import com.example.demo.shiro.bean.po.UserRoleInfo;import java.util.List;public interface UserRoleService extends IService<UserRoleInfo> {List<UserRoleInfo> getByUserId(Long userId);
}

UserRoleServiceImpl

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.shiro.bean.UserRole;
import com.example.demo.shiro.bean.po.UserRoleInfo;
import com.example.demo.shiro.dao.UserRoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Transactional
public class UserRoleServiceImpl extends ServiceImpl<UserRoleDao, UserRoleInfo> implements UserRoleService{@Autowiredprivate UserRoleDao userRoleDao;@Overridepublic List<UserRoleInfo> getByUserId(Long userId) {return userRoleDao.getByUserId(userId);}
}

RoleService

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.shiro.bean.po.RoleInfo;import java.util.List;public interface RoleService extends IService<RoleInfo> {List<RoleInfo> getByUserId(Long id);
}

RoleServiceImpl

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.shiro.bean.po.RoleInfo;
import com.example.demo.shiro.dao.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Transactional
public class RoleServiceImpl extends ServiceImpl<RoleDao, RoleInfo> implements RoleService{@Autowiredprivate RoleDao roleDao;@Overridepublic List<RoleInfo> getByUserId(Long userId) {List<RoleInfo> roleInfoList = roleDao.selectByUserId(userId);return roleInfoList;}
}

RolePermissionsService

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.shiro.bean.po.RolePermissionsInfo;import java.util.List;public interface RolePermissionsService extends IService<RolePermissionsInfo> {List<RolePermissionsInfo> getByRoleId(Long roleId);
}

RolePermissionsServiceImpl

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.shiro.bean.po.RolePermissionsInfo;
import com.example.demo.shiro.dao.RolePermissionsDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Transactional
public class RolePermissionsServiceImpl extends ServiceImpl<RolePermissionsDao, RolePermissionsInfo> implements RolePermissionsService{@Autowiredprivate RolePermissionsDao rolePermissionsDao;@Overridepublic List<RolePermissionsInfo> getByRoleId(Long roleId) {return rolePermissionsDao.selectByRoleId(roleId);}
}

PermissionsService

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.shiro.bean.po.PermissionsInfo;public interface PermissionsService extends IService<PermissionsInfo> {}

PermissionsServiceImpl

package com.example.demo.shiro.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.shiro.bean.po.PermissionsInfo;
import com.example.demo.shiro.dao.PermissionsDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class PermissionsServiceImpl extends ServiceImpl<PermissionsDao, PermissionsInfo> implements PermissionsService{}

启动类

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan(basePackages = {"com.example.demo.shiro.dao"}) //扫描DAO
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

Mapper文件

UserDao.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.example.demo.shiro.dao.UserDao"><!-- Sans 2019/6/9 14:35 --><select id="selectUserByName" resultType="com.example.demo.shiro.bean.po.UserInfo" parameterType="java.lang.String">SELECT * FROM user WHERE user_name = #{name}</select>
</mapper>

UserRoleDao.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.example.demo.shiro.dao.UserRoleDao"><!-- Sans 2019/6/9 14:35 --><select id="getByUserId" resultType="com.example.demo.shiro.bean.po.UserRoleInfo" parameterType="java.lang.Long">SELECT * FROM user_role where user_id = #{userId}</select>
</mapper>

RoleDao.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.example.demo.shiro.dao.RoleDao"><!-- Sans 2019/6/9 14:35 --><select id="selectByUserId" resultType="com.example.demo.shiro.bean.po.RoleInfo" parameterType="java.lang.Long">SELECT * FROM role r left join user_role ur on r.id = ur.role_id and user_id = #{userId}</select>
</mapper>

RolePermissionsDao.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.example.demo.shiro.dao.RolePermissionsDao"><!-- Sans 2019/6/9 14:35 --><select id="selectByRoleId" resultType="com.example.demo.shiro.bean.po.RolePermissionsInfo" parameterType="java.lang.Long">SELECT * FROM role_permissions where role_id = #{roleId}</select>
</mapper>

PermissionsDao.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.example.demo.shiro.dao.PermissionsDao"><!-- Sans 2019/6/9 14:35 --><select id="selectUserByName" resultType="com.example.demo.shiro.bean.po.PermissionsInfo" parameterType="java.lang.String">SELECT * FROM user WHERE user_name = #{name}</select>
</mapper>

sql文件

sql设计的比较简单

/*
SQLyog Professional v12.09 (64 bit)
MySQL - 5.7.29 : Database - work
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`work` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `work`;/*Table structure for table `permissions` */DROP TABLE IF EXISTS `permissions`;CREATE TABLE `permissions` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`permissions_name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;/*Data for the table `permissions` */insert  into `permissions`(`id`,`permissions_name`) values (1,'query'),(2,'add'),(3,'delete'),(4,'detail'),(5,'update'),(6,'list');/*Table structure for table `product` */DROP TABLE IF EXISTS `product`;CREATE TABLE `product` (`id` varchar(255) NOT NULL COMMENT '主键id',`title` varchar(255) DEFAULT NULL,`price` varchar(255) DEFAULT NULL,`producturl` varchar(255) DEFAULT NULL,`pic` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `product` *//*Table structure for table `role` */DROP TABLE IF EXISTS `role`;CREATE TABLE `role` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`role_name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `role` */insert  into `role`(`id`,`role_name`) values (1,'bronze'),(2,'silver'),(3,'gold'),(4,'diamond'),(5,'king');/*Table structure for table `role_permissions` */DROP TABLE IF EXISTS `role_permissions`;CREATE TABLE `role_permissions` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`role_id` bigint(10) NOT NULL,`permissions_id` bigint(10) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;/*Data for the table `role_permissions` */insert  into `role_permissions`(`id`,`role_id`,`permissions_id`) values (1,1,1),(2,1,2),(4,2,2),(5,2,3),(6,2,4),(7,3,2),(8,3,4),(9,3,5),(10,5,5);/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`user_name` varchar(50) DEFAULT NULL,`pass_word` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `user` */insert  into `user`(`id`,`user_name`,`pass_word`) values (1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456'),(4,'abc','123456'),(5,'huangjin','123456');/*Table structure for table `user_role` */DROP TABLE IF EXISTS `user_role`;CREATE TABLE `user_role` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`user_id` bigint(10) NOT NULL,`role_id` bigint(10) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;/*Data for the table `user_role` */insert  into `user_role`(`id`,`user_id`,`role_id`) values (1,1,1),(2,1,2),(3,2,1),(4,2,2),(6,3,4),(7,4,1),(8,5,3);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

代码上完了.看一下启动测试.使用postman来测试

首先测试权限级别的: @RequiresPermissions("xxx")

  • 未登录的情况下访问接口

  • 使用"zhangsan"用户登录

"zhangsan" 用户是拥有id为1,2,3,4的权限

add的权限

detail权限

detail权限

update权限,因为"zhangsan"用户没有update权限.所以应该是报错

下面测试角色级别的:@RequiresRoles("xxx")

换一个"huangjin"用户登录

访问黄金角色的接口,结果是OK的

再访问青铜的接口,提示没有权限,并且后台也报错了

============================================================================================

第一次写博客,纯手打,复制,粘图.太不易了.希望能帮到各位.

============================================================================================

如有不合理的请留言指出,共同学习下.谢谢!!!

============================================================================================

原创文章,转载注明出处!

springboot整合shiro,mybatis-plus实现用户角色,权限管控.(完整demo)相关推荐

  1. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板

    主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...

  2. SpringBoot整合Shiro实现登录认证和授权CHCache

    文章目录 一. springboot实现普通登录 1 添加依赖 2 编写配置文件 3 新建实体类和mapper 4 编写业务层代码 5 编写控制器 6 编写启动类 7 编写登录页面和主页面 二. sp ...

  3. SpringBoot整合Shiro学习(上)

    SpringBoot整合Shiro(上) 基于[编程不良人]2020最新版Shiro教程,整合SpringBoot项目实战教程 哔哩哔哩链接:https://www.bilibili.com/vide ...

  4. Spring Boot整合Shiro + JSP教程(用户认证,权限管理,图片验证码)

    在此首先感谢**编程不良人**up主提供的视频教程 代码都是跟着up的视频敲的,遇到的一些问题也是通过CSDN博主提供的教程解决的,在此也感谢那些提供bug解决方案的前辈们~ 项目完整代码已经发布到g ...

  5. 降龙十八掌之 springboot整合shiro(含MD5加密)

    java学习爱好者 2019-05-27 16:21:00 开发环境: 1.mysql - 5.7.21 2.navicat(mysql客户端管理工具) 3.idea 2017 4.jdk9 5.to ...

  6. springboot整合shiro(超详细,你想要的都在这了)

    Springboot整合Shiro 文章目录 pom依赖 前端页面(thymeleaf整合shiro) thymeleaf中shiro标签解释 数据库(整合mybatis) 理解shiro的几个组成部 ...

  7. 补习系列(6)- springboot 整合 shiro 一指禅

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. SpringBoot整合Shiro实现权限控制,验证码

    本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...

  9. SpringBoot 整合Shiro 一指禅

    目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...

最新文章

  1. sharepoint 配置站点导航栏 顶级菜单栏的下拉菜单
  2. 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化
  3. 使用eclipse运行mapreduce程序
  4. P4336-[SHOI2016]黑暗前的幻想乡【矩阵树定理,容斥】
  5. STM32----摸石头过河系列(四)
  6. 利用scons构建project
  7. django小站,数据3w+
  8. html跳转浏览器打开新页面打开新窗口,用JS控制打开新窗口
  9. 如何在Microsoft Excel电子表格之间交叉引用单元格
  10. PDF编辑器首选工具Acrobat Pro DC
  11. Hadoop大数据通用处理平台
  12. 英文文本关系抽取(fine-tune Huggingface XLNet)
  13. 什么是WordPress插件?
  14. 键盘与ASCII码对应表
  15. GIS-空间分析(3)
  16. 盘点时下热门Web3社交项目
  17. shell 字符串编程--Bash测试和比较函数
  18. 树莓派ubuntu wifi和网口经常断线问题其一解决方案
  19. python3 深度搜索DPS 与 宽度搜索 DFS
  20. java名词解释 抽象,java名词解释

热门文章

  1. c++之epoll原理解析与Client Server功能实现
  2. android动画变黑,Activity添加进入和退出动画的两种方式,解决黑色区域问题
  3. 用cmd 如何输入命令进入文件夹
  4. 小程序-下拉刷新+上拉加载更多
  5. 中国软件外包业亟待创立品牌
  6. 易趣免费之后的三大战略
  7. AmazonS3基本方法简述
  8. Linux实用技巧之screen(离线使用服务器训练模型的神器)
  9. tryParse 检测入参是否是数字
  10. 2022机器配音小程序源码+支持多种机器语音