最近在做一个项目,刚好用到了这个安全框架。我之前也木有接触过,也是边做边学。不过这框架还真不错,比起Spring Security那是简单多了。所以推荐给大家!
下面看看这个安全框架吧
一、什么是Shiro
Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:
简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
对角色的简单的授权控制,支持细粒度的签权;
支持一级缓存,以提升应用程序的性能;
内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
不跟任何的框架或者容器捆绑,可以独立运行。
Spring Security —目前是 Java安全框架领域当之无愧的老大,已经非常成熟了;如果使用 Spring框架,可以首选 Spring Security,但是对于单应用来说,Shiro更显简单方便。
二、Shiro的架构介绍
首先,来了解一下Shiro的三个核心组件:Subject,SecurityManager 和 Realms. 如下图:
[img]http://dl2.iteye.com/upload/attachment/0108/1697/2c137b04-7a5b-3c94-b708-927b8379b670.png[/img]
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(DaemonAccount)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,这是一个 Façade接口,=Authenticator+ Authorizer +SessionFactory,Shiro通过SecurityManager来管理内部组件,并通过它来提供安全管理的各种服务。
Realm:Realm充当了Shiro与应用安全数据间的“桥梁”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。
所以在配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。Shiro内置了可以连接大量安全数据源的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
以常用的JdbcRealm 为例,其继承链如下:
[img]http://dl2.iteye.com/upload/attachment/0108/1699/6b45725e-4668-31c7-bbcb-f5b46d196c5a.png[/img]
Shiro完整架构图:
[img]http://dl2.iteye.com/upload/attachment/0108/1701/33816e0c-ffc0-36f7-8243-6994277e77fd.png[/img]
除前文所讲Subject、SecurityManager、Realm三个核心组件外,Shiro主要组件还包括:
Authenticator :认证
认证就是核实用户身份的过程。对“Whoare you ?”进行核实。通常涉及用户名和密码。
这个组件负责收集principals 和 credentials,并将它们提交给应用系统。如果提交的 credentials 跟应用系统中提供的 credentials吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。
Authorizer :授权
授权实质上就是访问控制。身份份验证通过后,由这个组件控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。
Shiro采用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。
SessionManager:
Shiro为任何应用提供了一个会话编程范式,保证了独立性,对容器没有依赖。所以,对于使用会话的应用开发来说,不必被迫使用Servlet或EJB容器了。或者,如果正在使用这些容器,现在也可以选择在任何层统一一致的使用会话API,取代Servlet或EJB机制。
CacheManager:对Shiro的其他组件提供缓存支持。
了解这个架构图,主要对shiro的整体进行把控[size=xx-small][size=x-large][/size][/size]
下面看看这个安全框架吧
一、什么是Shiro
Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:
简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
对角色的简单的授权控制,支持细粒度的签权;
支持一级缓存,以提升应用程序的性能;
内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
不跟任何的框架或者容器捆绑,可以独立运行。
Spring Security —目前是 Java安全框架领域当之无愧的老大,已经非常成熟了;如果使用 Spring框架,可以首选 Spring Security,但是对于单应用来说,Shiro更显简单方便。
二、Shiro的架构介绍
首先,来了解一下Shiro的三个核心组件:Subject,SecurityManager 和 Realms. 如下图:
[img]http://dl2.iteye.com/upload/attachment/0108/1697/2c137b04-7a5b-3c94-b708-927b8379b670.png[/img]
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(DaemonAccount)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,这是一个 Façade接口,=Authenticator+ Authorizer +SessionFactory,Shiro通过SecurityManager来管理内部组件,并通过它来提供安全管理的各种服务。
Realm:Realm充当了Shiro与应用安全数据间的“桥梁”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。
所以在配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。Shiro内置了可以连接大量安全数据源的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
以常用的JdbcRealm 为例,其继承链如下:
[img]http://dl2.iteye.com/upload/attachment/0108/1699/6b45725e-4668-31c7-bbcb-f5b46d196c5a.png[/img]
Shiro完整架构图:
[img]http://dl2.iteye.com/upload/attachment/0108/1701/33816e0c-ffc0-36f7-8243-6994277e77fd.png[/img]
除前文所讲Subject、SecurityManager、Realm三个核心组件外,Shiro主要组件还包括:
Authenticator :认证
认证就是核实用户身份的过程。对“Whoare you ?”进行核实。通常涉及用户名和密码。
这个组件负责收集principals 和 credentials,并将它们提交给应用系统。如果提交的 credentials 跟应用系统中提供的 credentials吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。
Authorizer :授权
授权实质上就是访问控制。身份份验证通过后,由这个组件控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。
Shiro采用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。
SessionManager:
Shiro为任何应用提供了一个会话编程范式,保证了独立性,对容器没有依赖。所以,对于使用会话的应用开发来说,不必被迫使用Servlet或EJB容器了。或者,如果正在使用这些容器,现在也可以选择在任何层统一一致的使用会话API,取代Servlet或EJB机制。
CacheManager:对Shiro的其他组件提供缓存支持。
了解这个架构图,主要对shiro的整体进行把控[size=xx-small][size=x-large][/size][/size]