前言:这次写有关Shiro框架的一系列博客,为自己加油吧!
Shiro是什么?
Shiro是一个权限框架,实现系统权限的控制,如同一个系统登录,管理员能控制什么,使用什么资源(资源可以是某个按钮,菜单,功能),而用户登录后能使用什么资源。
Shiro主要有认证,授权,加密,会话管理这几块,而且Shiro框架不仅BS试用,CS项目也可以使用Shiro框架,是一款非常优秀的权限框界面。
类似的有Spring 的Security,也是权限框架,不过比较依赖Spring,但是有人说Security比Shiro要强大,Shiro比较灵活。
Shiro能干什么?(功能点)
Primary Concerns(主要功能)
Authentication :身份验证/登录,验证用户的身份。
Authorization:授权,权限认证,确定用户能干什么,不能干什么。
SessionManager :会话管理,用户登录一次就是一次会话,没有退出前,他的所有信息都在会话中。
Cryptography:加密,保护数据安全性,比对密文而不是铭文。
Supporting Features(支撑功能)
Web support:web支持,容易集成到web环境
Caching:缓存,保存角色,权限信息,不用每次都去查
Concurrency:多线程应用并发,一个线程中开启另一个线程,能把权限传播过去
Testing:测试支持
Run As :允许一个用户假装一个用户进行访问
Remember Me :记住我,登陆一次,下次再来不用登陆
Shrio 不回去维护用户,维护权限,这些我们自己去做,然后通过接口注入给Shiro
Shiro长得咋样?
Application code(应用程序代码调用的都是Subject),可以看出Subject是对外API的核心。
Subject:
主体,代表了当前用户,用户不一定是具体的人,也可以是与之交互的任何东西,如网络爬虫,机器人等= =,所有的Subject都绑定到SecurityManager,Subjecj就是一个门面,SecurityManager 才是实际的执行者,这是一个慈禧与光绪的故事....
SecurityManager :
安全管理器,所有相关操作都会与SecurityManager 交互,且她管着所有Subject,可以看出他是Shiro的核心,负责与其他组件的交互,类似于SpringMVC的DispatcherServlet。
Realm:
域,Shiro从Realm获取安全数据(用户,角色,权限)SecurityManager 从Realm里验证用户的身份是否合发,这个由我们实现的。
简单应用Shiro基本要
1 代码调用Subject来进行授权认证,而Subject 委托给SecurityManager。
2 给SecurityManager注入Realm,让SecurityManager对用户和权限进行判断。
Shiro的架构
最上面一行,说的是可以通过
C++,C#编程语言,PHP,Ruby脚本语言,Felx,Silvelight 前端技术,WebMVC前端框架,最后是其他独立程序,这些都通过使用Subject用户。
Subject :主体,可以看到主体可以是任何可以与应用交互的“用户”;
SecurityManager :
相 当 于 SpringMVC 中 的 DispatcherServlet 或 者 Struts2 中 的FilterDispatcher;是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。
Authenticator :
认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
Authrizer:
授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
Realm :
可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等;不知道你的用户/权限存储在哪及以何种格式存储;所以我们一般在应用中都需要实现自己的 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 提高了一些常见的加密组件用于如密码加密/解密的。
最后一行是数据。
简单的介绍就到这了,下次给大家来个简单例子哈!
————————————————————chenchen——————————————————————