首页 > 其他分享 >【Shiro】4.Springboot集成Shiro

【Shiro】4.Springboot集成Shiro

时间:2024-10-07 12:59:50浏览次数:10  
标签:集成 缓存 return Springboot sysUserRealm simpleAuthorizationInfo new 授权 Shiro

https://blog.csdn.net/sco5282/article/details/134016549

前面已经学习了Shiro快速入门缓存 。现在假定实际业务中需要完成以下功能:

1. 包含页面登录和首页。

2. 登录时需要连接数据库,完成登录认证和授权。

3. 登录时,密码需要加密。

4. 登录和授权信息能够缓存。

5. 授权演示两种模式,基于角色授权和基于资源授权。

前提条件

因为这里主要学习shiro,所以与shiro不相干的步骤和准备,尽量简单表示。

1. 新建SpringBoot的Web项目,并新建页面index.html(主页,对应路由ip:接口/index)和login.html(登录页面,对应路由ip:接口/login)。

2. mysql数据库包含用户、角色以及授权的表格(如下图)。这些表格的方法已在SpringBoot结合(Mybatis或Mybatisplus)形成基础的查询方法,我们演示的时候只要调用以上方法即可。

 引入依赖

这里我们需要引用需要的shiro和redis依赖项。

 1 <dependency>
 2     <groupId>org.apache.shiro</groupId>
 3     <artifactId>shiro-spring</artifactId>
 4     <version>1.13.0</version>
 5 </dependency>
 6 <!-- Redis 缓存-->
 7 <dependency>
 8     <groupId>org.springframework.boot</groupId>
 9     <artifactId>spring-boot-starter-data-redis</artifactId>
10     <version>2.5.15</version>
11 </dependency>
12 <dependency>
13     <groupId>org.springframework.data</groupId>
14     <artifactId>spring-data-redis</artifactId>
15     <version>2.5.12</version>
16 </dependency>

 添加Shiro配置类

根据已学过的知识,添加配置类ShiroConfiguratin。

 1 @Configuration
 2 public class ShiroConfiguratin {
 3     @Autowired
 4     private RedisTemplate redisTemplate;
 5 
 6     // 1.创建 shiroFilter,负责拦截所有请求
 7     @Bean
 8     public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
 9         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
10         //给filter设置安全管理器
11         shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
12         //配置系统受限资源
13         //配置系统公共资源
14         Map<String,String> map = new HashMap<>();
15         // authc 请求这个资源需要认证和授权
16         map.put("/index", "authc");
17         //默认认证界面路径
18         shiroFilterFactoryBean.setLoginUrl("/login");
19         shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
20         return shiroFilterFactoryBean;
21     }
22 
23     //2.创建安全管理器
24     @Bean
25     public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm){
26         DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
27         //给安全管理器设置
28         defaultWebSecurityManager.setRealm(realm);
29         return defaultWebSecurityManager;
30     }
31 
32     /**
33      * 3.创建自定义realm
34      * @return
35      */
36     @Bean
37     public Realm getRealm(){
38         SysUserRealm sysUserRealm = new SysUserRealm();
39         // 设置缓存管理器
40         sysUserRealm.setCacheManager(new RedisCacheManage(redisTemplate)); // 自定义Redis数据库缓存方法
41         // 开启全局缓存
42         sysUserRealm.setCachingEnabled(true);
43         // 开启认证缓存并指定缓存名称
44         sysUserRealm.setAuthenticationCachingEnabled(true);
45         sysUserRealm.setAuthenticationCacheName("authenicationCache");
46         // 开启缓存授权并指定缓存名称
47         sysUserRealm.setAuthorizationCachingEnabled(true);
48         sysUserRealm.setAuthorizationCacheName("authenicationCache");
49         return sysUserRealm;
50     }
51 }

这里的配置类完成以下功能。

  • 完成拦截请求(登录index页面前,需要经过认证和授权认证和授权页面(login))
  • 创建安全管理(添加域管理器)
  • 设置自定义域,完成缓存的设置(使用Redis缓存,详见:https://www.cnblogs.com/luyj00436/p/18446712)。

根据之前学到的知识,自定义域完成了认证和授权 SysUserRealm  。

 1 public class SysUserRealm extends AuthorizingRealm {
 2     @Autowired
 3     private SysUserMapper sysUserMapper;        // 用户查询
 4     /**
 5      * 授权
 6      * @param principals the primary identifying principals of the AuthorizationInfo that should be retrieved.
 7      * @return
 8      */
 9     @Override
10     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
11         // 从系统返回的身份信息集合中获取主身份信息(用户名)
12         String primaryPrincipal = (String) principals.getPrimaryPrincipal();
13         // TODO 根据用户名获取当前用户的角色信息,以及权限信息
14         SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
15         // 将数据库中查询到的角色信息赋值给权限对象 
16         simpleAuthorizationInfo.addRole("admin");
17         simpleAuthorizationInfo.addRole("user");
18         // 将数据库中查询权限信息赋值给权限对象
19         simpleAuthorizationInfo.addStringPermission("user:*:01");
20         simpleAuthorizationInfo.addStringPermission("product:create");
21         return simpleAuthorizationInfo;
22     }
23 
24     /**
25      * 认证
26      * @param token the authentication token containing the user's principal and credentials.
27      * @return
28      * @throws AuthenticationException
29      */
30     @Override
31     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
32         // 在token中获取用户名
33         String principal = (String) token.getPrincipal();   // 获取用户名
34         // 根据获取到的用户名查询数据(这里用id代替)
35         SysUser resUser = sysUserMapper.selectById(1);
36         if(principal.equals(resUser.getUsername())){
37             // 参数说明:用户|密码|当前realm的名字
38             return new SimpleAuthenticationInfo(principal,resUser.getPassword(), this.getName() );
39         }
40         return null;
41     }
42 }

 

