传智播客佟刚springsecurity_第1页
传智播客佟刚springsecurity_第2页
传智播客佟刚springsecurity_第3页
传智播客佟刚springsecurity_第4页
传智播客佟刚springsecurity_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring Secutity1简介Spring Security 是 Spring Framework 的一个子项目. 之前也叫做 Acegi Secruty.Spring Security 能用于保护各种 Java 应用程序(权限管理框架). 但在基于 Web 的应用程序中使用得最为广泛. Spring Security 能以声明的方式来保护 Web 应用程序的 URL 访问. 只需简单的配置即可实现.Spring Security 通过一系列 Servlet 过滤器为 Web 应用程序提供了多种安全服务. Spring Security 2.x 显著简化了配置, 使用基于 XML Sch

2、ema 和基于注解的配置.2HelloWorld 需求Spring-security 应用的根目录下有两个 Jsp 页面: index.jsp 和 admin.jsp. admin 用户有权限访问这两个页面, 而 user 用户只能访问 index.jsp提供”登出”功能admin(密码也为 admin) 用户user(密码也为 user) 用户3HelloWorld 搭建环境在 Spring 的 Web 应用中添加 spring-security-2.0.5distspring-security-core-2.0.5.RELEASE.jar4HelloWorld 配置 web.xml 文件在

3、 web.xml 文件里配置 DelegatingFilterProxy:将 HTTP 请求委托给 Spring 应用程序上下文中的一个 Bean . 被委托的 Bean 实现了 javax.servlet.Fitler 接口, 但它需要受 Spring IOC 容器管理, 而不是直接在 web.xml 中配置*.默认情况下, DelegatingFilterProxy 会把 HTTP 请求委托给和它的 属性相同的 Bean 上(也可以在 targetBeanName 初始参数中覆盖该 Bean 的名字). SpringSecurity 在 web 服务器加载当前 web 应用时配置一个名称为

4、 springSecurityFilterChain 的过滤器链(SpringSecurity 即通过该过滤器链为 web 应用提供安全服务), 所以 应该使用这个名字.5HelloWorld 配置 applicationContext-security.xml 文件虽然可以在 web 层和服务层的配置文件中配置 Spring Security, 但还是最好将安全配置单独放到一个文件中去. 需要将文件的位置加到 contextConfigLocation 参数中, 以便 ContextLoaderListener 可以在启动时加载它*.可以把 security 定义为默认的命名空间, 这样可以

5、省略 security 前缀. 6HelloWorld 配置 applicationContext-security.xml 文件7HelloWorld 配置 applicationContext-security.xml 文件详解(1) 元素自动配置好了典型 web 应用程序所需的基本安全服务:基于表单的登录服务: 为用户提供了用于登入应用程序, 包含登录表单的页面.登出服务: 提供了让用户能够登出应用程序的处理程序, 这个程序被映射为响应的 URL匿名登录: 为匿名用户分配一个安全主题并授权, 这样可以像普通用户一样来处理匿名用户.“记住我”支持: 能在多个浏览器会话中记住用户的身份, 通

6、常是在用户的浏览器中保存 Cookie.Servlet API 集成: 可以通过类似 HttpServletRequest.isUserInRole() 和 HttpServletRequest.getUserPrincipal() 这样的标准 API 在 web 应用程序中访问安全信息.8HelloWorld 配置 applicationContext-security.xml 文件详解(2) 配置元素中, 可以通过一个或多个 元素来限制对特定 URL 的访问.每个 元素指定了 URL 模式以及访问这些 URL 所必须的访问属性.在 URL 模式后总是要带上一个匹配符(*), 否则这个 UR

7、L 模式无法匹配带有参数的 URL. 在实际使用中, Spring Security采用的是一种就近原则, 当用户访问的url资源满足多个intercepter-url时,系统将使用第一个符合条件的intercept-url进行权限控制access指定的权限部分, 这些权限标示符都是以 ROLE_ 开头的, 这与Spring Security中的 Voter 机制有着直接的联系, 只有包含了特定前缀的字符串才会被Spring Security处理. 9HelloWorld 配置 applicationContext-security.xml 文件详解(3)在 元素中配置身份验证服务.Sprin

