最近在做一个项目,很大的一个项目,授权这一部分由我负责,所以还是决定站在巨人的肩膀上,看看有没有安全框架。一下确实有很多,像springsecurity 3.x ,spring的acegi,apache shiro等等,前两个都是依赖于spring 的,而apache shiro是在开源社区比较火的一个框架,用的人也比较多,资料也很多,所以还是采用第三方的apache shiro。
那么我们就说一下什么是安全框架?
安全框架,包括了登录验证,用户授权… ,如果一个系统没有这些东西,那么将完成了的系统发布到网上,后果简直不可以想象。那么武我们的安全框架,说白了,就是保证咱们的系统的安全的,进入系统要进行登录验证,凭据通过以后,我们还要对用户进行授权,因为咱们的系统不可能所有的人都可以看到所有的所有的操作页面,应该更加的职责单一化。
我们来看一下shiro框架,Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。这不就是我们想要的嘛,而且Shiro的API也是非常简单。
Subject
Subject一词是一个安全术语,其基本意思是“当前的操作用户”。称之为“用户”并不准确,因为“用户”一词通常跟人相关。在安全领域,术语“Subject”可以是人,也可以是第三方进程、后台帐户(DaemonAccount)、定时作业(CornJob)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
SecurityManager
Subject的“幕后”推手是SecurityManager。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。它是Shiro框架的核心,充当“保护伞”,引用了多个内部嵌套安全组件,它们形成了对象图。但是,一旦SecurityManager及其内部对象图配置好,它就会退居幕后,应用开发人员几乎把他们的所有时间都花在SubjectAPI调用上。
一个应用几乎总是只有一个SecurityManager实例。它实际是应用的Singleton(尽管不必是一个静态Singleton)。跟Shiro里的几乎所有组件一样,SecurityManager的缺省实现是POJO,而且可用POJO兼容的任何配置机制进行配置- 普通的Java代码、SpringXML、YAML、.properties和.ini文件等。基本来讲,能够实例化类和调用JavaBean兼容方法的任何配置形式都可使用。
Realms
Shiro的第三个也是最后一个概念是Realm。Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当与像用户帐户这类安全相关数据进行交互,执行认证(登录)和授权(访问控制)时,Shiro会从应用配置的Realm中查找很多内容。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现,象其他内部组件一样,由SecurityManager来管理如何使用Realms来获取安全的身份数据。
Shiro完整架构图:
Authenticator:认证
认证就是核实用户身份的过程。对“Who are you ?”进行核实。通常涉及用户名和密码。
这个组件负责收集principals 和 credentials,并将它们提交给应用系统。如果提交的 credentials 跟应用系统中提供的 credentials吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。
Authorizer :授权
授权实质上就是访问控制。身份份验证通过后,由这个组件控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。
Shiro采用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和permission 的聚合体。
SessionManager:
Shiro为任何应用提供了一个会话编程范式,保证了独立性,对容器没有依赖。所以,对于使用会话的应用开发来说,不必被迫使用Servlet或EJB容器了。或者,如果正在使用这些容器,现在也可以选择在任何层统一一致的使用会话API,取代Servlet或EJB机制。
CacheManager:对Shiro的其他组件提供缓存支持。