1.创建一个Spring Initializr项目 选择性勾选开发工具中的lombok 以及Web中的Spring Web,关系型数据库中的Mybatis Framework,WySQL driver

2.导入依赖

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version><scope>test</scope></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.1</version><scope>test</scope></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!--    参数校验    --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.5.Final</version></dependency><!--hutool依赖--><!--字符串检查,雪花算法生成订单号,复制对象实体类,等等工具--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.5.6</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.0</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.4.1</version></dependency></dependencies>

3.在application.yml中修改配置

server:port: 8081
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/class81-shiro?characterEncoding=utf8&useSSL=false&serverTimezone=UTCpassword: 54188username: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8mvc:format:date: yyyy-MM-dd HH:mm:ssmybatis-plus:configuration:log-impl: org.apache.ibatis.logging.slf4j.Slf4jImplmap-underscore-to-camel-case: truetype-aliases-package: com.woniuxy.demo.modelmapper-locations: classpath*:/mappers/**/*.xmllogging:level:com.woniuxy.demo: debugshiro:loginUrl:/login.html

4.在test文件中使用代码生成器,生成将数据库中的表转为java代码

public class MybatisPlusGeneratorExecutor {public static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/class81-shiro?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";public static final String JDBC_USER = "root";public static final String JDBC_PASSWORD = "54188";public static final String AUTHOR = "Lucas";public static final String PARENT_PACKAGE = "com.woniuxy";public static final String MODULE_NAME = "demo";public static final String TABLE_PREFIX = "";public static void main(String[] args) {String projectPath = System.getProperty("user.dir") + "/src/main/";String javaPath = projectPath + "/java";String resourcePath = projectPath + "/resources/mappers";FastAutoGenerator.create(JDBC_URL,JDBC_USER,JDBC_PASSWORD).globalConfig(builder -> {builder.author(AUTHOR)// 设置作者.dateType(DateType.ONLY_DATE).disableOpenDir().enableSwagger().outputDir(javaPath); // 指定输出目录}).packageConfig(builder -> {builder.parent(PARENT_PACKAGE) // 设置父包名.moduleName(MODULE_NAME) // 设置父包模块名.entity("model")//设置实体类包名.mapper("dao")//设置mapper包名.pathInfo(Collections.singletonMap(OutputFile.xml, resourcePath)); // 设置mapperXml生成路径}).strategyConfig(builder -> {builder.addInclude(scanner("要生成的表名")) // 设置需要生成的表名.addTablePrefix(TABLE_PREFIX).serviceBuilder().formatServiceFileName("%sService").controllerBuilder().enableRestStyle();// 设置过滤表前缀}).templateEngine(new VelocityTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();}public static List<String> scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("请输入" + tip + ",用英文逗号分隔:");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotEmpty(ipt)) {return Arrays.asList(StringUtils.split(ipt, ","));}}throw new MybatisPlusException("请输入正确的" + tip + "!");}
}

5.创建一个SecurityConfig的shiro配置类。