8、g Security 支持多种用户身份验证方式, 包括根据数据库进行验证或直接在 中定义用户信息:Authorities 属性定义了当前用户登陆之后将会拥有的权限,与intercept-url 中定义的权限内容一一对应. 每个用户可以同时拥有多个权限.10登出服务登出服务提供了一个处理程序来处理登出请求, 可以通过 的 子节点进行配置.默认被映射到 /j_spring_security_logout, 所以可以添加一个指向该 URL 的链接提供登出功能. 该 URL 可以通过 的 logout-url 属性进行自定义.默认情况下, 成功登出后用户会被重定向到上下文路径的根目录上. 可以通过修改

9、 logout-success-url 来进行自定义.11基于表单的登录Spring 提供了包含登录表单的默认页面, 同时允许用户自定义页面来充当登陆页面.可以通过 的 子节点配置基于表单的登录.默认情况下, Spring Security 会自动创建登录页面并将它映射到 /spring_security_login 上. 可以通过修改 的 login属性来修改该映射路径.若用户直接通过 URL 请求登录页面, 默认情况下在登录成功后会被转发到 web 应用的根目录上. 可以通过修改 default-target-url 属性来修改登录成功后的转发页面若用户直接通过 URL 请求登录页面, 默

10、认情况下在登录失败时会再次呈现带有错误信息的登录页面. 可以通过修改 authentication-failure-url 属性来修改登录失败后的转发页面.12处理视图Spring Security 提供了 JSP 标签库来帮助程序员在 JSP 视图中处理安全问题. 这些标签可以显示用户的验证信息, 也可以根据用户权限有条件地呈现视图内容.为了使用 Spring Security 标签库, 需要将 spring-security-taglibs-2.0.5.RELEASE.jar 复制到到 WEB-INF/lib 目录下. 标签提供了当前用户的 Authentication 对象, 在 pro

11、perty 属性中可以指定属性名称. 可以通过 name 属性指定用户的名称, authorities 指定用户的权限. 标签可以根据用户的权限有条件的呈现视图内容. ifAllGranted: 由逗号分隔的权限列表,用户必须拥有所有列出的权限才能显示标签体内容 ifAnyGranted: 用户必须至少拥有其中的一个就可以显示标签体内容 ifNotGranted: 用户必须不拥有其中的任何一个就可以显示标签体内容。13Spring Security 的架构要对Web资源进行保护, 最好的办法莫过于Filter, Spring Security 对Web资源的保护,就是靠Filter实现的web

12、 资源FilterHTTP 请求HTTP 相应14Spring Security 的架构一般来说, Filter 应该配置在 web.xml 中, 但Spring Security 在 web.xml 中配置的只是一个代理(DeletegatingFilterProxy)这些过滤器中的每一个都必须被注入来自 Spring 应用程序上下文的其他 Bean. 但 Servlet 规范并没有使得 Servlet 过滤器上的依赖注入容易进行. DeletegatingFilterProxy 通过充当 Spring 应用程序中被配置为 Bean 的实际过滤器的 “挂名人物” 来解决这个问题.真正起作用的

13、 Filter 是 Spring 上下文中的那些 Filter Bean. web.xml 中的代理依次调用这些Bean, 实现对Web资源的保护.15Spring Security 中的 Filter16Spring Security 中的 Filter17HttpSessionContextIntegrationFilter位于过滤器顶端, 第一个起作用功能一: 在执行其他过滤器之前, 率先判断用户的session中是否已经存在一个 SecurityContext 了. 如果存在,就把 SecurityContext拿出来, 放到SecurityContextHolder中, 供Sprin

