springboot整合shiro,mybatis-plus实现用户角色,权限管控.(完整demo)
资源下载链接: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)相关推荐
- SpringBoot整合Shiro搭建登录注册认证授权权限项目模板
主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...
- SpringBoot整合Shiro实现登录认证和授权CHCache
文章目录 一. springboot实现普通登录 1 添加依赖 2 编写配置文件 3 新建实体类和mapper 4 编写业务层代码 5 编写控制器 6 编写启动类 7 编写登录页面和主页面 二. sp ...
- SpringBoot整合Shiro学习(上)
SpringBoot整合Shiro(上) 基于[编程不良人]2020最新版Shiro教程,整合SpringBoot项目实战教程 哔哩哔哩链接:https://www.bilibili.com/vide ...
- Spring Boot整合Shiro + JSP教程(用户认证,权限管理,图片验证码)
在此首先感谢**编程不良人**up主提供的视频教程 代码都是跟着up的视频敲的,遇到的一些问题也是通过CSDN博主提供的教程解决的,在此也感谢那些提供bug解决方案的前辈们~ 项目完整代码已经发布到g ...
- 降龙十八掌之 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 ...
- springboot整合shiro(超详细,你想要的都在这了)
Springboot整合Shiro 文章目录 pom依赖 前端页面(thymeleaf整合shiro) thymeleaf中shiro标签解释 数据库(整合mybatis) 理解shiro的几个组成部 ...
- 补习系列(6)- springboot 整合 shiro 一指禅
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- SpringBoot整合Shiro实现权限控制,验证码
本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...
- SpringBoot 整合Shiro 一指禅
目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...
最新文章
- sharepoint 配置站点导航栏 顶级菜单栏的下拉菜单
- 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化
- 使用eclipse运行mapreduce程序
- P4336-[SHOI2016]黑暗前的幻想乡【矩阵树定理,容斥】
- STM32----摸石头过河系列(四)
- 利用scons构建project
- django小站,数据3w+
- html跳转浏览器打开新页面打开新窗口,用JS控制打开新窗口
- 如何在Microsoft Excel电子表格之间交叉引用单元格
- PDF编辑器首选工具Acrobat Pro DC
- Hadoop大数据通用处理平台
- 英文文本关系抽取(fine-tune Huggingface XLNet)
- 什么是WordPress插件?
- 键盘与ASCII码对应表
- GIS-空间分析(3)
- 盘点时下热门Web3社交项目
- shell 字符串编程--Bash测试和比较函数
- 树莓派ubuntu wifi和网口经常断线问题其一解决方案
- python3 深度搜索DPS 与 宽度搜索 DFS
- java名词解释 抽象,java名词解释