@Configuration
public class SecurityConfig {@Bean  //往容器中注入一个Realm域 认证器和授权器最后都会进入此接口public Realm shiroRealm(){return new ShiroRealm();}@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition(){DefaultShiroFilterChainDefinition sfcd = new DefaultShiroFilterChainDefinition();sfcd.addPathDefinition("/","anon");sfcd.addPathDefinition("/login","anon");sfcd.addPathDefinition("/login.html","anon");sfcd.addPathDefinition("/css/**","anon");sfcd.addPathDefinition("/js/**","anon");sfcd.addPathDefinition("/images/**","anon");sfcd.addPathDefinition("/fonts/**","anon");sfcd.addPathDefinition("/html/**","anon");  //以上为自动放行的资源sfcd.addPathDefinition("/logout","logout");//此请求走logout过滤器。sfcd.addPathDefinition("/**","user"); //其他请求皆走user过滤器return sfcd;}@Beanpublic static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();/*** setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。* 在@Controller注解的类的方法中加入@RequiresRole等shiro注解,会导致该方法无法映射请求,导致返回404。* 加入这项配置能解决这个bug*/defaultAdvisorAutoProxyCreator.setUsePrefix(true);return defaultAdvisorAutoProxyCreator;}}

6.创建上速操作中往容器中注入的shirpRealm类 继承AuthorizingRealm类


@Slf4j
public class ShiroRealm extends AuthorizingRealm {@Resourceprivate UserMapper userMapper;@Resourceprivate RoleMapper roleMapper;@Resourceprivate PermissionMapper permMapper;@Override   //进行角色验证以及授权验证protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {User user = (User) principals.getPrimaryPrincipal();//获得用户信息//查找该用户所有的角色List<Role> roleList = roleMapper.selectByUserId(user.getUserId());Set<String> strRoles = roleList.stream().map(r -> r.getRoleName()).collect(Collectors.toSet());//java 8 Stream可查找到此方法。List<String> permissions = new ArrayList<>();if(roleList.size()>0) {//查找该用户所有的权限permissions =  permMapper.selectPermInRoleIds(roleList);}SimpleAuthorizationInfo authzInfo = new SimpleAuthorizationInfo();//authzInfo对象的StringPermissions和Roles属性是权限验证结果 是一个set<String>类型的集合,因为以上操作中需要将查询到的结果转为set<String>类型authzInfo.setStringPermissions(new HashSet<>(permissions));authzInfo.setRoles(strRoles);return authzInfo;}@Override  //执行认证操作 查询该用户是否存在,若存在则认证成功protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {log.info("执行ShiroRealm#doGetAuthenticationInfo {}",token);Object username = token.getPrincipal();QueryWrapper<User> qw = new QueryWrapper<>();qw.eq("user_name",username);User user = userMapper.selectOne(qw);return new SimpleAuthenticationInfo(user,user.getUserPassword(),getClass().getName());
//将查询到的结果注入SimpleAuthenticationInfo类中,该类中的带参构造方法中,会将用户id,以及用户名注入PrincipalCollection类的principals对象中。用户角色验证和授权验证}
}

7.在资源文件夹中创建ini文件

#声明一个自定义的的realm
customRealm=com.woniuxy.demo.ShiroRealm
#将realm注入到securityManager中
securityManager.realms=$customRealm

8.controller层编写接口

@RestController
@Slf4j
public class LoginController {@PostMapping("/login")public String login(String username,String password){Subject subject = SecurityUtils.getSubject();subject.login(new UsernamePasswordToken(username,password));return "success";}@GetMapping("/pay")public String pay(){return "success";}
}

subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。

securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。

realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据。

认证执行流程

1、通过ini配置文件创建securityManager

2、调用subject.login方法主体提交认证,提交的token

3、securityManager进行认证。

4、securityManager调用realm(给realm传入token) 去ini配置文件中查询用户信息

5、Realm根据输入的token从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)

如果查询到用户信息,就给securityManager返回用户信息(账号和密码)

如果查询不到,就给securityManager返回null

6、securityManager接收认证信息

如果返回的认证信息是null,抛出异常

如果返回的认证信息不是null(说明realm找到了用户),对realm返回用户密码 
         和 token中的密码 进行对比,如果不一致抛出异常

授权执行流程

1.认证成功,realm将查询到的用户信息传入principals

2.调用realm的授权方法doGetAuthorizationInfo,将principals作为参数传入

3.从principals中通过getPrimaryPrincipal()方法获得用户

4.从数据库中查询该用户所有的角色,再用查询到的角色id查询角色的所有授权信息

5.利用SimpleAuthorizationInfo中的setStringPermissions和setRoles方法进行角色和授权信息的比对,如果没有角色信息或权限则抛出异常。

