44. Spring Security FAQ春季安全常见问题

第44.1节,“一般问题”

第44.2节,“常见问题”

第44.3节,“春季安全架构问题”

第44.4节,“常见”如何“请求

44.1 General Questions

第44.1.1节,“Spring Security会满足我的所有应用程序安全要求吗?”

第44.1.2节,“为什么不使用web.xml安全性?”

第44.1.3节,“需要什么样的Java和Spring框架版本?”

第44.1.4节:“我是Spring Security的新手,我需要构建一个应用程序,支持通过HTTPS的CAS单点登录,同时允许对某些URL进行本地基本身份验证,并针对多个后端用户信息源(LDAP和JDBC)进行身份验证。我复制了一些我找到的配置文件,但它不起作用。有什么问题吗?”

44.1.1 Will Spring Security take care of all my application security requirements?Spring Security会满足我所有的应用程序安全需求吗?

Spring Security为您的身份验证和授权需求提供了一个非常灵活的框架,但是对于构建一个安全的应用程序,还有许多其他考虑事项超出了它的范围。Web应用程序容易受到各种各样的攻击,你应该熟悉这些攻击,最好是在你开始开发之前,这样你就可以从一开始就记住它们来进行设计和编码。查看OWASP网站,了解网络应用程序开发人员面临的主要问题,以及针对这些问题可以采取的对策。

44.1.2 Why not just use web.xml security?为什么不直接使用web.xml安全性呢?

假设您正在开发一个基于Spring的企业应用程序。您通常需要解决四个安全问题:身份验证、web请求安全、服务层安全(即实现业务逻辑的方法)和域对象实例安全(即不同的域对象具有不同的权限)。牢记这些典型要求:

1、身份验证:servlet规范提供了一种身份验证方法。但是,您需要配置容器来执行身份验证,这通常需要编辑容器特定的“领域”设置。这使得配置不可移植,如果您需要编写一个实际的Java类来实现容器的身份验证接口,它就变得更加不可移植。有了Spring Security,您可以实现完全的可移植性——一直到WAR级别。此外,Spring Security提供了一个经过生产验证的身份验证提供者和机制的选择,这意味着您可以在部署时切换您的身份验证方法。对于编写需要在未知目标环境中工作的产品的软件供应商来说,这尤其有价值。

2、网络请求安全性:servlet规范提供了一种方法来保护您的请求URIs。然而,这些URIs只能用servlet规范自己的有限URI路径格式来表示。Spring Security提供了一种更全面的方法。例如,您可以使用蚂蚁路径或正则表达式,您可以考虑URI的一部分,而不仅仅是请求的页面(例如,您可以考虑超文本传输协议获取参数),并且您可以实现自己的运行时配置数据源。这意味着您的web请求安全性可以在webapp的实际执行过程中动态更改。

3、服务层和域对象安全性:在servlet规范中缺乏对服务层安全性或域对象实例安全性的支持,这对于多层应用程序来说是一个严重的限制。通常,开发人员要么忽略这些需求,要么在他们的MVC控制器代码中实现安全逻辑(或者更糟,在视图中)。这种方法有严重的缺点:

a\关注点的分离:授权是一个横切关注点,应该这样实现。实现授权代码的MVC控制器或视图使得测试控制器和授权逻辑更加困难,调试更加困难,并且经常会导致代码重复。

b\对富客户端和web服务的支持:如果最终必须支持额外的客户端类型,那么嵌入在web层中的任何授权代码都是不可重用的。应该考虑到Spring远程处理导出器只导出服务层beans(而不是MVC控制器)。因此,授权逻辑需要位于服务层,以支持多种客户端类型。

c\分层问题:一个MVC控制器或视图仅仅是实现关于服务层方法或域对象实例的授权决策的不正确的架构层。虽然主体可以被传递给服务层,以使其能够做出授权决定,但是这样做会在每个服务层方法上引入额外的参数。一种更好的方法是使用线程本地来保存主体,尽管这可能会增加开发时间,从而使简单地使用专用的安全框架变得更加经济(基于成本效益)。

d\授权代码质量:人们常说网络框架“使做正确的事情更容易,做错误的事情更难。”安全框架是一样的,因为它们是以一种抽象的方式为广泛的目的而设计的。从头开始编写自己的授权代码并不能提供框架所能提供的“设计检查”,内部授权代码通常缺乏广泛部署、同行评审和新版本带来的改进。

对于简单的应用程序,servlet规范安全性可能就足够了。尽管在web容器可移植性、配置要求、有限的web请求安全性灵活性以及不存在的服务层和域对象实例安全性的背景下考虑,开发人员经常寻求替代解决方案的原因还是显而易见的。

44.1.3 What Java and Spring Framework versions are required?需要哪些Java和Spring框架版本?

Spring Security 3.0和3.1至少需要JDK 1.5,并且至少需要Spring 3.0.3。理想情况下,您应该使用最新版本来避免问题。 Spring Security 2.0.x要求最低JDK版本为1.4,并且是针对Spring 2.0.x构建的。它还应该与使用Spring 2.5.x的应用程序兼容

