读书笔记《spring-security-3-x-cookbook》第 1 章基本安全
第 1 章基本安全
在本章中,我们将介绍:
JSP 上基于 JAAS 的安全认证
servlet 上基于 JAAS 的安全认证
servlet 上基于容器的基本身份验证
servlet 上基于表单的身份验证
使用开放 LDAP 和 servlet 的基于表单的身份验证
servlet 上的散列/摘要身份验证
JAX-WS 和 JAX-RS 的基本身份验证
启用和禁用文件列表
介绍
身份验证和授权已成为所有 Web 应用程序的主要部分。身份验证 涉及检查谁在访问应用程序。授权是一个检查用户访问权限的过程。在原生方式中,我们通常将用户的信息存储在数据库中,并在应用程序中编写代码。我们还为用户创建角色并进行映射。在这里,它与应用程序紧密耦合,因为当我们连接到新数据库或使用任何其他工具(如 LDAP 或 Kerbose)时,我们必须重写整个代码。但是有一些高级选项可以处理身份验证和授权。 J2EE 容器通过配置 XML 文件提供了不同的方式来验证用户。我们可以将认证分为两类,即基于容器的认证授权和应用级的认证授权。
J2EE 容器提供接口和类来提供身份验证。在本章中,我们可以看到如何使用 JAAS、基本身份验证和基于表单的身份验证来对用户进行身份验证。
在本书中,我们使用了 JAAS,因为它是一种标准的身份验证框架。 JAAS 在 PAM(可插入身份验证模块)框架上工作。
可以通过以下方式提供身份验证和授权:
JSP 上基于 JAAS 的安全认证
部署描述符是所有Web应用程序的主要配置文件。容器在启动任何应用程序之前首先查找部署描述符。
部署描述符是一个 XML 文件,web.xml
,位于 WEB-INF
文件夹中。
如果您查看 web.xml
文件的 XSD,您可以看到与安全相关的架构。
可以使用以下 URL 访问架构:http: //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd。
以下是 XSD 中可用的架构元素:
准备好
您将需要以下内容来演示身份验证和授权:
JBoss 7
日食靛蓝 3.7
创建一个动态 Web 项目并将其命名为
Security Demo
创建一个包,
com.servlets
在
WebContent
文件夹中创建一个XML文件,jboss-web.xml
创建两个 JSP 页面,
login.jsp
和logoff.jsp
怎么做...
使用输入字段
j_username
、j_password
编辑login.jsp
文件,并将其提交给SecurityCheckerServlet
:j_username
和j_password
是使用基于表单的身份验证的指标。让我们修改
web.xml
文件< /a> 保护所有以.jsp
结尾的文件。如果您尝试访问任何 JSP 文件,您将获得一个登录表单,该表单又调用SecurityCheckerServlet
文件来验证用户身份。您还可以看到显示的角色信息。更新web.xml
文件,如以下代码片段所示。我们使用了2.5 xsd
。以下代码需要放在web.xml
文件中的webapp
标记之间:JAAS Security Checker and Credential Handler:Servlet 是一个安全检查器。由于我们使用的是认证标准框架 JAAS,为了执行以下程序,您需要导入
org.jboss.security.SimplePrincipal
和org.jboss.security.auth.callback.SecurityAssociationHandle
并添加所有必要的导入。在下面的SecurityCheckerServlet
中,我们从 JSP 文件中获取输入并将其传递给CallbackHandler
。然后我们将 Handler 对象传递给
LoginContext
类,该类具有login()
方法进行身份验证。 认证成功后,会创建Subject
和Principal
对于用户,带有用户详细信息。我们正在使用迭代器接口来迭代LoginContext
对象以获取检索到的用户详细信息以进行身份验证。在
SecurityCheckerServlet
类中:在
jboss-web.xml
文件中:Other
是login-config.xml
文件中定义的应用程序策略的名称。所有这些都将打包为一个
.war
文件。配置 JBoss 应用服务器。转到 JBoss 中的
jboss-5.1.0.GA\server\default\conf\login-config.xml
。如果您查看该文件,您可以看到数据库 LDAP 的各种配置和一个使用属性文件的简单配置,我在以下代码片段中使用了该文件:创建
users.properties
文件 在同一文件夹中。以下是Users.properties
文件,其中用户名映射到角色。用户属性
角色属性
重新启动服务器。
小费
下载示例代码
您可以从 http://www 的帐户下载您购买的所有 Packt 书籍的示例代码文件。 PacktPub.com。如果您在其他地方购买了这本书,您可以访问 http://www.PacktPub.com/support< /a> 并注册以将文件直接通过电子邮件发送给您。
这个怎么运作...
CallbackHandler
和Callback
接口LoginModule
接口LoginContext
CallbackHandler
接口获取用户凭据。它处理凭据并将它们传递给 LoginModule
,后者对用户进行身份验证。
JAAS 是特定于容器的。每个容器都有自己的实现,这里我们使用 JBoss 应用服务器来演示 JAAS。
在我之前的示例中,我明确调用了 JASS 接口。
UserCredentialHandler
实现了 CallbackHandler
接口。
因此,CallbackHandler
是用户凭据的存储空间,LoginModule
对用户进行身份验证。
LoginContext
将 CallbackHandler
接口与 LoginModule
连接起来。它将用户凭据传递给 LoginModule
接口进行身份验证:
web.xml
文件定义了安全机制,还为我们指出了应用程序中受保护的资源。
以下屏幕截图显示了失败的身份验证窗口:
也可以看看
servlet 上基于 JAAS 的安全认证 配方
servlet 上基于容器的基本身份验证 配方
基于表单的 servlet 身份验证 配方
使用开放 LDAP 和 servlet 的基于表单的身份验证 配方
servlet 上的散列/摘要式身份验证 配方
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
servlet 上基于 JAAS 的安全认证
servlet 上基于 JAAS 的安全认证是 基于 JAAS 的安全性的扩展JSP 的身份验证。在本节中,我们将演示我们甚至可以在 servlet 上应用安全性。
准备好
在 Eclipse 中创建一个新的 Web 项目
创建一个包,
com.packt.security.servlets
创建一个名为
ProtectedServlets
的 Servlet
怎么做...
以下是 servlet 基于 JAAS 的安全性的步骤:
这个怎么运作...
重新启动服务器并访问 URL:http://localhost:8080/jaas-jboss/ProtectedServlets
。
您将获得一个登录表单,该表单将对用户进行身份验证。 servlet 是受保护的资源,任何访问 servlet 的人都将被要求登录。身份验证由特定于应用程序服务器的 JAAS API 处理。每个应用服务器都有自己的安全实现。
也可以看看
servlet 上基于容器的基本身份验证 配方
基于表单的 servlet 身份验证 配方
使用开放 LDAP 和 servlet 的基于表单的身份验证 配方
servlet 上的散列/摘要式身份验证 配方
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
servlet 上基于容器的基本身份验证
在我们的 之前的示例中,我们使用 JAAS 提供的接口与 loginform.jsp
。以前的应用程序有一个自定义登录表单设计,其身份验证由应用程序服务器提供的 JAAS API 处理。
准备好
创建一个简单的网络应用项目
创建一个 servlet 类
编辑
web.xml
文件以进行基本身份验证添加约束以限制用户访问 servlet
怎么做...
现在,我们将看到基本身份验证。容器提供登录表单并对用户进行身份验证,并在身份验证成功后将用户重定向到 servlet。不涉及登录表单。
在 web.xml
文件中进行以下更改:
将 .war
导出到 JBoss,重新启动服务器,然后访问 servlet。
这个怎么运作...
在前面的示例中,容器通过读取 web.xml
文件来决定验证 servlet 的机制。这里的 <auth-method>
标签已将 BASIC
定义为模式 的身份验证。当我们访问受保护的资源时,我们应该会弹出一个登录对话框。
以下屏幕截图显示了实施的工作流程:
也可以看看
基于表单的 servlet 身份验证 配方
使用开放 LDAP 和 servlet 的基于表单的身份验证 配方
servlet 上的散列/摘要式身份验证 配方
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
servlet 上基于表单的身份验证
在 之前的 部分中,我们演示了 servlet 和 JSP 的基本身份验证。现在让我们在 servlet 上使用基于表单的身份验证。
准备好
让我们在 servlet 上应用基于表单的身份验证。您将需要一个带有 servlet 的简单 Web 应用程序、一个处理身份验证的 Web 容器,以及告诉容器要进行哪些身份验证的 web.xml
文件。
怎么做...
让我们查看在servlet上实现基于表单的身份验证的一些简单步骤:
创建一个名为
Containerform.jsp
的 JSP 文件:你在前面的代码中观察到了什么?
action=j_security_check
是 Web 容器识别的默认 URL。它告诉容器它具有要验证的用户凭据。现在,编辑
web.xml
文件:
构建项目并将 .war
文件导出到 JBoss。
这个怎么运作...
前面的 示例演示了基于表单的 身份验证。 J2EE容器读取web.xml
文件,<auth-method>
标签有form
属性集。然后它进一步查找 login.jsp
文件,该文件需要显示以进行基于表单的身份验证。 <form-error-page>
和 <form-login-page>
有登录文件名和错误认证失败时需要显示的页面。当用户尝试访问受保护的资源时,J2EE 容器将请求重定向到登录页面。用户凭据提交给 j_security_check
操作。该动作由容器标识,并进行身份验证和授权;成功时,用户被重定向到受保护的资源,失败时显示错误页面。
以下是显示用户登录页面并显示成功认证的用户信息的工作流截图:
也可以看看
使用开放 LDAP 和 servlet 的基于表单的身份验证 配方
servlet 上的散列/摘要式身份验证 配方
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
使用开放 LDAP 和 servlet 的基于表单的身份验证
在本部分,我们将了解如何通过检索对用户进行身份验证="id40" class="indexterm">中存储的用户信息打开LDAP和JAAS。顾名思义,Open LDAP 是轻量级用户目录协议的免费版本,它允许我们创建组并向其中添加用户。
准备好
下载开放的 LDAP,创建角色、组和用户。
在 JBoss 应用服务器中,编辑 login-config.xml
文件。
怎么做...
执行以下步骤来配置应用程序服务器以从 Open LDAP 检索用户:
这个怎么运作...
在 JBoss 上构建和部署 WAR,重新启动服务器,然后访问浏览器。
您 将被提示登录表单 并且JBoss 验证用户 基于提供的开放 LDAP 凭据 。检索用户并获得应用程序策略中提到的角色的授权。容器提供了用于身份验证的内置 API。模块 org.jboss.security.auth.spi.LdapExtLoginModule
处理 LDAP 身份验证过程。
也可以看看
servlet 上的散列/摘要式身份验证 配方
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
servlet 上的散列/摘要身份验证
在 之前的身份验证机制中,客户端发送 用户凭据并由容器验证.
本节介绍将加密的用户凭据传递给服务器,并告诉服务器可以使用哪种加密算法来解密数据。
JBoss 是我选择用来演示它的应用程序服务器。
准备好
修改
Login-config.xml
创建
加密用户。属性
创建
加密角色。属性
怎么做....
这个怎么运作...
前面的示例演示了摘要身份验证机制。 J2EE 容器中给出的密码是使用 MD5 算法加密的。容器对其进行解密并根据解密的密码验证用户凭据。认证机制为digest
容器弹出登录对话框类似于基本的身份验证机制。
也可以看看
JAX-WS 和 JAX-RS 的基本身份验证 配方
启用和禁用文件列表配方
JAX-WS 和 JAX-RS 的基本身份验证
对于 JAX-WS 和 JAX-RS, 身份验证配置保持不变。
我们需要 在 URL class="literal"><网络资源集合>
。
Auth_type
可以是基本的。该容器将附带一个表单,供用户输入用户名和密码。
由容器处理的身份验证
我们将首先创建一个 Web 服务,然后让容器处理它的安全性。
让我们创建一个接口,该接口将公开 service
方法,然后声明一个 implementation
类。
让我们使用 Tomcat 6.0 来演示这一点。
准备好
在 Eclipse-Indigo 中,创建一个动态 Web 项目
服务器:Tomcat 6
要添加到 Tomcat
lib
文件夹的 JAR:https://jax-ws.java.net/2.2.7/下载项目并复制
lib
文件夹
怎么做...
这个怎么运作...
每个 Web 服务 URL 都经过身份验证。
系统将提示您登录页面 (http://localhost:8080/EmployeeProfile/employee
)
也可以看看
启用和禁用文件列表配方