Apache Shiro在Web中的应用
概述
Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。本文只是我对shiro的初步认识,有不对的请大虾指正,谢谢!
?
基本概念在对系统进行安全保障时,有两个安全性元素非常重要:身份验证和授权。虽然这两个术语代表的是不同的含义,但出于它们在应用程序安全性方面各自的角色考虑,它们有时会被交换使用。
身份验证 (我们平常接触较多的就是登录)指的是验证用户的身份。在验证用户身份时,需要确认用户的身份的确如他们所声称的那样。在大多数应用程序中,身份验证是通过用户名和密码的组合完成的。只要用户选择了他人很难猜到的密码,那么用户名和密码的组合通常就足以确立身份。但是,还有其他的身份验证方式可用,比如指纹、证书和生成键。
一旦身份验证过程成功地建立起身份,授权 (我理解的就是权限管理与控制)就会接管以便进行访问的限制或允许。所以,有这样的可能性:用户虽然通过了身份验证可以登录到一个系统,但是未经过授权,不准做任何事情。还有一种可能是用户虽然具有了某种程度的授权,却并未经过身份验证。
在为应用程序规划安全性模型时,必须处理好这两个元素以确保系统具有足够的安全性。身份验证是应用程序常见的问题(特别是在只有用户和密码组合的情况下),所以让框架来处理这项工作是一个很好的做法。合理的框架可提供经过测试和维护的优势,让您可以集中精力处理业务问题,而不是解决其解决方案已经实现的问题。
Apache Shiro 提供了一个可用的安全性框架,各种客户机都可将这个框架应用于它们的应用程序。本文中的这些例子旨在介绍 Shiro 并着重展示对用户进行身份验证的基本任务。
?
初识shiroShiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权。使用 Shiro,您就能够为您的应用程序提供安全性而又无需从头编写所有代码。
由于 Shiro 提供具有诸多不同数据源的身份验证,以及 Enterprise Session Management,所以是实现单点登录(SSO)的理想之选 — 大型企业内的一个理想特性,因为在大型企业内,用户需要在一天内经常登录到并使用不同系统。这些数据源包括 JDBC、LDAP、 Kerberos 和 Microsoft? Active Directory? Directory Services (AD DS)。
Shiro 的 Session
对象允许无需 HttpSession
即可使用一个用户会话。通过使用一个通用的Session
对象,即便该代码没有在一个 Web 应用程序中运行,仍可以使用相同的代码。没有对应用服务器或 Web 应用服务器会话管理的依赖,您甚至可以在命令行环境中使用 Shiro。换言之,使用 Shiro 的 API 编写的代码让您可以构建连接到 LDAP 服务器的命令行应用程序并且与 web 应用程序内用来访问 LDAP 服务器的代码相同。
?
Shiro在Web中的应用将shiro整合到Web中最简单的方式就是在web.xml文件中配置一个Servlet ContextListener的监听器和Filter过滤器。实例代码如下:
02
<
div
id
=
"page_header"
>
03
??????
<
div
id
=
"page_heading"
>Hello World</
div
>
04
??????
<
div
id
=
"page_headerlinks"
>
05
????????????
<
ul
>
06
??????????????????
<
li
>
07
??????????????????
<
shiro:guest
>?
08
??????????????????
<
a
href
=
"/common/login.jsp"
>Login Now</
a
>
09
??????????????????
</
shiro:guest
>
10
??????????????????
<
shiro:user
>
11
??????????????????
Welcome, <
shiro:principal
/>
12
???????????????????
</
shiro:user
>
13
??????????????????
</
li
>
14
??????????????????
<
script
>
15
????????????????????????
var username = '<
shiro:principal
/>';
16
??????????????????
</
script
>
17
??????????????????
<
li
>
18
??????????????????
<
shiro:guest
>?
19
??????????????????
<
a
href
=
"/common/register.jsp"
>Register Now</
a
>
20
??????????????????
</
shiro:guest
>
21
??????????????????
<
shiro:user
>
22
???????????????????????????????
<
a
href
=
"Logout.action"
>Log out</
a
>
23
??????????????????
</
shiro:user
>
24
??????????????????
</
li
>
25
????????????
</
ul
>
26
??????
</
div
>
27
??????
<
div
class
=
"clearthis"
> </
div
>
28
</
div
>
?
说明:guest标签只用于显示当前Subject被认为是“guest”的Subject内容。通常用于显示没有登录的内容。user标签只用于显示当前Subject被认为是“user”的Subject内容。通常用于显示已经登录的内容。一般情况下,两者是互斥的,只显其一。
更多标签用法,参见官方文档。