标签:集成,缓存,return,Springboot,sysUserRealm,simpleAuthorizationInfo,new,授权,Shiro
From: https://www.cnblogs.com/luyj00436/p/18432852

相关文章

  • 基于java+springboot的医院预约挂号系统小程序(源码+lw+部署文档+讲解等)
    课题简介医院预约挂号系统基于Java和SpringBoot开发,是改善医疗服务流程、提高患者就医体验的重要工具。该系统利用Java的稳定性和强大性能,以及SpringBoot的便捷开发框架,确保系统可靠运行和易于维护。它包含了患者信息管理、医生信息管理、科室信息管理、预约管......
  • 基于java+springboot的医学电子技术线上翻转课堂系统(源码+lw+部署文档+讲解等)
    课题简介医学电子技术线上翻转课堂系统基于Java和SpringBoot开发,是为医学教育领域量身打造的创新教学平台。该系统借助Java的稳定性和强大性能,以及SpringBoot的高效开发特性,确保系统能够稳定运行且易于维护和扩展。它涵盖了丰富的功能模块,包括课程资源管理、学......
  • 基于java+springboot的医疗设备管理系统(源码+lw+部署文档+讲解等)
    课题简介医疗设备管理系统基于Java和SpringBoot开发,是专为医疗机构设计的全面高效的设备管理解决方案。该系统利用Java的稳定性和强大性能,以及SpringBoot的便捷开发框架,确保系统可靠运行和易于维护。它涵盖了设备信息管理、采购管理、库存管理、维修管理、报废......
  • 【SpringBoot安全】SpringBoot Jar 包加密防止反编译实战
    一、proguard-maven-plugin二、classfinal-maven-plugin三、实战原创醉鱼醉鱼Java今天给大家分享一个SpringBoot程序Jar包加密的方式,通过代码加密可以实现无法反编译。应用场景就是当需要把公司的产品部署到友方公司或者其他公司时,可以防止客户直接反编译出来源码......
  • SpringBoot 多元化配置(正则表达式,配置文件优先级)
    1.配置绑定所谓“配置绑定”就是把配置文件中的值与JavaBean中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过Java代码去读取该配置文件,并且把配置文件中指定的配置封装到JavaBean(实体类)中。SpringBoot提供了以下2种方式进行配......
  • 基于java+springboot的酒店预定网站、酒店客房管理系统
    该系统是基于Java的酒店客房预订系统设计与实现。是给师弟开发的毕业设计。现将源代码开放出来,感兴趣的同学可以下载。演示地址前台地址:http://hotel.gitapp.cn后台地址:http://hotel.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://git......
  • 基于java+springboot的租房网站、房屋出租管理系统
    该系统是基于java+springboot+vue开发的租房管理系统。是给师弟开发的课程作业。学习过程中,遇到问题可以留言咨询。演示地址前台地址:http://zf.gitapp.cn后台地址:http://zf.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://github.com/g......
  • 陀螺仪LSM6DSV16X与AI集成(13)----中断获取SFLP四元数
    陀螺仪LSM6DSV16X与AI集成.13--中断获取SFLP四元数概述视频教学样品申请源码下载硬件准备SFLP开启INT中断中断读取传感器数据主程序演示概述本文将介绍如何通过中断机制获取LSM6DSV16X传感器的SFLP(SensorFusionLowPower)四元数数据。LSM6DSV16X是一款高性能的......
  • 陀螺仪LSM6DSV16X与AI集成(14)----上报匿名上位机
    陀螺仪LSM6DSV16X与AI集成.14--上报匿名上位机概述视频教学样品申请源码下载硬件准备上位机通讯陀螺仪工作方式欧拉角数据的转换数据帧填充校验和计算数据发送演示开启INT中断中断读取传感器数据主程序演示概述本文介绍了如何将LSM6DSV16X传感器的姿态数据通过匿名......
  • java毕业设计-基于Springboot的助农产品采购平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能商家管理:负责商家入驻、审核、信息及商品上架权限......