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 的整体架构:
SecurityManager :Shiro 通过它对外提供安全管理的各种服务;
Authorizer :通常涉及用户名和密码;
Authorizer:身份份验证通过后,由这个组件对登录人员进行访问控制的筛查,Shiro 采用“基于 Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。
Session Manager :这个组件保证了异构客户端的访问,配置简单。它是基于 POJO/J2SE 的,不跟任何的客户端或者协议绑定。
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。
权限传递结构为: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 Name | Class |
|---|---|
| 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顺序,尤其在使用通配符时。

浙公网安备 33010602011771号