本指南的稍后张杰会对框架的架构和实现类进行一个深度的讨论,如果你的相对Spring Security进行一个深度定制没这一章节将会包含你需要了解的内容。在本章我们将会介绍Spring Security 3.0 给项目的历史进行简要的概述,简单的讲讲如何开始使用设个框架。尤其是我们将看看命名空间配置,他提供与传统Spring Bean你必须连接所有实现类的途径更简单的方式保护你的应用程序。
我们也会看看实例应用。在你阅读后面的章节之前你指的试着运行体验它。当时你对框架连接更多的时候你还可以汇过来回顾一下。 project website 同时请参阅项目的网站,因为他有创建这个项目的有用的信息,以及文章、视频和教程。
简介
Spring Security是什么?
Spring Security 提供了基于javaEE的企业应有个你软件全面的安全服务。这里特别强调支持使用SPring框架构件的项目,Spring框架是企业软件开发javaEE方案的领导者。如果你还没有使用Spring来开发企业应用程序,我们热忱的鼓励你仔细的看一看。熟悉Spring特别是一来注入原理两帮助你更快更方便的使用Spring Security。
人们使用Spring Secruity的原因有很多,单大部分都发现了javaEE的Servlet规范或EJB规范中的安全功能缺乏典型企业应用场景所需的深度。提到这些规范,重要的是要认识到他们在WAR或EAR级别无法移植。因此如果你更换服务器环境,这里有典型的大量工作去重新配置你的应用程序员安全到新的目标环境。使用Spring Security 解决了这些问题,也为你提供许多其他有用的,可定制的安全功能。
正如你可能知道的两个应用程序的两个主要区域是“认证”和“授权”(或者访问控制)。这两个主要区域是Spring Security 的两个目标。“认证”,是建立一个他声明的主题的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统)。“授权”指确定一个主体是否允许在你的应用程序执行一个动作的过程。为了抵达需要授权的店,主体的身份已经有认证过程建立。这个概念是通用的而不只在Spring Security中。
在身份验证层,Spring Security 的支持多种认证模式。这些验证绝大多数都是要么由第三方提供,或由相关的标准组织,如互联网工程任务组开发。另外Spring Security 提供自己的一组认证功能。具体而言,Spring Security 目前支持所有这些技术集成的身份验证:
- HTTP BASIC 认证头 (基于 IETF RFC-based 标准)
- HTTP Digest 认证头 ( IETF RFC-based 标准)
- HTTP X.509 客户端证书交换 ( IETF RFC-based 标准)
- LDAP (一个非常常见的方法来跨平台认证需要, 尤其是在大型环境)
- Form-based authentication (用于简单的用户界面)
- OpenID 认证
- Authentication based on pre-established request headers (such as Computer Associates Siteminder) 根据预先建立的请求有进行验证
- JA-SIG Central Authentication Service (CAS,一个开源的SSO系统 )
- Transparent authentication context propagation for Remote Method Invocation (RMI) and HttpInvoker (Spring远程协议)
- Automatic "remember-me" authentication (你可以勾选一个框以避免预定的时间段再认证)
- Anonymous authentication (让每一个未经验证的访问自动假设为一个特定的安全标识)
- Run-as authentication (在一个访问应该使用不同的安全标识时非常有用)
- Java Authentication and Authorization Service (JAAS)
- JEE container autentication (所以如果愿你以可以任然使用容器管理的认证)
- Kerberos
- Java Open Source Single Sign On (JOSSO) *
- OpenNMS Network Management Platform *
- AppFuse *
- AndroMDA *
- Mule ESB *
- Direct Web Request (DWR) *
- Grails *
- Tapestry *
- JTrac *
- Jasypt *
- Roller *
- Elastic Path *
- Atlassian Crowd *
- Your own authentication systems (see below)
表示由第三方提供
很多独立软件供应商,因为灵活的身份验证模式二选择Spring Security。这样做允许他们快速的集成到他们的终端客户需求的解决方案而不用进行大量工程或者改变客户的环境。如果上面的验证机制不符合你的需求,Spring Security 是一个开放的平台,要实现你 自己的验证机制检查。Spring Security 的许多企业用户需要与不遵循任何安全标准的“遗留”系统集成,Spring Security可以很好的与这类系统集成。
无论何种身份验证机制,Spring Security提供一套的授权功能。这里有三个主要的热点区域,授权web请求、授权方法是否可以被调用和授权访问单个域对象的实例。为了帮助让你分别了解这些差异,认识在Servlet规范网络模式安全的授权功能,EJB容器管理的安全性和文件系统的安全。Spring Security在这些重要的区域提供授权功能,我们将在手册后面进行介绍。
OpenId
的验证CORS
)PortMapper(HttpSecurity#(getSharedObject(class)))
,其他提供SecurityConfigurer
的对象使用PortMapper
从HTTP
重定向到HTTPS
或者从HTTPS
重定向到HTTP
。 默认情况下,Spring Security
使用一个PortMapperImpl
映射HTTP
端口8080
到HTTPS
端口8443
,HTTP
端口80
到HTTPS
端口443
x509
的认证“记住我”
的验证HttpServletRequest
限制访问HttpServletRequests
之间的SecurityContextHolder
上设置SecurityContext
的管理。 当使用WebSecurityConfigurerAdapter
时,这将自动应用HttpServletRequest
方法与在其上找到的值集成到SecurityContext
中。 当使用WebSecurityConfigurerAdapter
时,这将自动应用CSRF
支持,使用WebSecurityConfigurerAdapter
时,默认启用WebSecurityConfigurerAdapter
时,这将自动应用。 默认情况是,访问"URL/logout”
,使HTTP Session
无效来清除用户,清除已配置的任何#rememberMe()
身份验证,清除SecurityContextHolder
,然后重定向到”/login?success”
WebSecurityConfigurerAdapter
结合使用时,这将自动应用。 默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken
表示,并包含角色“ROLE_ANONYMOUS”
FormLoginConfigurer#loginPage(String)
,则将生成默认登录页面OAuth 2.0
或OpenID Connect 1.0
提供程序配置身份验证Http Basic
验证Filter
类的位置添加过滤器我们在WebSecurityConfig 类使用了 @EnableWebSecurity 注解 ,该注解提供 spring security的支持以及springMvc的集成支持,配合 @Configuration 注解,即可构成一个 spring security 的配置;
其中我们自己写的WebSecurityConfig 类必须是扩展了 WebSecurityConfigurerAdapter 抽象类的类;我们就是通过它,告诉 spring security ,哪些用户需要经过身份验证,通过何种方式验证;
其中我们选择覆写一些方法,来做一些安全的细节设置,达到上面的目的,比如,配置 :拦截什么URL、设置什么权限,检验表单数据 等 ;
userDetailsService() 方法,在内存中添加了一个用户,并设置了其角色、用户名、密码,不多讲;
1)SecurityContextHolder
spring security最基本的类SecurityContextHolder这里存储应用程序当前安全上下文的详细信息,其中包括当前使用的主体的详细信息,它使用ThreadLocal来存储这些信息,这意味着安全上下文对于整个线程的所有方法来讲都可用的,但是这不是对所有的应用来讲都是适用的,因为有些应用会要求所有的线程使用同一个上下文对象,这时我们将使用SecurityContextHolder.MODE_GLOBAL来应对
2)获取当前用户的信息
在SecuritycontextHolder中,我们存储当前与应用程序交互的主体的详细信息。Spring Security使用身份验证对象表示此信息。您通常不需要自己创建身份验证对象,但是用户查询身份验证对象是相当常见的。例如,您可以从应用程序中的任何位置使用以下代码块来获取当前经过身份验证的用户的名称
调用getContext()返回的对象是SecurityContext接口的一个实例。这是保存在线程本地存储中的对象。正如我们将在下面看到的,Spring Security中的大多数身份验证机制都返回一个UserDetails实例作为主体