44.1.4 I’m new to Spring Security and I need to build an application that supports CAS single sign-on over HTTPS, while allowing Basic authentication locally for certain URLs, authenticating against multiple back end user information sources (LDAP and JDBC). I’ve copied some configuration files I found but it doesn’t work. What could be wrong?我是Spring Security的新手,我需要构建一个支持通过HTTPS进行CAS单点登录的应用程序,同时允许对某些URL进行本地基本身份验证,针对多个后端用户信息源(LDAP和JDBC)进行身份验证。我复制了一些我找到的配置文件,但它不起作用。有什么问题吗?

或者替代另一个复杂的场景…

实际上,在成功构建应用程序之前,您需要了解您打算使用的技术。安全很复杂。使用一个登录表单设置一个简单的配置,一些硬编码的用户使用Spring Security的名称空间是相当简单的。使用备份的JDBC数据库也很容易。但是如果你试图直接跳到这样一个复杂的部署场景,你几乎肯定会感到沮丧。建立类似CAS的系统、配置LDAP服务器和正确安装SSL证书所需的学习曲线有了很大的飞跃。所以你需要一步一步来。

从Spring Security的角度来看,您应该做的第一件事就是遵循网站上的“入门”指南。这将带你通过一系列的步骤来启动和运行,并对框架如何运行有所了解。如果你使用的是你不熟悉的其他技术,那么你应该做一些研究,并在将它们组合成一个复杂的系统之前,确保你可以单独使用它们。

44.2 Common Problems常见问题

1、Authentication

第44.2.1节,“当我尝试登录时,我收到一条错误消息,上面写着“不良凭据”。怎么了?”

第44.2.2节,“当我尝试登录时,我的应用程序进入了一个“无休止的循环”,发生了什么事?”

第44.2.3节,“我得到一个例外消息”访问被拒绝(用户是匿名的);“。怎么了?”

第44.2.4节:“为什么我在退出应用程序后仍能看到安全页面?”

第44.2.5节,“我收到一条异常消息:在安全上下文中找不到身份验证对象”。怎么了?”

第44.2.6节,“我无法使LDAP身份验证工作。”我的配置有什么问题?”

Session Management

第44.2.8节,“我使用Spring Security的并发会话控制来防止用户一次登录超过一次。当我登录后打开另一个浏览器窗口时,它不会阻止我再次登录。为什么我可以登录多次?”

第44.2.9节,“当我通过Spring Security进行身份验证时,为什么会话Id会改变?”

第44.2.10节:“我正在使用Tomcat(或其他一些servlet容器),并且已经为我的登录页面启用了HTTPS,之后切换回HTTP。”它不起作用-我只是在验证后返回登录页面。”

第44.2.12节:“我正在尝试使用并发会话控制支持,但它不允许我重新登录,即使我确定我已经注销并且没有超过允许的会话数。”

第44.2.13节:“Spring Security通过将创建会话属性设置为从不,正在某处创建会话,尽管我已将其配置为不创建会话。”

Miscellaneous

第44.2.14节,“执行开机自检时,我得到403禁止”

第44.2.15节:“我正在使用RequestDispatcher将一个请求转发到另一个URL,但是我的安全约束没有被应用。”

第44.2.16节:“我已经将Spring Security的<全局方法安全性>元素添加到我的应用程序上下文中,但是如果我将安全性注释添加到我的Spring MVC控制器beans中(Struts动作等)。)那么它们似乎没有效果。”

第44.2.17节:“我有一个用户已经过身份验证,但是当我在某些请求期间尝试访问SecurityContextHolder时,身份验证为空。为什么我看不到用户信息?”

第44.2.18节:“当使用URL属性时,授权JSP标签不尊重我的方法安全注释。”

44.3 Spring Security Architecture Questions春季安全架构问题

第44.3.1节,“我如何知道X类是哪个包?”

第44.3.2节,“名称空间元素如何映射到传统的bean配置?”

第44.3.3节,“角色”是什么意思?为什么我需要在我的角色名称中使用它

第44.3.4节,“我如何知道向我的应用程序添加哪些依赖项来使用Spring Security?”

第44.3.5节,“运行嵌入式ApacheDS LDAP服务器需要什么依赖关系?”

第44.3.6节,“什么是用户详细信息服务,我需要吗?”

44.4 Common “Howto” Requests常见的“如何”请求

第44.4.1节:“我需要用比用户名更多的信息登录。”如何添加对额外登录字段的支持(如公司名称)?”

第44.4.2节,“如果只有请求的网址的片段值不同(例如/foo#bar和/foo#blah),我如何应用不同的拦截网址约束?”

第44.4.3节,“如何在用户详细信息服务中访问用户的IP地址(或其他网络请求数据?”

第44.4.4节,“如何从用户详细信息服务设备访问Https会话?”

第44.4.5节,“如何在用户详细信息服务中访问用户密码?”

第44.4.6节,“如何在应用程序中动态定义受保护的网址?”

第44.4.7节,“如何针对LDAP进行身份验证,但从数据库中加载用户角色?”

第44.4.8节,“我想修改由命名空间创建的bean的属性,但是模式中没有任何东西支持它。”除了放弃使用名称空间,我还能做什么?”