Apache shiro简介
Apache Shiro是Java的一个安全框架。Shiro提供了认证、授权、加密、会话管理、与 Web 集成、缓存等一系列功能,相比于Spring Security,可能没有 Spring Security 做的功能强大,但它更加简单实用。
shiro的功能:
- 对用户的身份验证
- 用户的访问权限控制,如:用户是否是一个安全角色;用户是否要访问资源的权限
- 在非Web或EJB容器环境下可以使用 Session API
- 在session的生命周期内,authentication, access control作出响应
- 支持单点登录功能和“rememberMe”功能(记住用户的登录信息)
Apache Shiro Features 特性
shiro提供了四大基本安全功能,认证、授权、session管理、加密,及shiro支持的特性:
Authentication: 身份认证/登录,验证用户登录名和密码是否匹配,是不是拥有相应的身份;
Authorization: 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即:1.验证某个用户是否拥有某个角色;2.验证某个用户是否拥有访问对某个资源的权限;
Session Manager: 会话管理,即用户登录后在没有退出之前,所有信息都在session中;
Cryptography: 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
其他特性:
Web Support:Web 支持,可以非常容易的集成到 Web 环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限可以添加到缓存中不必每次去查;
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,一次登录后,下次再来的话不用登录了。
Apache shiro的核心概念
Shiro框架有三个主要的理念:Subject,SecurityManager和 Realm,如下图所示:
Subject:主体,代表了当前 “用户”,这个用户不一定是具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager 处理,SecurityManager 才是实际的执行者;
在shiro中通过org.apache.shiro.SecurityUtils;来获取Subject对象
Subject subject = SecurityUtils.getSubject();
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject,是 Shiro 的核心,它负责与后边介绍的其他组件进行交互;
Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限), SecurityManager 要验证用户身份,则需要从 Realm 获取相应的用户信息确定其身份是否合法;也需要从 Realm 得到用户相应的角色/权限进行验证用户是否具有操作权限;可以把 Realm 看成 DataSource,即安全数据源。
一个简单的shiro应用,
- 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager进行操作;
- 把Realm注入到SecurityManager 中 ,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
shiro并没有提供Realm的实现,需要继承org.apache.shiro.realm.AuthorizingRealm这个抽象类,实现doGetAuthenticationInfo()和doGetAuthorizationInfo()方法。
shiro的内部架构
shiro的内部架构如图所示:
参考: