SpringBoot整合Shiro实现权限管理

1.shiro简介:

Shiro是Apache下的一个开源项目,我们称之为Apache Shiro。它是一个很易用与Java项目的的安全框架,提供了认证、授权、加密、会话管理,与 Spring Security 一样都是做一个权限的安全框架,但是与Spring Security 相比,在于 Shiro 使用了比较简单易懂易于使用的授权方式。

1.1 Shiro的功能介绍:

四个核心:登录认证,权限验证,会话管理,数据加密。

六个支持:支持WEB开发,支持缓存,支持线程并发验证,支持测试,支持用户切换,支持”记住我”功能。

• Authentication:身份认证,也可以理解为登录,验证用户身份。

• Authorization:权限验证,也可以理解为授权,验证用户是否拥有某个权 限;即判断用户是否能进行什么操作。

• Session Manager:会话管理,用户登录后就是一次会话,在退出前,用户的所有信息都在会话中。

• Cryptography:数据加密,保护数据的安全性,常见的有密码的加盐加密。

• Web Support:支持Web开发。

• Caching:缓存,Shiro将用户信息、拥有的角色/权限数据缓存,以提高程序效率。

• Concurrency:支持多线程应用的并发验证,即在一个线程中开启另一个线程,Shiro能把权限自动传播过去。

• Testing:提供测试支持。

• Run As:允许一个用户以另一个用户的身份进行访问;前提是两个用户运行切换身份。

• Remember Me:记住我,常见的功能,即登录一次后,在指定时间内免登录。

1.2 Shiro 架构介绍:

三个角色:当前用户 Subject,安全管理器 SecurityManager,权限配置域 Realm。

• Subject:代表当前用户,提供了很多方法,如login和logout。Subject 只是一个门面,与Subject的所有交互都会委托给SecurityManager,SecurityManager才是真正的执行者;

• SecurityManager:安全管理器;Shiro的核心,它负责与Shiro的其他组件进行交互,即所有与安全有关的操作都会与SecurityManager 交互;且管理着所有的 Subject;

• Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限),SecurityManager 要验证用户身份,必需要从 Realm 获取相应的用户信息,判断用户身份是否合法,判断用户角色或权限是否授权。

其完整的架构图为:

2.SpringBoot整合Shiro

整合Shiro核心分为一下三步:

第一步:创建实体类,引入jpa,运行项目进行自动建立对象表,并添加上数据

第二步:创建自定义安全数据源Realm:负责用户登录认证,用户操作授权。

第三步:整合Shiro配置类:配置拦截规则,生命周期,安全管理器,安全数据源,等。

2.1 第一步:配置数据源,创建对应表

1.创建SpringBoot-shiro项目,并引入依赖

org.apache.shiro

shiro-core

1.4.0

org.apache.shiro

shiro-spring

1.4.0

org.apache.shiro

shiro-web

1.4.0

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

5.1.36

com.alibaba

druid

1.1.4

2.配置application.yml

3.创建3个实体类,并添加对应jpa注解

第一个User实体类,用于保存用户的基本信息

第二个Role实体类,用于存放用户的角色信息

第三个Permission实体类,用于存放角色的权限信息

注:以上使用到的数据持久层框架为jpa,使用到的数据源为druid,运行项目后,打开数据库,可以看到对应的表已经生成了(首先要有spring_shiro数据库)

最后向其中添加对应的数据,这一步就完成了

user表:

role表:

permission表

2.2 第二步:自定义安全数据源Realm

Shiro从Realm中获取安全数据源(用户,角色,权限等),然后SecurityManager根据Realm中获取的安全数据源进行对比验证,然后判定用户或角色是否有权限。

Shiro 支持多个Realm。同时也有不同的认证策略:

• FirstSuccessfulStrategy: 只要有一个Realm成功就返回,后面的忽略;

• AtLeastOneSuccessfulStrategy: 只要有一个Realm成功就通过,返回所有认证成功的信息,默认;

• AllSuccessfulStrategy: 必须所有Realm都成功才算通过

那么下面我们来自定义一个Realm数据源吧。

从数据库中获取安全数据源

由于接下来自定义的Realm是从我们数据库里面提取安全数据源,所以接下来我们将数据持久层的架子和服务层的架子搭建好,提取对应的数据。

Repository层的UserRepository,这里自定义了一个方法根据用户名获取数据

注意由于使用框架为jpa,所以这里像这样写即可拿取到数据,不用写实现类,具体里面的方法规则可以自己查阅资料,这里不做过多讲解,如果不理解这种写法,可以向这样直接写sql语句

注:这里用到的持久层框架也可以尝试着用其他框架,都是从数据库中拿到数据。

2.创建对应Service层

实现类如下:

这一步可以省略,但为了规范我还是加上了。

3.创建自定义Realm

创建CustomRealm继承AuthorizingRealm,具体代码如下:

授权配置:

认证配置:

2.3 第三步:整合shiro的配置

这里分为四步:

第一步:配置Shiro拦截器,指定URL请求的权限。首先静态资源和登录请求匿名访问,然后是用户登出操作,最后是所有请求都需身份认证。Shiro拦截器优先级是从上到下,切勿将/**=authc,放在前面。

第二步:配置Shiro生命周期处理器,

第三步:配置自定义Realm,负责身份认证和授权。

第四步:配置安全管理器SecurityManager,Shiro的核心。

具体代码如下:

第一步:配置Shiro拦截器

第二步:配置shiro的生命周期

第三步:配置刚刚自定义好的CustomRealm

第四步:配置SecurityManager

如果数据库的用户的密码是通过加密算法进行加密的,需要配置对应的加密算法

这里我使用的是MD5加密算法,进行一次加密,并且加入对应盐,我使用的盐为“mengxin” 字符串,可以使随机数,时间戳等,看个人喜好,将盐加入到上面的自定义的认证配置中。即下面的参数3打开,并设置对应参数

2.4.验证

第一步,添加thymeleaf的依赖,并在application添加对应映射配置

org.springframework.boot

spring-boot-starter-thymeleaf

application.yml中:

第二步:在其Templates中添加对应页面

success.html: 登录成功的页面

403.html 登录失败的页面

然后下static中添加login.html页面

第三步:修改数据库密码

由于我这里加了加密算法和盐,所以要将数据库中的密码进行加密

编写MD5Util加密算法工具类

运行这个main方法将数据库中的密码进行加密,然后手动更新数据库密码:

第四步:编写测试接口:

启动项目,在浏览器中输入以localhost:8888/user/getUser (可随便输)

可以看到被拦截到了登录页面:

登录成功可以看到成功返回到了success.html的页面:

打开控制台可以看到控制台的输出:

切换到另一个账号登录,可一看到控制台的输出:

登录失败可以看到返回到了失败403.html的页面:

以上就是SpringBoot整合Shiro的全过程,赶紧去试一试吧。下面扩展一下shiro通过注解的方式对接口进行授权验证的过程。

3.shiro通过注解进行授权

若要开启shiro注解,需要添加如下配置

接下来模拟两个场景:

场景一:编写一个接口,该接口的主体必须具备admin角色才能访问

在templates中添加admin.html页面:

打开浏览器,登录账号mengxin,访问改接口,可以看到以下信息

切换账号dalao,访问该接口,可以看到此接口能正确访问。

场景二:编写一个接口,该接口的主体必须具备delete,uodate权限才能访问

启动项目,打开浏览器,登录mengxin账号(只有select权限),访问该接口

切换dalao账号,登录后访问该接口:

以上就是shiro注解对接口进行授权的过程,是不是很简单方便呢?

欢迎关注本萌新的微信公众号:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181107G13H9X00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券