附录:参考材料
在本附录中,将会涉及到一些我们感觉有用的参考材料(并相当缺乏文档),而将其插入到章节的内容中又会觉得过于综合。
JBCP Pets示例代码起步
就像我们在第一章:一个不安全应用的剖析中所描述的那样,我们假设你已有了Eclipse 3.4(或3.5)IDE,并包含Web Tools Package(WTP)。示例代码按每章被组织成了不同的ZIP文件,并有一个较大的ZIP文件其中包含了编译和运行示例应用所需要的所有依赖(注意的是,当你阅读本书的时候对应于最新版本的Spring Security它们可能已经较旧了,但是鉴于示例代码和依赖是一个静态的快照,它们能够永远运行)。
我们建议你对每一章建立新的Eclipse工作空间,这样你能够切换工作空间而不用打开或关闭项目。
以下的步骤帮助你建立新的工作空间。首先,我们要导入Dependencies项目到工作空间中:
l 选择“File”按钮,接下来是“Import…”选项。选择“General”文件夹以及“Existing Projects into Workspace”并点击“Next”;
l 确保“Select root directory”选项被选中,点击“Browse...”按钮到文本框。定位到你解压Dependencies.zip的目录并点击“OK”;
l 你应该可以看到Dependencies项目被列了出来。点击“Finish”。
接下来,我们需要导入每章的源码ZIP文件。假设你已经解压了第二章:Spring Security起步的源码到目录中。
l 选择“File”菜单以及“Import…”选项。选择“General”文件夹以及“Existing Projects into Workspace”。点击“Next”;
l 确保“Select root directory”选项被选中并点击“Browse…”按钮到文本框。定位到你解压第二章源码ZIP文件的目录并点击“OK”;
l 你可以看到“JBCPPets”项目和“Servers”项目被裂了出来。将它们都选中然后点击“Finish”。
最后,我们需要将JBCP Pets web应用部署到一个Tomcat实例上(或者你喜欢的应用服务器)。
l 右键点击“JBCPPets”项目并选择“Run As”菜单。在子菜单中选择“Run on Server”菜单项;
l 这时候你可能需要创建一个新的应用服务器实例。只需要按照你应用服务器的提示直到web应用部署完成。
此时,你应该可以运行JBCP Pets应用了。如果你遇到问题,可查看如下的列表:
l Eclipse是否列出了构建错误?如果有任何的Java错误或classpath错误,它们是应该被解决的真正错误。有时候,Spring IDE插件会报出假的错误或警告;
l 查看Eclipse的应用服务器启动控制台,这里包含不成功部署的web应用的错误。最常见的问题是缺失classpath条目,或者忘记将所有的classpath条目添加到JBCPPets 项目的“Java EE Module Dependencies”。尽管这些应该已经为你做好,但是我们不能保证在任何版本的Eclipse下均好用。
对于示例代码有任何问题请联系我们——理解代码和它的概念对你来说很重要!
可用的应用事件
下面的表格,在第六章:高级配置和扩展曾经提到,列出了各种Spring Security元素所发布的全部事件并提供了第二章中引用到的认证异常。为了简便,我们移除了包名,因为所有的时间都在o.s.s.authentication.event(认证相关的事件)和o.s.s.access.event(授权相关的事件)中。
类名 |
何时触发 |
匹配的异常 |
AbstractAuthenticationEvent |
所有认证时间的通用父类。注意这是一个从来不会被抛出的抽象异常(尽管其可以被捕获) |
|
AbstractAuthenticationFailureEvent |
所有认证失败事件的通用父类。注意这是一个从来不会被抛出的抽象异常(尽管其可以被捕获) |
|
AuthenticationFailureBadCredentialsEvent |
当提供的凭证(如用户名和密码)不合法时。它能够用来(有意的)掩盖UsernameNotFoundException。 |
BadCredentialsException UsernameNotFoundException |
AuthenticationFailureConcurrentLoginEvent |
当并发session最大值超出时。 |
ConcurrentLoginException |
AuthenticationFailureCredentialsExpiredEvent |
当UserDetails标识用户凭证过期时。 |
CredentialsExpiredException |
AuthenticationFailureDisabledEvent |
当UserDetails标识用户凭证不可用时。 |
DisabledException |
AuthenticationFailureExpiredEvent |
当UserDetails标识用户账号过期时。 |
AccountExpiredException |
AuthenticationFailureLockedEvent |
当UserDetails标识用户账号被锁定时。 |
LockedException |
AuthenticationFailureProviderNotFoundEvent |
配置错误,当不能找到Authentication Provider认证用户请求时。 |
ProviderNotFoundException |
AuthenticationFailureProxyUntrustedEvent |
当CAS代理ticket不可信时。 |
|
AuthenticationFailureServiceExceptionEvent |
当底层服务(如DAO Provider)失败时,抛出的一般异常。 |
AuthenticationServiceException |
AuthenticationSuccessEvent |
当用户成功认证时。 |
|
AuthenticationSwitchUserEvent |
当成功完成用户切换行为时。 |
|
InteractiveAuthenticationSuccess Event |
当用户通过提供完整凭证认证成功时(类似于IS_FULLY_AUTHENTICATED GrantedAuthority语法) |
|
AbstractAuthorizationEvent |
所有认证事件的通用父类。 |
|
AuthenticationCredentialsNot FoundEvent |
当用户没有认证而试图触发需要访问检查的方法时。 |
|
AuthorizationFailureEvent |
当方法前或后的访问检查失败时。 |
|
AuthorizedEvent |
当方法前或后的访问检查成功时。 |
|
PublicInvocationEvent |
当未认证的安全对象请求成功时。 |
|
SessionCreationEvent |
HttpSession创建时。 |
|
SessionDestroyedEvent |
HttpSession销毁时。 |
|
Spring Security的虚拟URL
以下的URL被Spring Security视为虚拟URL,并独立于你的代码作为servelt过滤器流程的一部分进行监视(并处理)。记住的是这些URL是相对于你的web应用上下文根的。
l /j_spring_security_check——被UsernamePasswordAuthenticationFilter检查进行用户名/密码form认证;
l /j_spring_openid_security_check——被OpenIDAuthenticationFilter检查OpenID返回认证信息(从OpenID provider处);
l /j_spring_cas_security_check——基于CAS SSO登录的返回,进行CAS认证
l /spring_security_login——当配置自动生成登录页面时,DefaultLoginPageGeneratingFilter使用的URL;
l /j_spring_security_logout——LogoutFilter使用来检测退出行为;
l /saml/SSO——Spring Security SAML SSO extension SAMLProcessingFilter使用来进行SAML SSO登录请求;
l /saml/logout——Spring Security SAML SSO extension SAMLLogoutFilter使用来进行SAML SSO退出请求;
l /j_spring_security_switch_user——SwitchUserFilter使用来将用户切换至另一用户;
l /j_spring_security_exit_user——用来退出切换用户功能。
注意的是,有一些功能在本书中没有涵盖,但是在这里我们为了完整性全部包括了。
方法安全的明确bean配置
第六章源码的dogstore-explicit-base.xml文件中包含了这里bean声明的全集。我们之所以在第六章本身中没有包含它,是因为它与要表述的没有太大关系(参考第五章:精确的访问控制来了解相关bean的功能)。
以下是通过Spring bean声明启用方法安全的完整配置:
请注意,明确的bean配置与你使用的Spring Security版本密切相关(就像我们在第六章提到的)。如果在你版本的Spring Security中使用列出的bean遇到问题,请参考o.s.s.config.method.GlobalMethodSecurityBeanDefinitionParser。
这个配置启用了JSR-250的@Secured和@Pre/@Post注解。如果你不使用它们要注释掉或移除相关的支持bean(如@Secured)。记住,SecurityMetadataSource和AccessDecisionVoter都要移除。
逻辑过滤器名字迁移参考
正如在第十三章:迁移到Spring Security 3所讨论的,很多逻辑过滤器名(在
Spring Security 2 |
Spring Security 3 |
CHANNEL_FILTER |
CHANNEL_FILTER |
CONCURRENT_SESSION_FILTER |
CONCURRENT_SESSION_FILTER |
SESSION_CONTEXT_INTEGRATION_ FILTER |
SECURITY_CONTEXT_FILTER |
LOGOUT_FILTER |
LOGOUT_FILTER |
PRE_AUTH_FILTER |
PRE_AUTH_FILTER |
CAS_PROCESSING_FILTER |
CAS_FILTER |
AUTHENTICATION_PROCESSING_FILTER |
FORM_LOGIN_FILTER |
OPENID_PROCESSING_FILTER |
OPENID_FILTER |
Spring Security 2没有提供LOGIN_PAGE_FILTER |
LOGIN_PAGE_FILTER |
Spring Security 2没有提供DIGEST_AUTH_FILTER |
DIGEST_AUTH_FILTER |
BASIC_PROCESSING_FILTER |
BASIC_AUTH_FILTER |
Spring Security 2没有提供REQUEST_CACHE_FILTER |
REQUEST_CACHE_FILTER |
SERVLET_API_SUPPORT_FILTER |
SERVLET_API_SUPPORT_FILTER |
REMEMBER_ME_FILTER |
REMEMBER_ME_FILTER |
ANONYMOUS_FILTER |
ANONYMOUS_FILTER |
Spring Security 2没有提供SESSION_MANAGEMENT_FILTER |
SESSION_MANAGEMENT_FILTER
|
EXCEPTION_TRANSLATION_FILTER |
EXCEPTION_TRANSLATION_FILTER |
NTLM_FILTER |
Spring Security 3中移除了NTLM_FILTER |
FILTER_SECURITY_INTERCEPTOR |
FILTER_SECURITY_INTERCEPTOR |
SWITCH_USER_FILTER |
SWITCH_USER_FILTER |