一、本阶段成果
实现shiro+springboot整合登录功能,用于账户系统微服务
二、技术介绍
What is Apache Shiro?
Apache Shiro (pronounced “shee-roh”, the Japanese word for ‘castle’) is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management and can be used to secure any application - from the command line applications, mobile applications to the largest web and enterprise applications.
Shiro provides the application security API to perform the following aspects (I like to call these the 4 cornerstones of application security):
Authentication - proving user identity, often called user ‘login’.
Authorization - access control
Cryptography - protecting or hiding data from prying eyes
Session Management - per-user time-sensitive state
Shiro also supports some auxiliary features, such as web application security, unit testing, and multithreading support, but these exist to reinforce the above four primary concerns.
翻译过来核心关键字:Apache Shiro是一种功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理,可用于保护任何应用程序的安全-从命令行应用程序,移动应用程序到最大的Web和企业应用程序。
主要功能:
- 身份验证-证明用户身份,通常称为用户“登录”。
- 授权-访问控制
- 密码术-保护或隐藏数据以防窥视
- 会话管理-每个用户的时间敏感状态
Shiro架构设计:
-
Subject:主体,可以看到主体可以是任何可以与应用交互的 “用户”;
-
SecurityManager:相当于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher;是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。
-
Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
-
Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
-
Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等;由用户提供;注意:Shiro 不知道你的用户 / 权限存储在哪及以何种格式存储;所以我们一般在应用中都需要实现自己的 Realm;
-
SessionManager:如果写过 Servlet 就应该知道 Session 的概念,Session 呢需要有人去管理它的生命周期,这个组件就是 SessionManager;而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境、EJB 等环境;所以呢,Shiro 就抽象了一个自己的 Session 来管理主体与应用之间交互的数据;这样的话,比如我们在 Web 环境用,刚开始是一台 Web 服务器;接着又上了台 EJB 服务器;这时想把两台服务器的会话数据放到一个地方,这个时候就可以实现自己的分布式会话(如把数据放到 Memcached 服务器);
-
SessionDAO:DAO 大家都用过,数据访问对象,用于会话的 CRUD,比如我们想把 Session 保存到数据库,那么可以实现自己的 SessionDAO,通过如 JDBC 写到数据库;比如想把 Session 放到 Memcached 中,可以实现自己的 Memcached SessionDAO;另外 SessionDAO 中可以使用 Cache 进行缓存,以提高性能;
-
CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能
-
Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密 / 解密的。
三、整体设计
账户系统微服务提供用户登录和操作信息的功能,需要控制用户可以进行的操作,所以使用shiro来进行登录管理,整体为三步骤:
- 用户登录保存session到Shiro
- 用户发起操作请求,验证携带的session
- 验证通过执行操作
四、代码实现
完整代码:SpringBoot+Shiro整合样例
五、总结与感悟
- 在选择使用哪一种认证框架的时候做过相关调研,目前这两种使用的比较多:Shiro和Spring Security
两者比较结果:(参考:https://www.jianshu.com/p/0891b2279c65 )
a) Shiro比Spring更容易使用,实现和最重要的理解
b) Spring Security更加知名的唯一原因是因为品牌名称
c) “Spring”以简单而闻名,但讽刺的是很多人发现安装Spring Security很难,然而Spring Security却有更好的社区支持
d) Apache Shiro在Spring Security处理密码学方面有一个额外的模块
e) Spring-security 对spring 结合较好,如果项目用的springmvc ,使用起来很方便
f) Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行
我第一次做这种身份验证,所以选择了难度较低的Shiro,这也足以满足我的需求。 - Shiro的优点
- 简单的身份认证, 支持多种数据源
- 对角色的简单的授权, 支持细粒度的授权(方法级)
- 支持一级缓存,以提升应用程序的性能;
- 内置的基于 POJO 企业会话管理, 适用于 Web 以及非 Web 的环境
- 非常简单的加密 API
- 不跟任何的框架或者容器捆绑, 可以独立运行
- Shiro认证过程
创建SecurityManager -> 主体提交认证 -> SecurityManager认证 -> Authenticator认证 -> Realm验证 - Shiro授权过程
创建SecurityManager ->主体授权 -> SecurityManager授权 -> Authorizer授权 ->Realm获取权限数据 - 对所用框架的理解要足够深,如果有能力去读读源码(我还不行,我一点点继续努力吧)
六、下一阶段目标
实现派单引擎,重点功能:并发和事务