Spring Boot2 整合 Shiro ,两种方式全总结!

前言:在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。

文章目录

    • 一、Spring Security 和 Shiro 的比较
    • 二、原生的整合
      • 2.1. 创建一个 Spring Boot 项目
      • 2.1. 加入 Shiro 相关的依赖
      • 2.2. 完整pom
      • 2.3. 自定义核心组件 Realm
      • 2.4. 配置 Shiro
      • 2.5. 配置登录 Controller
    • 三、测试验证
      • 3.1. 首先访问 /hello 接口
      • 3.2. 然后调用 /doLogin 接口完成登录
      • 3.3. 再次访问 /hello 接口
    • 四、使用 Shiro Starter
      • 4.1. 创建工程,和上面的一样
      • 4.2. pom
      • 4.3. 创建 Realm
      • 4.4. 配置 Shiro 基本信息
      • 4.5. 配置 ShiroConfig
    • 五、总结

今天gblfy就来和大家聊聊 Spring Boot 整合 Shiro 的话题!

一、Spring Security 和 Shiro 的比较

一般来说,Spring Security 和 Shiro 的比较如下:

Spring SecurityShiro
是一个重量级的安全管理框架则是一个轻量级的安全管理框架
概念复杂,配置繁琐概念简单、配置简单
功能强大功能简单

虽然 Shiro 功能简单,但是也能满足大部分的业务场景。所以在传统的 SSM 项目中,一般来说,可以整合 Shiro。

在 Spring Boot 中,由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,当然也提供了 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。

这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。

在 Spring Boot 中整合 Shiro ,有两种不同的方案:

第一种就是原封不动的,将 SSM 整合 Shiro 的配置用 Java 重写一遍。

第二种就是使用 Shiro 官方提供的一个 Starter 来配置,但是,这个 Starter 并没有简化多少配置。

二、原生的整合

2.1. 创建一个 Spring Boot 项目

只需要添加 Web 依赖即可
在这里插入图片描述

2.1. 加入 Shiro 相关的依赖

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency>

2.2. 完整pom

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

2.3. 自定义核心组件 Realm

package com.gblfy.realm;import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;/*** @author gblfy* @Description https://www.gblfy.com* @Date 2019/12/8 15:45*/
public class MyRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username = (String) token.getPrincipal();if (!"gblfy".equals(username)) {throw new UnknownAccountException("账户不存在!");}return new SimpleAuthenticationInfo(username, "123", getName());}
}

在 Realm 中实现简单的认证操作即可,不做授权,授权的具体写法和 SSM 中的 Shiro 一样,不赘述。这里的认证表示用户名必须是 javaboy ,用户密码必须是 123 ,满足这样的条件,就能登录成功!

2.4. 配置 Shiro

package com.gblfy.config;import com.gblfy.realm.MyRealm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.LinkedHashMap;
import java.util.Map;/*** @author gblfy* @Description https://www.gblfy.com* @Date 2019/12/8 15:45* <p>* 在这里进行 Shiro 的配置* Shiro 的配置主要配置 3 个 Bean* <p>* 1. 首先需要提供一个 Realm 的实例* 2. 需要配置一个 SecurityManager,在 SecurityManager 中配置 Realm* 3. 配置一个 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等*/
@Configuration
public class ShiroConfig {@BeanMyRealm myRealm() {return new MyRealm();}@BeanSecurityManager securityManager() {DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(myRealm());return manager;}@BeanShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();//指定 SecurityManagerbean.setSecurityManager(securityManager());//登录页面bean.setLoginUrl("/login");//登录成功页面bean.setSuccessUrl("/index");//访问未获授权路径时跳转的页面bean.setUnauthorizedUrl("/unauthorizedurl");//配置路径拦截规则,注意,要有序Map<String, String> map = new LinkedHashMap<>();map.put("/doLogin", "anon");map.put("/**", "authc");bean.setFilterChainDefinitionMap(map);return bean;}
}

在这里进行 Shiro 的配置主要配置 3 个 Bean :

①首先需要提供一个 Realm 的实例。
②需要配置一个 SecurityManager,在 SecurityManager 中配置 Realm。
③配置一个 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等。
④配置登录和测试接口。

其中,ShiroFilterFactoryBean 的配置稍微多一些,配置含义如下:
①setSecurityManager 表示指定 SecurityManager。
②setLoginUrl 表示指定登录页面。
③setSuccessUrl 表示指定登录成功页面。
④接下来的 Map 中配置了路径拦截规则,注意,要有序。

2.5. 配置登录 Controller

package com.gblfy.controller;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author gblfy* @Description https://www.gblfy.com* @Date 2019/12/8 15:45*/
@RestController
public class LoginController {/*** 登录方法** @param username* @param password*/@PostMapping("/doLogin")public String doLogin(String username, String password) {Subject subject = SecurityUtils.getSubject();try {subject.login(new UsernamePasswordToken(username, password));return "登录成功!";} catch (AuthenticationException e) {e.printStackTrace();return "登录失败!";}}/*** 测试方法** @return*/@GetMapping("/hello")public String helloWord() {return "helloWord";}/*** 统一拦截登录页面** @return*/@GetMapping("/login")public String login() {return "please login!";}
}

