安全框架 Shiro 和 Spring Security 如何选择?

 
640?wx_fmt=jpeg

安全框架java

安全框架,简单说是对访问权限进行控制,应用的安全性包括用户认证(Authentication)和用户受权(Authorization)两个部分。web

用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户可否访问该系统。sql

用户认证通常要求用户提供用户名和密码,系统经过校验用户名和密码来完成认证过程。数据库

用户受权指的是验证某个用户是否有权限执行某个操做。在一个系统中,不一样用户所具备的权限是不一样的。好比对一个文件来讲,有的用户只能进行读取,而有的用户能够进行修改。编程

通常来讲,系统会为不一样的用户分配不一样的角色,而每一个角色则对应一系列的权限。  缓存

Shiro安全

Apache Shiro是一个强大且易用的Java安全框架,可以很是清晰的处理身份验证、受权、管理会话以及密码加密。cookie

利用其易于理解的API,能够快速、轻松地得到任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。网络

Shiro 主要分为两个部分就是认证和受权,在我的感受来看就是查询数据库作相应的判断而已,Shiro只是一个框架而已,其中的内容须要本身的去构建,先后是本身的,中间是Shiro帮咱们去搭建和配置好的。架构

Spring Security

Spring Security是一个可以为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。

它提供了一组能够在Spring应用上下文中配置的Bean,充分利用了Spring IoC(控制反转),DI( 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减小了为企业系统安全控制编写大量重复代码的工做。

众所周知,想要对对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。因此Spring Security在咱们进行用户认证以及授予权限的时候,经过各类各样的拦截器来控制权限的访问,从而实现安全。

它全部的架构也是基于认证和受权这两个核心功能去实现的。

Shiro主要功能

三个核心组件:Subject, SecurityManager 和 Realms。

Subject:即“当前操做用户”。可是,在Shiro中,Subject这一律念并不只仅指人,也能够是第三方进程、后台账户(Daemon Account)或其余相似事物。它仅仅意味着“当前跟软件交互的东西”。

Subject表明了当前用户的安全操做,SecurityManager则管理全部用户的安全操做。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro经过SecurityManager来管理内部组件实例,并经过它来提供安全管理的各类服务。

Realm:Realm充当了Shiro与应用安全数据间的“桥梁”或者“链接器”。也就是说,当对用户执行认证(登陆)和受权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的链接细节,并在须要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)受权。配置多个Realm是能够的,可是至少须要一个。

Shiro内置了能够链接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、相似INI的文本配置资源以及属性文件等。若是缺省的Realm不能知足需求,你还能够插入表明自定义数据源的本身的Realm实现。

Spring Security主要功能

Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,而且在应用程序处理该请求以前进行某些安全处理。

Spring Security提供有若干个过滤器,它们可以拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而加强安全性。根据本身的须要,可使用适当的过滤器来保护本身的应用程序。

若是使用过Servlet过滤器且令其正常工做,就必须在Web应用程序的web.xml文件中使用<filter> 和<filter-mapping>元素配置它们。虽然这样作能起做用,可是它并不适用于使用依赖注入进行的配置。

FilterToBeanProxy是一个特殊的Servlet过滤器,它自己作的工做并很少,而是将本身的工做委托给Spring应用程序上下文 中的一个Bean来完成。被委托的Bean几乎和其余的Servlet过滤器同样,实现javax.servlet.Filter接 口,但它是在Spring配置文件而不是web.xml文件中配置的。

实际上,FilterToBeanProxy代理给的那个Bean能够是javax.servlet.Filter的任意实现。这能够是 Spring Security的任何一个过滤器,或者它能够是本身建立的一个过滤器。可是正如本书已经提到的那样,Spring Security要求至少配置四个并且可能一打或者更多的过滤器。

Shiro特色

一、易于理解的 Java Security API;

二、简单的身份认证(登陆),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);

三、对角色的简单的签权(访问控制),支持细粒度的签权;

四、支持一级缓存,以提高应用程序的性能;

五、内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;

六、异构客户端会话访问;

七、很是简单的加密 API;

八、不跟任何的框架或者容器捆绑,能够独立运行。

Spring Security特色

除了不能脱离Spring,shiro的功能它都有。

并且Spring Security对Oauth、OpenID也有支持,Shiro则须要本身手动实现。Spring Security的权限细粒度更高(还未发现高在哪里)。

注:

OAuth在"客户端"与"服务提供商"之间,设置了一个受权层(authorization layer)。"客户端"不能直接登陆"服务提供商",只能登陆受权层,以此将用户与客户端区分开来。"客户端"登陆受权层所用的令牌(token),与用户的密码不一样。用户能够在登陆的时候,指定受权层令牌的权限范围和有效期。

"客户端"登陆受权层之后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

OpenID 系统的第一部分是身份验证,即如何经过 URI 来认证用户身份。目前的网站都是依靠用户名和密码来登陆认证,这就意味着你们在每一个网站都须要注册用户名和密码,即使你使用的是一样的密码。

若是使用 OpenID ,你的网站地址(URI)就是你的用户名,而你的密码安全的存储在一个 OpenID 服务网站上(你能够本身创建一个 OpenID 服务网站,也能够选择一个可信任的 OpenID 服务网站来完成注册)。

与OpenID同属性的身份识别服务商还有ⅥeID,ClaimID,CardSpace,Rapleaf,Trufina ID Card等,其中ⅥeID通用帐户的应用最为普遍。

总结

我的认为现阶段需求,权限的操做粒度能控制在路径及按钮上,数据粒度经过sql实现。Shrio简单够用。

至于OAuth,OpenID 站点间统一登陆功能,现租户与各个产品间单点登陆已经经过cookies实现,因此Spring Security的这两个功能能够不考虑。

SpringSide网站的权限也是用Shrio作的。

 

 

640?wx_fmt=png