使用MybatisPlus实现ShiroRealm相关推荐

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

    资源下载链接:https://download.csdn.net/download/dayonglove2018/13960978 shiro是轻量级的权限管控框架.很早前就接触过.不过一直没有实现了 ...

  2. 初学MyBatis-Plus

    文章目录 MyBatis-Plus MyBatisPlus概述 快速开始 配置日志 CRUD扩展 插入操作 主键生成策略 更新操作 自动填充 乐观锁 查询操作 分页查询 删除操作 逻辑删除 性能分析插 ...

  3. 快速上手MyBatisPlus~(基友搭配,效率翻倍)

    目录 一.简介 二.快速入门 1. 创建数据库及数据表 2. 新建项目,导入依赖 3. 编写数据库配置文件&连接 4. 创建pojo实体类 5. 编写mapper&扫描 6. 测试类简 ...

  4. Mybatis-Plus 支持分库分表了?-官方神器发布!

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计. ...

  5. MyBatis-Plus,搭配 Spring Boot 使用,一篇就够了

    以下文章来源方志朋的博客,回复"666"获面试宝典 MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率.下文使用缩写 mp来简化表示 MyBatis ...

  6. MyBatis-Plus 看这篇就够了

    点击关注公众号,Java干货及时送达 本文作者:yogurtzzz :juejin.cn/post/6961721367846715428 MyBatis-plus 是一款 Mybatis 增强工具, ...

  7. Mybatis-plus常用API全套教程,看完没有不懂的

    点击关注公众号,Java干货及时送达 作者:java架构师阿松 www.toutiao.com/i6869621037831717387 前言 官网: https://baomidou.com/ 创建 ...

  8. 实战:一键生成前后端代码,Mybatis-Plus代码生成器让我舒服了

    前言 在日常的软件开发中,程序员往往需要花费大量的时间写CRUD,不仅枯燥效率低,而且每个人的代码风格不统一.MyBatis-Plus 代码生成器,通过 AutoGenerator 可以快速生成 En ...

  9. Spring Boot 中引入 MyBatisPlus 的常规流程

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 出处:blog.csdn.net/larger5/arti ...

  10. MyBatis-Plus为啥这么牛?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:ThinkYi 链接:http://cnblogs. ...

最新文章

  1. C#使用SQL语句时候的万用密码问题
  2. 获取收藏夹路径的C++代码
  3. Web服务-Nginx网页服务
  4. 洛谷P7361:拜神(SA、二分、主席树、启发式合并)
  5. 服务器开放特定端口的方法
  6. 阿里云 Serverless Kubernetes 的落地实践分享
  7. python元组为什么不可变_为什么python字符串和元组是不可变的?
  8. python之-- 异常
  9. mysql数据库中命令行下常用命令的操作(增、删、改、查)和数据类型
  10. boost::shared_ptr文档翻译
  11. vba html 教程 pdf,Word VBA教程:CanvasShapes集合
  12. android dagger2 讲解,dagger 2 详解
  13. 软件测试相关试题知识点
  14. 巴西电商olist store订单数据分析
  15. linux 3d 制作工具,3D特效制作 SideFX Houdini FX For Win/Linux/macOS 及安装教程
  16. CST设计接收贴片天线
  17. 激活系统报错——输入错误: 没有文件扩展“.vbs”的脚本引擎
  18. Requests库常用方法及参数介绍
  19. Matlab虚拟现实工具箱——没有VRML Editor时的使用办法(应该是Simulink 3D Animation Demo版本的都是这样)
  20. Angelababy否认已怀身孕:我怎么不知道

热门文章

  1. Stanford CoreNLP依存关系分析、词性标注及句子主语分析(使用Python) 超详细截图手把手教学,新手友好
  2. 基于ATTiny85的digispark Arduino最小系统的自制教程(二)
  3. Uber AI 研究院深度解构 ICLR 2019 最佳论文「彩票假设」!
  4. 全类销项发票电子化管理系统:iBox+RPA的开票流程数字化
  5. Word导出pdf时Origin图片出现重影(重叠)
  6. 计算机设置了分组用户怎么切换,怎么弄微信小号-不单止换小号,另外这些微信小技巧也一定让你“相见恨晚”...
  7. postgres 退出_Postgresl选择正确的关闭模式
  8. 80286/286/Intel286 架构/流水线及其优化
  9. vss服务器状态失败_关于vss事件日志报如下错误
  10. 目前能体验到的虚拟主播虚拟人脸形象有哪些?