14、g Security的其他部分使用. 如果不存在,就创建一个SecurityContext出来, 还是放到SecurityContextHolder中, 供Spring Security的其他部分使用功能二: 在所有过滤器执行完毕后, 清空SecurityContextHolder, 因为SecurityContextHolder是基于ThreadLocal的, 如果在操作完成后清空ThreadLocal, 会受到服务器的线程池机制的影响18 LogoutFilter只处理注销请求, 默认为/j_spring_security_logout用途: 在用户发送注销请求时, 销毁用户session

15、, 清空SecurityContextHolder, 然后重定向到注销成功页面. 若与rememberMe之类的机制结合,在注销的同时清空用户cookie19AuthenticationProcessingFilter 处理form登陆的过滤器, 与form登陆有关的所有操作都是在此进行的.默认情况下只处理/j_spring_security_check请求, 这个请求应该是用户使用form登陆后的提交地址此过滤器执行的基本操作时, 通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面, 也可能是默认的成功页面), 如果登录失败, 就跳转到失败页面20

16、RememberMeProcessingFilter 此过滤器实现RememberMe功能, 当用户cookie中存在rememberMe的标记, 此过滤器会根据标记自动实现用户登陆, 并创建SecurityContext, 授予对应的权限 21ExceptionTranslationFilter 此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常, 然后将请求重定向到对应页面, 或返回对应的响应错误代码. 22FilterSecurityInterceptor 用户的权限控制都包含在这个过滤器中功能一: 如果用户尚未登陆,则抛出AuthenticationCr

17、edentialsNotFoundException 异常功能二: 如果用户已登录,但是没有访问当前资源的权限, 则抛出AccessDeniedException“功能三: 如果用户已登录,也具有访问当前资源的权限,则放行23HelloWorld 程序的运行流程 - 登录(1)Spring Security 使用认证过程过滤器(AuthenticationProcessingFilter) 来处理表单认证, 当接受到与 filterProcessesUrl(默认值为: /j_spring_security_check) 所定义相同的请求时它开始工作AuthenticationProcessin

18、gFilter 调用AuthenticationManager (认证管理器)以确认用户的身份是否合法.org.springframework.security.AuthenticationManager 接口定义了一个 authenticate 方法, 它使用 Authentication 作为入口参数(只包含用户名和密码), 并在验证成功后返回一个完整的 Authentication 对象(包含用户的权 限信息GrantedAuthority数组对象)如果认证失败会抛出一个跳转到 authenticationFailureUrl 定义的 URLSpring Security 使用 vide

19、rs.ProviderManager(提供者管理器)类作为AuthenticationManager(认证管理器)的一个实现, 该类是继承自实现了AuthenticationManager 接口的 AbstractAuthenticationManager类.ProviderManager(提供者管理器) 自己并不实现身份验证, 而是把这项工作交给了多个认证提供者(提供者集合)24HelloWorld 程序的运行流程 - 登录(2)providers 属性定义了提供者管理器的集合, ProviderManager逐一遍历这个认证提供者的集合并调用提供者的 authenticate方法, 如果一

20、个提供者认证失败会尝试另外一个提供者直到某一个认证提供者能够成功的验证该用户的身份, 以保证获取不同来源的身份认证认证提供者(例如: DaoAuthenticationProvider) 从 Authentication 中得到带认证的用户名, 然后调用 UserDetailsService 对象的 loadUserByUsername 方法通过用户名来获取代表一个应用系统的用户 UserDetails 对象. 紧接着比较 Authentication 和 UserDetails 的匹配关系(密码是否匹配). 若两者匹配, 认证成功, 将 UserDetails 的权限信息复制到 Authentication中; 若不匹配, 认证失败.程序员可以自定义 UserDetailsService 接口的实现类, 将该类配置到 Spring 的 IOC 容器中. 然后在 节点的 user-service-ref 属性中引用该 Bean. 即可定制自定义的登录实现25HelloWorld 程序的运行流程 - 登录(3)AuthenticationProcessingFilterAuthenticationManagerAuthenticationProviderUserDetailsServiceloadUserByUsername() 方法26HelloWorld 程序的运行流程 -

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论