7. 示例应用程序

有几个示例 web 应用程序可用于该项目。为了避免过大的下载,只有 "tutorial" 和 "contacts" 示例被包含在分发的 zip 文件中。其它可以直接从源代码建立,你可以获得如介绍中所述。自己构建项目很容易,在项目网站 http://spring.io/spring-security/ 上有更多的详细信息。本章中提到的所有路径都与项目源目录相对应。

7.1 教程示例

教程示例是让你入门的一个很好的基本示例。它始终使用简单的命名空间配置。已编译的应用程序包含在分发 zip 文件中,准备好部署到 web 容器中(spring-security-samples-tutorial-3.1.x.war)。基于表单的身份验证机制与通常使用的 记住我身份验证提供者结合使用,以便使用 cookie 自动记住登录。

我们建议你从教程示例开始,因为 XML 是最小的并且易于遵循。最重要的是,你可以很容易地将这一个 XML 文件(及其相应的 web.xml 条目)添加到现有的应用程序中。只有在实现这种基本集成时,我们建议你尝试添加方法授权或域对象安全性。

7.2 联系人

联系人示例是一个高级示例,它说明了域对象访问控制列表(ACL)除了基本的应用程序安全性之外更强大的特性。应用程序提供了一个接口,用户可以通过该接口来管理联系人(域对象)的简单数据库。

要部署,只需将 Spring Security 文件中的 WAR 文件复制到容器的 webapps 目录中即可。这个 war 应该称为 spring-security-samples-contacts-3.1.x.war(附加的版本号将根据你使用的发行版而变化)。

启动容器后,检查应用程序是否可以加载。访问 http://localhost:8080/contacts(或者无论哪个 URL 适合你的 web 容器和部署的 WAR)。

接下来,单击 "Debug"。将提示你进行身份验证,并在该页上建议一系列用户名和密码。只需对其中的任何一个进行身份验证,并查看生成的页面。它应该包含类似于以下的成功消息:

Security Debug Information

Authentication object is of type:
org.springframework.security.authentication.UsernamePasswordAuthenticationToken

Authentication object as a String:

org.springframework.security.authentication.UsernamePasswordAuthenticationToken@1f127853:
Principal: org.springframework.security.core.userdetails.User@b07ed00: Username: rod; \
Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
credentialsNonExpired: true; AccountNonLocked: true; \
Granted Authorities: ROLE_SUPERVISOR, ROLE_USER; \
Password: [PROTECTED]; Authenticated: true; \
Details: org.springframework.security.web.authentication.WebAuthenticationDetails@0: \
RemoteIpAddress: 127.0.0.1; SessionId: 8fkp8t83ohar; \
Granted Authorities: ROLE_SUPERVISOR, ROLE_USER

Authentication object holds the following granted authorities:

ROLE_SUPERVISOR (getAuthority(): ROLE_SUPERVISOR)
ROLE_USER (getAuthority(): ROLE_USER)

Success! Your web filters appear to be properly configured!

一旦你成功接收到上述消息,返回到示例应用程序的主页,然后单击 "Manage"。然后,你可以尝试应用程序。注意,只显示当前登录用户可用的联系人,并且只有 ROLE_SUPERVISOR 用户被授予删除联系人的访问权限。在幕后,MethodSecurityInterceptor 正在保护业务对象。

应用程序允许你修改与不同联系人关联的访问控制列表。一定要尝试一下,通过查看应用程序上下文 XML 文件来理解它是如何工作的。

7.3 LDAP 示例

LDAP 示例应用程序提供基本配置,并在同一应用程序上下文文件中使用传统 bean 设置命名空间配置和等效配置。这意味着实际上有两个相同的身份认证提供者配置在这个应用程序中。

7.4 OpenID 示例

OpenID 示例演示如何使用命名空间配置 OpenID,以及如何为 Google、Yahoo 和 MyOpenID 身份提供者设置属性交换配置(如果愿意,可以尝试添加其它身份提供者)。它使用基于 JQuery 的 openid-selector 项目来提供用户友好的登录页面,该页面允许用户轻松地选择提供者,而不是输入完整的 OpenID 标识符。

这个应用程序与常用的身份认证方案不同的是,它允许任何用户访问这个站点(只要它们的 OpenID 身份认证是成功的)。第一次登录时,你会收到一个 "Welcome [your name]" 的信息。如果注销并回滚(使用相同的 OpenID 身份),则这应该更改为 "Welcome Back"。这是通过使用自定义 UserDetailsService 来实现的,它向任何用户分配标准角色,并将标识存储在映射的内部。显然,实际应用程序将使用数据库来代替。看看源代码的更多详细信息。这个类还考虑这样一个事实,即不同的属性可以从不同的提供者返回,并构建相应的用户名。

7.5 CAS 示例

CAS 示例要求你同时运行 CAS 服务器和 CA S客户端。它不包含在分发中,所以你应该检查介绍中的项目代码。你将在 sample/cas 目录下找到相关文件。其中还有一个 Readme.txt 文件,该文件解释了如何直接从源代码树运行服务器和客户机,并完成 SSL 支持。

7.6 JAAS 示例

JAAS 示例是如何使用具有 Spring Security 的 JAAS 登录模块的非常简单的示例。如果用户名等于密码,提供的 LoginModule 将成功验证用户,否则将抛出 LoginException。本示例中使用的 AuthorityGranter 总是授予角色 ROLE_USER。示例应用程序还演示了如何通过将 jaas-api-provision 设置为 "true" 来作为 LoginModule 返回的 JAAS 主题运行。

7.7 预身份认证示例

此示例应用程序演示如何从预身份认证框架中连接 bean 以使用 JavaEE 容器的登录信息。用户名和角色是容器所设置的。

代码在 samples/preauth 中。

8. Spring Security 社区

8.1 问题跟踪

Spring Security 使用 JIRA 来管理错误报告和增强请求。如果发现 bug,请使用 JIRA 记录报告。不要将它记录在支持论坛、邮件列表或通过电子邮件发送项目的开发人员。这种方法是特设的,我们更喜欢使用更正式的进程来管理 bug。

如果可能的话,在你的问题报告中,请提供一个 JUnit 测试来演示任何不正确的行为。或者,更好的是,提供一个修补这个问题的补丁。类似地,欢迎将增强记录到问题跟踪器中,不过我们只接受增强请求,如果你包括相应的单元测试。这是确保项目测试覆盖率得到充分维护的必要条件。

你可以在 https://github.com/spring-projects/spring-security/issues 中访问问题跟踪。

8.2 参与

我们欢迎你参与 Spring Security 项目。有很多方法可以做出贡献,包括阅读论坛和回答其他人的问题,编写新代码,改进现有代码,帮助编写文档,开发示例或教程,或者简单地提出建议。

8.3 进一步信息

欢迎有关 Spring Security 的问题和意见。你可以在 Stack Overflow 网站使用 Spring 或在 http://spring.io/questions 参与框架的其他用户讨论 Spring Security。请记住使用 JIRA 进行 bug 报告,如上文所解释的那样。