1、shiro是什么?

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

Authentication:身份认证/登录,验证用户是不是拥有相应的身份;

Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;

Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

Web Support:Web支持,可以非常容易的集成到Web环境;

Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

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

Testing:提供测试支持;

Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

注意:Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可。

2、Shiro的工作流程

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。

Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。

也就是说对于我们而言,最简单的一个 Shiro 应用:

应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;

我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。

Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。

3、Spring Boot 集成 Shiro

1、添加依赖

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

2、shiro核心配置

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

继承FormAuthenticationFilter核心类(注意添加@Configuration)

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

重写shiroFilter方法

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

加载自定义的Realm到securityManager中

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

自定义Realm类(继承AuthorizingRealm类)Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

重写doGetAuthenticationInfo方法做登录检验

Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

重写doGetAuthorizationInfo做权限过滤(每次触发操作权限时候,都会调用这个方法查询当前用户的角色和权限列表)

 

shiro 调用权限验证的三种方式

1、注解

在需要权限检验的方法上添加@RequiresPermissions("person_view")Spring Boot 学习第六篇(Spring Boot 集成 Shiro)

2、调用方法

SecurityUtils.getSubject().checkPermission("person_view");

3、页面标签

需要先加载shiro标签库

<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>

然后使用标签库判断

<shiro:hasPermission name="person_view">

</shiro:hasPermission>

相关文章: