shiro 安全框架入门,看这一篇就够了( 四 )


但是,仅仅因为用户证明了自己的身份并不意味着他们可以在应用程序中做任何想做的事情 。
这就引出了下一个问题:“如何控制允许用户执行或不执行的操作?” 确定允许用户执行的操作称为授权 。
接下来,我们将介绍Shiro如何启用授权 。
Authorization(授权)授权本质上是访问控制-控制用户可以在应用程序中访问的内容(例如资源,网页等) 。
大多数用户通过使用角色和权限等概念来执行访问控制 。
也就是说,通常根据分配给他们的角色和/或权限,允许用户执行某项操作或不执行某项操作 。
然后,您的应用程序可以根据对这些角色和权限的检查来控制公开哪些功能 。
如您所料,主题API使您可以非常轻松地执行角色和权限检查 。
例如,清单7中的代码片段显示了如何检查Subject是否被分配了特定角色 。

  • 清单7-角色检查
if ( subject.hasRole("administrator") ) {    //show the ‘Create User’ button} else {    //grey-out the button?} 如您所见,您的应用程序可以基于访问控制检查来启用或禁用功能 。
权限检查是执行授权的另一种方法 。
如上例所示,检查角色存在一个重大缺陷:您无法在运行时添加或删除角色 。您的代码使用角色名称进行了硬编码,因此,如果更改了角色名称和/或配置,则代码将被破坏!如果您需要能够在运行时更改角色的含义,或者根据需要添加或删除角色,则必须依靠其他方式 。
为此,Shiro支持其权限概念 。
权限是对功能的原始说明,例如“开门”,“创建博客条目”,“删除'jsmith'用户”等 。
通过使权限反映您的应用程序的原始功能,您只需更改权限检查何时更改应用程序的功能 。反过来,您可以在运行时根据需要向角色或用户分配权限 。
作为一个示例,如下面的清单8所示,我们可以重写之前的角色检查,而使用权限检查 。
  • 清单8-权限检测
if (subject.isPermitted("user:create") ) {    //show the ‘Create User’ button} else {    //grey-out the button?} 这样,分配了 user:create 权限的任何角色或用户都可以单击“Create User”按钮,并且这些角色和分配甚至可以在运行时更改,从而为您提供了非常灵活的安全模型 。
“usercreate”字符串是遵循某些解析约定的权限字符串的示例 。
Shiro的WildcardPermission支持此约定 。
尽管不在本介绍文章的讨论范围之内,但您会发现WildcardPermission在创建安全策略时可以非常灵活,甚至还支持实例级访问控制之类的功能 。
  • 清单9-实例级别权限校验
if ( subject.isPermitted(“user:delete:jsmith”) ) {    //delete the ‘jsmith’ user} else {    //don’t delete ‘jsmith’}此示例表明,如果需要,您可以控制甚至访问非常细致的实例级别 。
如果愿意,您甚至可以发明自己的权限语法 。
有关更多信息,请参见 Shiro权限文档 。
最后,与身份验证一样,上述调用最终也进入了SecurityManager,后者将咨询一个或多个Realms来做出访问控制决策 。这使领域可以根据需要响应身份验证和授权操作 。
这就是Shiro授权功能的简要概述 。
尽管大多数安全框架都停止了身份验证和授权,但Shiro提供了更多功能 。
接下来,我们将讨论Shiro的高级会话管理功能 。
会话管理Apache Shiro在安全框架领域提供了一些独特的功能:可在任何应用程序和任何体系结构层中使用的一致的Session API 。
也就是说,Shiro为任何应用程序启用了会话编程范例-从小型守护程序独立应用程序到最大的群集Web应用程序 。
这意味着希望使用会话的应用程序开发人员不再需要,则不再需要使用Servlet或EJB容器 。或者,如果使用这些容器,则开发人员现在可以选择在任何层中使用统一且一致的会话API,而不是使用servlet或EJB特定的机制 。
但是Shiro会话的最重要好处之一就是它们与容器无关 。
这具有微妙但极其强大的含义 。
例如,让我们考虑会话集群 。有多少种特定于容器的方式可以将会话群集在一起以实现容错和故障转移?


推荐阅读