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


Tomcat与Jetty的功能不同,而Jetty与Websphere的功能不同 。但是,通过Shiro会话,您可以获得独立于容器的集群解决方案 。
Shiro的体系结构允许可插入的Session数据存储,例如企业缓存,关系数据库,NoSQL系统等等 。
这意味着您只需配置一次会话集群,无论部署环境如何(Tomcat,Jetty,JEE Server或独立应用程序),它都将以相同的方式工作 。
无需根据部署应用程序的方式重新配置应用程序 。
Shiro会话的另一个好处是,如果需要,会话数据可以跨客户端技术共享 。
例如,如果需要,Swing桌面客户端可以参加相同的Web应用程序会话-如果最终用户同时使用这两个客户端,则很有用 。
那么,您如何在任何环境中访问主题的会话?
如下面的示例所示,有两种Subject方法 。

  • Listing 10. Subject’s Session
Session session = subject.getSession();Session session = subject.getSession(boolean create);如您所见,这些方法在概念上与HttpServletRequest API相同 。
第一种方法将返回主题的现有会话,或者如果没有,则创建一个新的会话并返回 。
第二种方法接受一个布尔参数,该参数确定是否将创建一个新的会话(如果尚不存在) 。
获取主题的会话后,就可以将其几乎与HttpSession一样使用 。
Shiro团队认为HttpSession API最适合Java开发人员,因此我们保留了大部分感觉 。
当然,最大的区别是您可以在任何应用程序中使用Shiro Sessions,而不仅仅是Web应用程序 。
清单11显示了这种熟悉程度 。
  • Listing 11. Session methods
Session session = subject.getSession();session.getAttribute("key", someValue);Date start = session.getStartTimestamp();Date timestamp = session.getLastAccessTime();session.setTimeout(millis);密码学密码术是隐藏或混淆数据的过程,因此窥探眼睛无法理解它 。
Shiro的加密目标是简化JDK的加密支持并使之可用 。
需要特别注意的是,密码通常不是特定于主题的,因此Shiro API的其中一个领域不是特定于主题的 。
即使未使用“主题”,您也可以在任何地方使用Shiro的加密支持 。
Shiro真正侧重于其加密支持的两个领域是加密哈希(又名消息摘要)和加密密码领域 。
让我们更详细地看看这两个 。
散列如果您使用了JDK的MessageDigest类,您很快就会意识到使用它有点麻烦 。它具有笨拙的基于静态方法的基于工厂的API,而不是面向对象的API,因此您不得不捕获可能永远不需要捕获的已检查异常 。如果您需要十六进制编码或Base64编码的消息摘要输出,则由您自己决定-两者均不提供标准的JDK支持 。
Shiro通过干净直观的哈希API解决了这些问题 。
例如,让我们考虑MD5散列文件并确定该散列的十六进制值的相对常见的情况 。称为“校验和”,通常在提供文件下载时使用-用户可以对下载的文件执行自己的MD5哈希,并断言其校验和与下载站点上的校验和匹配 。如果它们匹配,则用户可以充分假设文件在传输过程中未被篡改 。
在没有Shiro的情况下,您可以尝试以下操作:
  1. 将文件转换为字节数组 。JDK中没有任何东西可以帮助您解决此问题,因此您需要创建一个辅助方法,该方法可以打开FileInputStream,使用字节缓冲区并抛出适当的IOException等 。
  2. 使用MessageDigest类对字节数组进行哈希处理,以处理适当的异常,如下面的清单12所示 。
  3. 将散列字节数组编码为十六进制字符 。JDK中也没有任何东西可以提供帮助,因此您需要创建另一个帮助器方法,并可能在实现中使用按位运算和移位 。
  • Listing 12. JDK’s MessageDigest
try {    MessageDigest md = MessageDigest.getInstance("MD5");    md.digest(bytes);    byte[] hashed = md.digest();} catch (NoSuchAlgorithmException e) {    e.printStackTrace();} 对于如此简单且相对常见的事物而言,这是一项巨大的工作 。
现在,说明如何使用Shiro进行完全相同的操作 。
String hex = new Md5Hash(myFile).toHex(); 使用Shiro简化所有工作时,了解正在发生的事情非常简单和容易 。
SHA-512哈希和密码的Base64编码也很容易 。
String encodedPassword =    new Sha512Hash(password, salt, count).toBase64();


推荐阅读