Shiro权限说明

http://www.infoq.com/cn/articles/apache-shiro

http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/,官网http://shiro.apache.org/

 

Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。

 

 

Spring Security —目前是 Java 安全框架领域当之无愧的老大,已经非常成熟了;如果使用 Spring 框架,可以首选 Spring Security,但是对于单应用来说,Shiro 更显简单方便。

 Shiro权限说明

Shiro 的整体架构:

 

SecurityManager :Shiro 通过它对外提供安全管理的各种服务;

Authorizer :通常涉及用户名和密码;

Authorizer:身份份验证通过后,由这个组件对登录人员进行访问控制的筛查,Shiro 采用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。

Session Manager :这个组件保证了异构客户端的访问,配置简单。它是基于 POJO/J2SE 的,不跟任何的客户端或者协议绑定。

 

 

 

Shiro 是如何工作的:

 Shiro权限说明

Subject 是安全领域术语,除了代表人,它还可以是应用。在单应用中,可将其视为 User 的同义词。

Principal 是 Subject 的标识,一般情况下是唯一标识,比如用户名。

Role 和 Permission 分别代表了不同粒度的权限,从上图中可以看出 Role 的粒度更大些,Permission 代表了系统的原子权限,比如数据的修改、删除权限。对于简单的权限应用,可以不需要 Permission。

Realm 是一个执行者,负责真正的认证和鉴权。

 

实现应用的安全模块的关键在于:定义合适的 role 和 permission,这就需要遵循如下原则:

role 没有实质内容,只是代表一组 permission,目的是为了管理的方便,一般都是动态定义;

permission 一般都是预先定义好的,不允许动态改变,除非源代码改动,它才会变化,它是整个安全模块的基础;

要使 permission 也能动态定义,并非不可能,但是这将使鉴权非常复杂,甚至可能导致鉴权语句遍布整个程序,得不偿失;

当然有一个例外:如果知道 permission 动态定义的规则和鉴权规则,如 Grails 的 fileter 中“${controllerName}:${actionName}:${params.id}”也可实现 permission 的动态定义

 

Shiro 的 Session 是独立的,其目的是做到环境无关性。为了利用 Web 环境中,Shiro 实现了一个直接使用 HttpSession 的 WebSession。

 

 

Shiro的使用

大体上shiro 就是通过配置filter 经过Realm 返回包含了user的AuthenticationInfo 合集。这个合集就是role和Permissions。

 Shiro权限说明

 

权限传递结构为:Permission -> Role -> User

Shiro web配置  

1.web.xml

<listener>     
 <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>  </listener>  
<filter>     
 <filter-name>ShiroFilter</filter-name> 
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>  
</filter> 
<filter-mapping>      
<filter-name>ShiroFilter</filter-name> 
 <url-pattern>/*</url-pattern>      
 
</filter-mapping>
●在的EnvironmentLoaderListener初始化WebEnvironment实例(其中包含的一切,包括SecurityManager的操作,即初始化ini配配置如果您需要获得此WebEnvironment实例,你可以调用WebUtils.getRequiredWebEnvironment(ServletContext)。 
ShiroFilter将使用此WebEnvironment到执行任何过滤请求所有必要的安全操作。
 
●自定义ini文件位置有两种办法
 1). 在web.xml中添加下面代码
<context-param>      
<param-name>shiroConfigLocations</param-name>      
<param-value>YOUR_RESOURCE_LOCATION_HERE</param-value> 
</context-param>

2). 自定义一个IniWebEnvironment实例,并把实例在web.xml中配置好就可以


<context-param>      

<param-name>shiroEnvironmentClass</param-name>     

<param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>  

</context-param>




2. ini配置浅析
ini配置文件主要分为[main] [user] [role] [urls] 四部分
[main]用于配置 SecurityManager 实例
[user] 用于配置用户
[role] 用于配置用户角色
[urls] 用于配置拦截的web路径
 
3. 拦截类型
Filter NameClass
anon(匿名过滤器) org.apache.shiro.web.filter.authc.AnonymousFilter

authc(如果继续操作,需要

做对应的表单验证否则不能通过)

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic(基本http验证过滤,

如果不通过,跳转屋登录页面)

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
logout(登录退出过滤器) org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation(没有session创建过滤器) org.apache.shiro.web.filter.session.NoSessionCreationFilter
perms(权限过滤器) org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port(端口过滤器,可以设置是

否是指定端口如果不是跳转到登录页面)

org.apache.shiro.web.filter.authz.PortFilter

rest(http方法过滤器,可

以指定如post不能进行访问等)

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles(角色过滤器,判断当前

用户是否指定角色)

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl(请求需要通过ssl,

如果不是跳转回登录页)

org.apache.shiro.web.filter.authz.SslFilter

user(如果访问一个已知用户,

比如记住我功能,走这个过滤器)

org.apache.shiro.web.filter.authc.UserFilter
4.shiro三大核心介绍
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。 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实现。
5.URL过滤器配置说明: 
Shiro可以通过配置文件实现基于URL的授权验证。FilterChain定义格式: 
URL_Ant_Path_Expression = Path_Specific_Filter_Chain 
每个URL配置,表示匹配该URL的应用程序请求将由对应的过滤器进行验证。 
例如: 
[urls] 
/index.html = anon 
/user/create = anon 
/user/** = authc 
/admin/** = authc, roles[administrator] 
/rest/** = authc, rest 
/remoting/rpc/** = authc, perms["remote:invoke"] 

URL表达式说明 
1、URL目录是基于HttpServletRequest.getContextPath()此目录设置 
2、URL可使用通配符,**代表任意子目录 
3、Shiro验证URL时,URL匹配成功便不再继续匹配查找。所以要注意配置文件中的URL顺序,尤其在使用通配符时。 
posted @ 2012-07-20 14:47  weep  阅读(447)  评论(0)    收藏  举报