三、测试验证

测试时,首先访问 /hello 接口,由于未登录,所以会自动跳转到 /login 接口

3.1. 首先访问 /hello 接口

http://localhost:8080/hello

在这里插入图片描述

3.2. 然后调用 /doLogin 接口完成登录

http://localhost:8080/doLogin?username=gblfy&password=123

在这里插入图片描述

3.3. 再次访问 /hello 接口

就可以成功访问了:
在这里插入图片描述

四、使用 Shiro Starter

上面这种配置方式实际上相当于把 SSM 中的 XML 配置拿到 Spring Boot 中用 Java 代码重新写了一遍,除了这种方式之外,我们也可以直接使用 Shiro 官方提供的 Starter 。

4.1. 创建工程,和上面的一样

4.2. pom

创建成功后,添加 shiro-spring-boot-web-starter ,这个依赖可以代替之前的 shiro-web 和 shiro-spring 两个依赖,pom.xml 文件如下:

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

4.3. 创建 Realm

这里的 Realm 和前面的一样,我就不再赘述。

4.4. 配置 Shiro 基本信息

接下来在 application.properties 中配置 Shiro 的基本信息:

shiro:sessionManager:sessionIdCookieEnabled: truesessionIdUrlRewritingEnabled: trueunauthorizedUrl: /unauthorizedurlweb:enabled: truesuccessUrl: /indexloginUrl: /login#  第一行表示是否允许将sessionId 放到 cookie 中
#  第二行表示是否允许将 sessionId 放到 Url 地址拦中
#  第三行表示访问未获授权的页面时,默认的跳转路径
#  第四行表示开启 shiro
#  第五行表示登录成功的跳转页面
#  第六行表示登录页面

4.5. 配置 ShiroConfig

package com.gblfy.config;import com.gblfy.realm.MyRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author gblfy* @Description https://www.gblfy.com* @Date 2019/12/8 15:4** 在这里进行 Shiro 的配置*  Shiro 的配置主要配置 3 个 Bean 。**  1. 首先需要提供一个 Realm 的实例*  2. 需要配置一个 SecurityManager,在 SecurityManager 中配置 Realm*  3. 配置一个 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等*/
@Configuration
public class ShiroConfig {@BeanMyRealm myRealm() {return new MyRealm();}@BeanDefaultWebSecurityManager securityManager() {DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(myRealm());return manager;}@BeanShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();definition.addPathDefinition("/doLogin", "anon");definition.addPathDefinition("/**", "authc");return definition;}
}

这里的配置和前面的比较像,但是不再需要 ShiroFilterFactoryBean 实例了,替代它的是 ShiroFilterChainDefinition ,在这里定义 Shiro 的路径匹配规则即可。

这里定义完之后,接下来的登录接口定义以及测试方法都和前面的一致,我就不再赘述了。大家可以参考上文。

五、总结

本文主要向大家介绍了 Spring Boot 整合 Shiro 的两种方式,一种是传统方式的 Java 版,另一种则是使用 Shiro 官方提供的 Starter,两种方式,不知道大家有没有学会呢?

本文案例,我已经上传到 码云,欢迎大家 star:
https://gitee.com/gb_90/SpringBoot2_Practical_Column

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图

FancyCoverFlow重写了gallery实现了画廊特效。这里记录下具体的使用方法&#xff1a;1 在布局文件中添加控件android:id"id/fancy_cover"android:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginTop"…

5G精华问答 | 5G关键技术解读

5G的概念虽然很早就已经提出&#xff0c;但是对于大多数用户来说&#xff0c;真正听到并且对5G有了初步的了解还是在今年。今天就让我们来看看关于5G的精华问答吧。1Q&#xff1a;5G标准是怎么来的&#xff0c;由谁制定的&#xff1f;A&#xff1a;5G是由“第三代合作伙伴计划组…

关于python的保留字_Python中的保留字

原博文 2020-01-29 20:03 − Python 包含的保留字可以执行如下命令进行查看&#xff1a; →import keyword →keyword.kwlist [False, None, True, and, as, assert, break, class, continue, d...01000 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设…

Spring Boot2 整合 Ehcache

用惯了 Redis &#xff0c;很多人已经忘记了还有另一个缓存方案 Ehcache &#xff0c;是的&#xff0c;在 Redis 一统江湖的时代&#xff0c;Ehcache 渐渐有点没落了&#xff0c;不过&#xff0c;我们还是有必要了解下 Ehcache &#xff0c;在有的场景下&#xff0c;我们还是会…

传奇谢幕,回顾霍金76载传奇人生

摘要&#xff1a; 根据外媒报道&#xff0c;著名物理学家斯蒂芬威廉霍金&#xff08;Stephen William Hawking&#xff09;去世&#xff0c;享年76岁&#xff0c;霍金的家人已经确认了这一消息。 原文地址&#xff1a;http://click.aliyun.com/m/43771/ “在爱因斯坦生日这天&a…

