1.创建一个简单的Springboot项目,包含shiro和mybatis-plus。

2.集成shiro

2.1引入依赖

 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.4.1</version></dependency>

2.2 将shiro主要的类对象交给spring容器,生成自定义Realm实现类Bean。再生成ShiroFilterChainDefinition对象,并配置所要过滤的请求。anon:就是不处理,针对于静态资源和能直接访问的资源;logout:登出路径,它自己有路径并导到指定实现;user:就是需要登陆验证,进入Realm验证。

yml配置:shiro.loginUrl=/login.html

@Beanpublic Realm shiroRealm() {return new ShiroRealm();}@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition(){DefaultShiroFilterChainDefinition dsfc = new DefaultShiroFilterChainDefinition();//过滤请求dsfc.addPathDefinition("/","anon");dsfc.addPathDefinition("/login","anon");dsfc.addPathDefinition("/css/**","anon");dsfc.addPathDefinition("/js/**","anon");dsfc.addPathDefinition("/images/**","anon");dsfc.addPathDefinition("/fonts/**","anon");dsfc.addPathDefinition("/html/**","anon");//登出dsfc.addPathDefinition("/logout","logout");//其他则需要验证dsfc.addPathDefinition("/**","user");return dsfc;}

3.如图可得  主要目标是实现Realm,自己的代码通过调用subject来整体调用。

4.Realm实现代码(思路:登录认证【验证账号密码】,获取权限【拿着用户id,找角色id,再通过角色id集拿权限】)

记忆点:两个方法有先后顺序,先认证authc,再授权authz

String principal = (String) token.getPrincipal();获取用户名

SimpleAuthenticationInfo simpleAuthentication =

newSimpleAuthenticationInfo(users.get(0),users.get(0).getPwd(),this.getName());进行认证(比对密码,若有加密则看注释代码)。

获取权限:数据库中通过RBAC实现的表。查找数据,获取对应的值。

SimpleAuthorizationInfo sim = new SimpleAuthorizationInfo();
        sim.setRoles(rolesnames); //对subject设置角色
        sim.setStringPermissions(new HashSet<>(premits)); //对subject设置权限

返回sim对象

@Slf4j
public class ShiroRealm extends AuthorizingRealm {@Resourceprivate UsersMapper usersMpaper;@Resourceprivate RoleMapper roleMapper;@Resourceprivate PremitMapper premitMapper;@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {Users user = (Users) principalCollection.getPrimaryPrincipal();//获取角色id和角色名称List<Role> roles = roleMapper.getRidByUserId(user.getId());Set<String> rolesnames = roles.stream().map(v -> v.getRoleName()).collect(Collectors.toSet());log.info("rolesnames:{}",rolesnames);//获取角色权限List<String> premits = premitMapper.getPremitNamesByRoleIds(roles);log.info("premits:{}",premits);SimpleAuthorizationInfo sim = new SimpleAuthorizationInfo();sim.setRoles(rolesnames);sim.setStringPermissions(new HashSet<>(premits));return sim;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String principal = (String) token.getPrincipal();QueryWrapper<Users> qw = new QueryWrapper<Users>();qw.eq("username",principal);List<Users> users = usersMpaper.selectList(qw);if(users.size()!=0){SimpleAuthenticationInfo simpleAuthentication = new SimpleAuthenticationInfo(users.get(0),users.get(0).getPwd(),this.getName());//MD5加密,盐//new SimpleAuthenticationInfo(username,pwd,ByteSource.Util.bytes(salt),this.getName());return simpleAuthentication;}return null;}
}

查询的sql

SELECT r.id,r.role_name from users u join users_role ur on ur.users_id = u.id join role r on ur.role_id = r.id where u.id=#{userid}
SELECT p.pre_names from role_premit rp join premit p on rp.premit_id = p.id where rp.role_id in<foreach collection="roles" item="r" separator="," open="(" close=")">#{r.id}</foreach>

整合的总体思路如图

结束。

(课堂作业)spring-boot集成shiro的步骤及代码解析相关推荐

  1. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题

    为什么80%的码农都做不了架构师?>>>    如题,最近使用spring boot集成shiro,在shiroFilter要使用数据库动态给URL赋权限的时候,发现 @Autowi ...

  2. 有手就行的 Spring Boot 集成 Shiro

    前言   Apache Shiro 是 Java 的一个安全框架.目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Se ...

  3. Spring Boot教程(十六):Spring Boot集成shiro

    Apache Shiro™是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理.借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到 ...

  4. ideal新建springboot工程_MyBatis初级实战之一:Spring Boot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Kafka 入门和 Spring Boot 集成

    2019独角兽企业重金招聘Python工程师标准>>> Kafka 入门和 Spring Boot 集成 概述 kafka 是一个高性能的消息队列,也是一个分布式流处理平台(这里的流 ...

  6. spring boot 集成Mybatis时 Invalid bound statement (not found)

    spring boot 集成Mybatis时,运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...

  7. Spring Boot集成Redis缓存之RedisTemplate的方式

    前言 Spring Boot 集成Redis,将自动配置 RedisTemplate,在需要使用的类中注入RedisTemplate的bean即可使用 @Autowired private Redis ...

  8. 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一

    文章目录 简介 特性 框架结构 依赖集成 依赖 配置 编码 开始使用 核心功能 代码生成器 添加依赖 编码 编写配置 自定义模板引擎 自定义代码模板 自定义属性注入 字段其他信息查询注入 实战总结 常 ...

  9. Spring Boot集成阿里云视频点播服务的过程记录

    阿里云视频点播 效果预览 视频点播 视频点播概述 功能 优势 流程 环境准备 开通视频点播 创建RAM用户并授权 上传SDK 上传流程 下载上传SDK 安装上传SDK 集成Java上传SDK 异常说明 ...

最新文章

  1. Microbiome:宏蛋白质组揭示健康人肠道菌群的功能,离真相更近了一步
  2. 电脑qq收藏在哪里_电脑突然死机了怎么办?几种常见电脑故障及其解决方法
  3. nginx配置文件基本配置
  4. php可以做门禁卡系统吗_PHP研发工程师入门篇:论PHP可以做什么?
  5. 小程序 获取 用户 unionid
  6. 免费好用的图片压缩网站,有这五个就够了(收藏备用)
  7. 云服务器架设大话西游2,端游[大话西游]天演册虚拟机镜像一键启动服务端+客户端+GM工具等...
  8. [论文笔记]Arbitrary-Oriented Scene Text Detection via Rotation Proposals
  9. 《CSS菜鸟教程》学习
  10. AndroidStudio打包AAR供Unity使用流程
  11. [作品]文本修辑转换器
  12. vivo手机如何使用非官方手机主题
  13. 解决ubuntu18 上网速度慢的问题(已经确定没用,你的网速慢就是网速慢)
  14. kermit使用注意事项
  15. matlab 函数不定参数,matlab function定义一个函数,但一直出来说输入参数数目不足。我用的是2014版本,不知道数目原因啊?...
  16. Python的.py与Cython的.pxd.pyx.pyd 文件格式之间的主要区别
  17. Suricata高性能配置
  18. Linux私房菜学习笔记
  19. java生成docx文件
  20. 硬件分析之:有源精密检波电路的分析

热门文章

  1. 2021C语言全套教程
  2. Argis ArcToolbox-分割栅格,无结果**
  3. nginx 之 http 转 https (两种方式)
  4. 面向构件的软件设计问答
  5. Ubuntu18.04安装realsense d435i SDK和ROS Wrapper以及相机标定全过程
  6. python go高并发_天下武功为快不破,戏说Python与Go高并发争锋!
  7. 2021汽车行业内容营销白皮书
  8. 网络安全攻防之IPC$攻击
  9. ma5671怎么设置_华为MA5671怎样设置POE供电
  10. CAD打不开服务器里的文件,电脑上cad文件打不开怎么解决