SpringBoot集成Apache Shiro

笔者因为项目转型的原因,对Apache Shiro安全框架做了一点研究工作,故想写点东西以便将来查阅。之所以选择Shiro也是看了很多人的推荐,号称功能丰富强大,而且易于使用。实践下来的确如大多数人所说简约优美,小巧精悍。

介绍demo项目前,简单说明一下Shiro框架的特性。

1.  Apache Shiro Features  

SpringBoot集成Apache Shiro

 

从上图可以看出Shiro具备应用程序安全框架的四大基石”:身份验证、授权、会话管理和密码。

Authentication有时被称为‘登录’,这是需要明确用户是谁

Authorization访问控制,即确定‘谁’对‘什么’有访问权限。

Session Management管理特定用户的会话,即使在非web或EJB应用程序中也是如此。

Cryptography使用加密算法保持数据安全,但易于使用。

 

在不同的应用程序环境中,还有更多的特性来支持和增强这些关注点,特别是:

Web SupportShiro的Web支持API帮助轻松地保护web应用程序。

Caching缓存是ApacheShiro的API中的第一等公民,以确保安全操作同时保持快速和高效。

ConcurrencyApacheShiro支持具有并发特性的多线程应用程序。

Testing提供测试支持,以帮助编写单元和集成测试,并确保代码如预期的安全。

Run as允许用户假定另一个用户的身份(如果允许的话)的特性,有时在管理场景中很有用。

Remember Me记住用户在会话中的身份,这样他们就只需要在强制的情况下输入口令登录。

 

2. High-Level Overview

Shiro的体系结构有三个主要概念:Subject、SecurityManager和Realms。下图展现了它的运行原理,

SpringBoot集成Apache Shiro

主题:主题本质上是当前正在执行的用户。虽然“用户”这个词通常意味着一个人,一个主题可以是一个人,但它也可以代表一个第三方服务、守护进程帐户、cron作业或任何类似的东西-基本上是任何当前与软件交互的东西。Subject实例都绑定到(并且需要)一个SecurityManager。当与主题交互时,这些交互转化为与SecurityManager的特定主题交互。

 

SecurityManagerSecurityManager是Shiro体系结构的核心,它将其内部安全组件协调在一起形成一个对象图。然而,一旦为应用程序配置了SecurityManager及其内部对象图,它通常会被单独使用,应用程序开发人员将几乎所有的时间都花在Subject API上。当与一个主题交互时,实际上是幕后的SecurityManager为任何主题安全操作做了所有繁重的工作。

 

领域:领域充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当涉及到实际与用户帐户等安全相关的数据交互以执行身份验证(登录)和授权(访问控制)时,Shiro从一个或多个为应用程序配置的领域中查找数据。从这个意义上说,领域本质上是一个特定于安全的DAO:它封装数据源的连接细节,并根据需要将相关数据提供给Shiro。配置Shiro时,必须指定至少一个用于身份验证和/或授权的域。SecurityManager可以配置多个Realm,但至少需要一个。Shiro提供了开箱即用的领域,以连接到许多安全数据源(也称为目录),如LDAP、关系数据库(JDBC)、INI和属性文件等文本配置源。

 

3. Detailed Architecture

SpringBoot集成Apache Shiro

 

4. 过滤器

当 Shiro 被运用到 web 项目时,Shiro 会自动创建一些默认的过滤器对客户端请求进行过滤。以下是 Shiro 内置过滤器:

过滤器简称

 

对应的 Java 类

 

anon

 

org.apache.shiro.web.filter.authc.AnonymousFilter

 

authc

 

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

 

authcBasic

 

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

 

perms

 

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

 

port

 

org.apache.shiro.web.filter.authz.PortFilter

 

rest

 

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

 

roles

 

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

 

ssl

 

org.apache.shiro.web.filter.authz.SslFilter

 

user

 

org.apache.shiro.web.filter.authc.UserFilter

 

logout

 

org.apache.shiro.web.filter.authc.LogoutFilter

 

 

项目中常用的解释一下,

/test/**=anon ---所有url 可以匿名访问

/test/**=authc ---url需要认证才能访问

/test/**=perms[user:add]  ---url需要认证用户拥有 user:add 权限才能访问

/test/**=roles[admin]  ---url需要认证用户拥有 admin 角色才能访问

/test/**=user ---url 需要认证或通过记住我认证才能访问

 

5. DEMO

开发工具为Eclipse+Maven,新建Springboot项目,版本号为1.5.14

模板引擎使用Thymeleaf

为了突出shiro,数据访问层略过,服务层模拟查询数据,Realm里面硬编码权限和角色信息简化代码。

整个系统的核心在于两个class, 项目结构如下,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfpwd.html