数据中台与苏秦挂六国相印

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 一一来源 | 边缘计算社区阅读本文前先思考一个问题&#xff1a;数据中台如何创造更多价值&#xff1f;1梁宁看中台——什么是数据中台梁宁老师是阿里巴巴的湖畔大学产品模块学术主任、百度集团顾问。有人问梁宁&#xff0c;中…

python中函数定义_Python中函数的定义与使用

原博文 2020-02-27 16:46 − 一、函数基本定义 定义函数的目的是为了让一段代码可以被重复使用 函数定义的语法&#xff1a; def 函数名([参数&#xff0c;参数.....]): 函数主体代码(多行代码) [return [返回值]]注&#xff1a;函数中的函数体都通过缩进来定义 实例一&#xf…

非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文

非计算机专业算法分析与设计教学改革论文【摘要】算法分析与设计不仅是计算机专业的核心课程&#xff0c;同时也是与计算机有关的非计算机专业的专业课。本人针对非计算机专业学生在学习过程中存在的若干问题&#xff0c;就教学内容、教学手段和考核方式等方面提出了改革措施。…

阿里SaaS性能测试平台PTS最佳实践

摘要&#xff1a; PTS&#xff08;Performance Testing Service&#xff09;是web化的卓越的SaaS性能测试平台&#xff0c;具备强大的分布式压测能力&#xff0c;可方便的模拟海量用户的真实业务场景。PTS铂金版在功能上强调页面可视化编排&#xff0c;目前也在快速迭代中&…

go 根据输入类型执行对应的方法_安全很重要:Go项目的安全评估技术

在今年夏天我们对Kubernetes的评估成功之后&#xff0c;我们收到了大量Go项目的安全评估需求。为此&#xff0c;我们将在其他编译语言中使用过的安全评估技术和策略调整适配到多个Go项目中。我们从了解语言的设计开始&#xff0c;识别出开发人员可能无法完全理解语言语义特性的…

云化要求下,数据库架构如何演进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者简介&#xff1a;王涛SequoiaDB联合创始人&CTO如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构…

看阿里云如何为直播用户营造临场沉浸感?

摘要&#xff1a; 2016年可以说是VR元年&#xff0c;从Facebook的Oculus&#xff0c;HTC的Vive到Sony的PS VR&#xff0c;层出不穷的VR设备和VR内容让用户逐步开始体验到了虚拟现实的魅力。VR视频和VR直播俨然已经成为了展览会议、活动赛事的标配&#xff0c;甚至向婚庆、新闻、…

html计时器组件,vue 计时器组件的实现代码

整理文档&#xff0c;搜刮出一个vue 计时器组件的代码&#xff0c;稍微整理精简一下做下分享。:sendSync"sendSync":autoStart"autoStart":defaultVal"defaultVal">{{countString}}export default {data() {return {isStart: false,globalTim…

苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

map语法获取index_复习Elasticsearch的基础语法(一)

之前实践过的Elasticsearch到现在基本上的语法我都回忆不起来了&#xff0c;所以准备写篇文章帮助自己复习一下&#xff0c;没有什么技术含量的分享&#xff0c;但是也分享给想初步了解的朋友们。就不介绍Elasticsearch了&#xff0c;直接进入正文(手动分割线0.0)-------------…

知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?

摘要&#xff1a; 背景简介 为了不断提升搜索体验&#xff0c;神马搜索的知识图谱与应用团队&#xff0c;一直在不断探索和完善图谱的构建技术。其中&#xff0c;开放信息抽取&#xff08;Open Information Extraction&#xff09;&#xff0c;或称通用信息抽取&#xff0c;旨在…

如何通过Dataworks禁止MaxCompute 子账号跨Project访问

摘要&#xff1a; 之前有很多DataWorks用户问MaxCompute访问权限问题&#xff0c;比如子账号为什么可以增删查别人在别的项目创建的表&#xff0c;即使这个子账号并没有加入那个项目 。 今天手把手教大家实现子账号授权并关闭跨Project的数据访问权限。 原文链接&#xff1a;ht…

填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!

现如今&#xff0c;随着社会化和城市化进程的不断加快&#xff0c;快递、外卖等行业日益成熟&#xff0c;然而人工成本高、管理难度大等一系列问题成为该领域不得不思考的问题。那么&#xff0c;如何释放出更强大的服务信号&#xff0c;让“最后一公里”的窘境有一个全新的转变…

武汉大学计算机学院的李明,李明副研究员

个人简介&#xff1a;李明&#xff0c;武汉大学&#xff0c;计算机学院&#xff0c;副研究员&#xff0c;德国KIT的MRT实验室访问学者&#xff0c;在Audi无人驾驶项目中负责定位和地图部分&#xff0c;主要研究方向是多传感器集成、激光雷达数据处理、行驶环境感知方向的工作&a…

eureka集群只注册一个_一、Spring Cloud Eureka服务注册中心

Sping bootEureka是服务中心&#xff0c;管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装。在dubbo的使用中我们通常使用zookeeper作为注册中心。在这里spring cloud使用Eureka&#xff0c; 用一个标准的sp…