读书笔记《spring-security-3-x-cookbook》第 2 章 Struts 的 Spring Security 2
第 2 章 Struts 的 Spring Security 2
在本章中,我们将介绍:
将 Struts 2 与 Spring Security 集成
具有基本 Spring Security 的 Struts 2 应用程序
将 Struts 2 与基于摘要/散列的 Spring Security 一起使用
在 Struts 2 中使用 Spring Security 注销
使用 Struts 2 和 Spring Security 对数据库进行身份验证
使用 Spring Security 在 Struts 2 中获取登录用户信息
在 Struts 2 中显示身份验证失败的自定义错误消息
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证
介绍
我们在第 1 章,基本安全中学习了安全基础知识< /span>,帮助我们更好地理解 Spring Security 以及 Spring Framework 中 Spring Security 组件的由来。
在本章中,让我们看看如何使用 Spring Security 在基于 Struts 2 框架的 Web 应用程序中对用户进行身份验证。
Apache Struts 2 可以与 JSF 和 Spring 集成。它是一个非常灵活的 POJO 基于 Action 的 MVC 框架。 POJO 本身执行操作类的角色来满足请求。 Struts 2 源自另一个名为 WebWork 的框架,它与 servlet 过滤器一起工作,拦截请求和响应。
探索 Spring 包
您可以直接从 MAVEN 下载 JAR 或在您的 POM 文件中添加依赖项。
我们更喜欢 使用来自 http://mvnrepository.com/artifact/org.springframework.security/spring-security-core/:
Spring Security 中的主要包
org.springframework.security.crypto
:这个是用来加解密的org.springframework.security.util
:这是 Spring Security API 使用的通用实用程序类org.springframework.security.core
:这包含与身份验证和授权相关的安全核心类org.springframework.security.access
:这包含基于投票者的安全访问控制注释和决策接口org.springframework.security.provisioning
:这包含用户和组配置接口
关键 Spring Security 功能
身份验证机制
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
接受凭据并将它们传递给org.springframework.security.authentication.AuthenticationManager
验证。系统对用户进行身份验证。
凭证流程如下:
UsernamePasswordAuthenticationToken
|AuthenticationManager
|身份验证
。最后返回一个完全加载的身份验证实例。
SecurityContextHolder
接受身份验证实例。系统还检查角色或组的授权。
最后,允许用户根据他的授权访问系统。
将 Struts 2 与 Spring Security 集成
让我们 首先建立一个Struts 2 应用程序并将Spring Security 与它集成。
准备好
Eclipse Indigo 或更高版本
JBoss 作为服务器
Struts 2 JAR:2.1.x
Spring 核心 JAR 3.1.4。发布和 Spring-Security 3.1.4.Release
Struts 2 Spring 插件 jar
怎么做...
在这个 部分,我们将学习如何设置 Struts 2 应用程序基于表单的 Spring Security:
在您的 Eclipse IDE 中,创建一个动态 Web 项目并将其命名为
Spring_Security_Struts2
。在
src/main/java
创建一个源文件夹。在源文件夹
src/main/java
下创建一个struts.xml
文件。要将 Struts 2 与 Spring 应用程序集成,请在此处添加
application-context.xml
文件引用。在
web.xml
中添加 Struts 过滤器映射。还需要将 Spring 侦听器添加到web.xml
文件中。监听器条目应该在 Struts 2 过滤器条目之上。contextLoaderListener
将告诉servletcontainer
关于springcontextLoader
并跟踪事件.这也允许开发人员创建BeanListeners
,这允许它跟踪 Bean 中的事件。在
web.xml
文件中,添加以下代码:要设置基于表单的安全性,我们需要创建
login.jsp
。表单动作是j_spring_security_check
:使用
login.jsp?error=true
映射loginfailed
操作。将
welcome
动作与secure/hello.jsp
映射到动作类-HelloWorld :
struts.xml
:登录页面
URL 与 Struts 2 操作'/login'
映射。将提示用户登录。
role_user
的用户将被授权访问页面Applicationcontext-security.xml
:
这个怎么运作...
只需运行应用程序。您将获得 一个链接以访问受保护的页面。单击链接后,系统将提示您登录。这实际上是基于表单的登录。
在提交时,操作被发送到验证用户的 Spring 框架。
成功后,用户将看到经过身份验证的页面。
Struts 2 框架很容易与 Spring 框架及其模块相结合,只需非常小的修改。
也可以看看
带有基本 Spring Security 的 Struts 2 应用程序 配方
将 Struts 2 与基于摘要/散列的 Spring Security 结合使用 秘诀
在 Struts 2 中针对身份验证失败显示自定义错误消息 配方
使用 Struts 2 和 Spring Security 验证数据库 秘诀
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
在 Struts 2 中使用 Spring Security 注销 秘诀
在 Struts 2 中使用 Spring Security 获取登录用户信息 秘诀
具有基本 Spring Security 的 Struts 2 应用程序
在这个 部分中,我们将演示 使用 Struts 2 进行的基本 Spring Security 身份验证。我们将创建一个示例 Struts 2 应用程序并将 Spring Security 功能添加到操作以使其安全。只有经过身份验证的授权用户才能访问它。
准备好
更新
Applicationcontext-security.xml
文件在 Eclipse 中新建一个动态项目:
Struts2_Spring_BASIC_Security_Recipe2
怎么做...
执行以下步骤以将 Struts 2 应用程序与 Spring Security 集成以实现基本身份验证:
修改
applicationcontext-security.xml
文件以支持基本安全性:Applicationcontext-security.xml
:
这个怎么运作...
当 用户运行Struts 2 应用程序并尝试访问安全资源时, Spring Security 上下文被初始化,Struts 2 操作被 Spring 的登录对话框中断,该对话框将请求用户名和密码。成功验证后,用户将被重定向到 Struts 2 操作页面。
以下是应用程序的工作流程:
浏览器上的 Struts 2 和 Spring 基本安全性:
也可以看看
将 Struts 2 与基于摘要/散列的 Spring Security 结合使用 秘诀
将 Struts 2 与基于摘要/散列的 Spring Security 一起使用
使用基于表单或基本的身份验证不会使基于 Struts 2 的应用程序安全,因为密码已暴露 以纯文本形式发送给用户。 是 Spring Security JAR 中的一个加密包。该包可以解密加密的密码,但我们需要告诉 Spring Security API 用于加密的算法。
准备好
在 Eclipse 中创建动态 Web 项目
添加 Struts 2 JAR
添加 Spring Security 相关的 JAR
web.xml
、struts2.xml
和 JSP 设置与之前的应用程序保持一致
怎么做...
让我们加密密码:packt123456
。
我们需要使用一个外部 JAR,JACKSUM
,这意味着 Java 校验和。它同时支持 MD5 和 SHA1 加密。
下载 jacksum.zip
文件(http://www.jonelo.de/java/jacksum/ #Download) 和 解压 ZIP 文件夹。
更新 applicationcontext-security.xml
文件:
这个怎么运作...
我们需要更新Applicationcontext-security.xml
文件。观察到身份验证的类型是基本的 但密码是使用算法散列 .我们希望 Spring Security 使用 SHA 算法对其进行解密并对用户进行身份验证。
Spring Security 在处理摘要身份验证方面非常灵活。您还可以看到没有基于容器的依赖项。
来自浏览器的基本身份验证可以在以下屏幕截图中看到:
Spring通过解密密码对用户进行了身份验证:
也可以看看
在 Struts 2 中针对身份验证失败显示自定义错误消息 配方
使用 Struts 2 和 Spring Security 验证数据库 秘诀
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
在 Struts 2 中使用 Spring Security 注销 秘诀
在 Struts 2 中使用 Spring Security 获取登录用户信息 秘诀
在 Struts 2 中使用 Spring Security 注销
在本节中,让我们实现一个注销场景,登录的用户将从应用程序中注销。注销操作将由 Spring Security 框架处理。我们需要配置 struts.xml
文件来处理 j_spring_security_logout
动作。
准备好
怎么做...
这个怎么运作...
Spring Security 还提供了处理注销的选项。当用户点击 logout 时,用户将被定向到分配的页面。
j_spring_secuurity_logout
为 Struts 2 应用程序提供注销选项。
Struts 2 应用程序具有地图和 URL 及其操作。
注销选项通常在安全页面中给出。
也可以看看
在 Struts 2 中针对身份验证失败显示自定义错误消息 配方
使用 Struts 2 和 Spring Security 验证数据库 秘诀
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
在 Struts 2 中使用 Spring Security 获取登录用户信息 秘诀
使用 Struts 2 和 Spring Security 对数据库进行身份验证
在本节中,让我们使用存储在数据库中的信息授权登录到 Struts 2 应用程序的用户。 Spring Security 需要在 Struts 2 应用程序中进行配置,以便了解数据库的位置和需要执行的 SQL,以使用 Spring Security 对用户进行身份验证。
准备好
怎么做...
要使用 Struts 2 和 Spring 执行数据库身份验证,我们需要创建 一个
db-beans.xml
文件.db-beans.xml
文件 < /a>将 有数据库信息:在与
applicationcontext-security.xml
相同的位置添加db-beans.xml
文件。更新web.xml
文件以读取db-beans.xml
文件:-
更新
applicationContext-security.xml
文件 到读取数据库配置:
这个怎么运作...
Struts 2 框架提供了访问 安全页面的链接。但是 Spring Security 框架中断并给出一个身份验证 对话框。身份验证是由 Spring Security Framework 通过查询数据库完成。身份验证管理器配置有数据源 ref,它将加载安全框架的信息,以根据查询对用户进行身份验证。
还有更多...
到目前为止,我们只使用一个 JSP 文件应用了安全性,该文件在 struts2.xml
中被映射而无需操作。让我们看看如何用 JSP 映射一个动作类,然后与 Spring Security 集成。理想情况下,它应该以相同的方式工作。让我们在action类中获取登录用户信息,并显示在浏览器上。
也可以看看
在 Struts 2 中针对身份验证失败显示自定义错误消息 配方
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
在 Struts 2 中使用 Spring Security 获取登录用户信息 秘诀
使用 Spring Security 在 Struts 2 中获取登录用户信息
到目前为止,在我们的示例中,我们还没有使用任何 Struts 2 动作类。
让我们创建一个操作类,看看 Security 如何处理这个操作类。我们将在这个秘籍中使用基于表单的身份验证。
准备好
到目前为止 在我们的示例中,我们没有使用任何 Struts 2 动作类。
让我们创建一个动作类,看看这个动作类的安全性如何。我们将在这个秘籍中使用基于表单的身份验证:
创建动态 Web 项目:
Struts2_Spring_Security_Recipe5
创建一个包:
com.packt.action
从
src/main/java
中复制上一个秘籍中的struts.xml
文件同时复制
WebContent
文件夹我们需要在包中添加一个动作类
更新
struts.xml
文件
怎么做...
HelloAction
文件如下:使用
HelloAction
更新Struts.xml
文件。因此,当用户通过身份验证时,它将请求传递给将执行execute()
方法的操作类,然后将被重定向到hello.jsp
:我们 可以在操作类中获取登录的用户名,我们可以将其显示在页面上或在我们的应用程序中进一步使用。
我们可以在我们的操作类中使用
request.getUserPrincipal
来获取登录的用户信息。对于项目设置:
在 Eclipse 中创建动态 Web 项目:
Struts2_Spring_Security_Recipe6
从上一个秘籍复制
src/main/java
文件夹从上一个秘籍复制
Web content
文件夹修改
HelloAction.java
文件
修改
secure/Hello.jsp
文件:
也可以看看
在 Struts 2 中针对身份验证失败显示自定义错误消息 配方
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
在 Struts 2 中显示身份验证失败的自定义错误消息
在这部分,我们将在我们的捕获来自Spring Security的认证失败消息。 Struts 2 应用程序,看看如何将其显示给用户。
准备好
身份验证失败时重定向到失败操作
向用户显示自定义消息
怎么做...
执行 以下步骤,在 JSP 应用程序中捕获 Spring Security 的身份验证失败消息:
在
applicationcontext.xml
文件中,我们可以将 URL 重定向到另一个操作:Authentication-failure-url="/loginfailed?error=true" 。
使用以下代码更新
login.jsp
页面:
这个怎么运作...
登录失败操作与 struts2.xml
中的 login.jsp
文件映射。 authentication-failure-url
被添加到 application-context.xml
中。当用户输入错误的凭据时,身份验证失败,用户被重定向到登录页面并显示错误消息。
错误消息配置在 JSP 文件中完成。
也可以看看
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证 秘诀
使用 Spring Security 和 Struts 2 应用程序使用 ApacheDS 进行身份验证
在这个 部分,我们将存储用户凭据和角色Apache 目录 server 中的信息。 Spring Security 必须找到服务器并登录到服务器。它应该通过比较用户提交的凭据与 Apache 目录服务器中存在的凭据和角色信息来验证用户。
准备好
在 Eclipse 中创建动态 Web 项目
src/main/java
文件夹和WebContent
文件夹保持不变安装 Apache 目录工作室:1.5.3
安装 Apache 目录服务器:2.0
10389 是 apache-ds 端口
将 LDAP 相关的安全 JAR 添加到
WebContent Lib
文件夹spring-ldap-core-tiger-1.3.X 发布
spring-ldap-odm-1.3.X 发布
spring-security-ldap-1.3.X 发布
spring-ldap-ldif-batch-1.3.X 发布
spring-ldap-test-1.3.X 发布
spring-ldap-core-1.3.X 发布
spring-ldap-ldif-core-1.3.X 发布
怎么做...
执行 设置 Apache 目录以使用 Spring Security 在 Struts 2 应用程序中验证用户的步骤:
安装上述先决条件后配置 Apache DS 服务器。
使用以下步骤创建分区:
打开
server.xml
文件:C:\Program Files\Apache Directory Server\instances\default\conf\server.xml
.添加 JDM 分区:
。 您可以重新启动 Apache DS 服务器以查看更改。然后使用 Apache Directory Studio 连接到 Apache DS。右键单击 DIT。从 Scratch 创建 Entry。选择 Organization,选择 o 并在 值输入
packt
。选择 Finish 并刷新 DIT 以查看更新。
配置 Apache 目录工作室。
连接到 Apache 目录服务器。
Apache DS 在 10389 上运行。
创建两个组
ou=groups
和ou=user
。这里,object class 是 用于将条目添加到
ou=groups
,因为这样可以保持角色:这里,object class 是 添加条目到
ou=people
:将 角色 分配给 用户由添加
UniqueMember
到cn=admin< /代码>。
Spring-security-ldap.xml
:
这个怎么运作...
Spring Security-ldap.xml
将< /a> 包含关于服务器位置和域的 详细信息。它应该连接以检索用户信息。域是 sevenSeas
。 1039 是 LDAP 服务器的端口号。 Spring Security 使用 ldap-server
标签来提供关于 LDAP 的信息。它还提供了密码和它将连接的域。 Struts 2 请求将被 Spring Security 中断,并且为了进行身份验证,将从登录页面接收 用户信息。 Spring 安全要求用户名使用LDAP;成功后,用户可以访问受保护的资源。
也可以看看
第 3 章,Spring Security with JSF