• 1. Spring Security 介绍
  • 2. 目录1. SS简介 2. 工作原理 3. 配置介绍 4. DEMO
  • 3. 1. SS简介Spring Security是基于Spring的的权限认证框架,实现了Spring Security基于schema的配置方式。 使用配置 地址资源的访问控制 实现UserDetailsService接口,来指定用户和权限 与Acegi的比较 ,基于命名空间的配置更加简洁,可维护性更强; 基于命名空间的配置,我们无需再担心由于过滤器链的顺序而导致的错误 过滤器顺序在使用命名空间的时候是被严格执行的。它们在初始化的时候就预先被排好序。不仅如此,Spring Security规定,你不能替换那些元素自己使用而创建出的过滤器,比如HttpSessionContextIntegrationFilter, ExceptionTranslationFilter 或 FilterSecurityInterceptor。 不过Spring Security允许你把你自己的过滤器添加到队列中,使用custom-filter元素,并且指定你的过滤器应该出现的位置 不仅如此,你还可以使用after或before属性,如果你想把你的过滤器添加到队列中另一个过滤器的前面或后面。 可以分别在position属性使用"FIRST"或"LAST"来指定你想让你的过滤器出现在队列元素的前面或后面。 对于在http/intercept-url中没有进行定义的URL,将会默认使用系统内置的过滤器链进行权限认证。所以,你并不需要在http/intercept-url中额外定义一个类似/**的匹配规则。
  • 4. 2. Spring Security 工作原理Servlet Container Web UserFilterToBeanProxy IoC ContainerFilterChainProxyFilter 1Filter 3Filter 4Filter 5Filter 2Filter XServlet
  • 5. Spring Security 工作原理
  • 6. Spring Security 工作原理#Filter NameMain Purpose1HttpSessionContext IntegrationFilterStores SecurityContextHolder between HTTP requests2LogoutFilterClears SecurityContextHolder when logout requested3Authentication Mechanism FiltersPuts Authentication into SecurityContextHolder4Exception TranslationFilterConverts Acegi Security exceptions into HTTP5FilterSecurity InterceptorAuthorizes web filter requests based on URL patterns
  • 7. Spring Security 工作原理Authentication MechanismFilter 3Authentication “Request”ProviderManagerAuthentication “Response”createscreatescallsSecurity ContextHolderpopulatesreturns
  • 8. CAS工作原理
  • 9. CAS工作原理Servlet Container Web UserDispatcherServletWebFlow Controlleraction0action1actionnactionn-1. . .
  • 10. CAS工作原理actionnCredentialscreatesCentralAuthenticationServicecallsAuthentication ManagerAuthenticationcreatesreturnsTicketRegistryTicketcreatescallscalls
  • 11. 3.配置介绍Web/HTTP安全 - 最复杂的部分。设置过滤器和相关的服务bean来应用框架验证机制, 保护URL,渲染登录和错误页面还有更多。 业务类(方法)安全 - 可选的安全服务层。 AuthenticationManager - 通过框架的其它部分,处理认证请求。一个默认的实例会通过命名空间注册到内部。 AccessDecisionManager - 提供访问的决定,适用于web以及方法的安全。一个默认的主体会被注册,但是你也可以选择自定义一个,使用正常的spring bean语法进行声明。 AuthenticationProviders - 验证管理器验证用户的机制。 该命名空间提供几种标准选项,意味着使用传统语法添加自定义bean。 UserDetailsService - 密切相关的认证供应器,但往往也需要由其他bean需要。 下一章中,我们将看到如何把这些放到一起工作。
  • 12. 配置介绍使用数据库对用户和权限进行管理   一般来说,我们都有使用数据库对用户和权限进行管理的需求,而不会把用户写死在配置文件里。所以,我们接下来就重点讨论使用数据库对用户和权限进行管理的方法。   用户和权限的关系设计   在此之前,我们首先需要讨论一下用户(User)和权限(Role)之间的关系。Spring Security在默认情况下,把这两者当作一对多的关系进行处理。所以,在Spring Security中对这两个对象所采用的表结构关系大概像这样
  • 13. 配置介绍一般来说,我们会使用逻辑主键ID来标示每个User和每个Authorities(Role)。而且从典型意义上讲,他们之间是一个多对多的关系,我们会采用3张表来表示,下面是我在MySQL中建立的3张表的schema示例: 1.CREATE TABLE `user` ( 2. `id` int(11) NOT NULL auto_increment, 3. `name` varchar(255) default NULL, 4. `password` varchar(255) default NULL, 5. `disabled` int(1) NOT NULL, 6. PRIMARY KEY (`id`) 7.) ENGINE=InnoDB DEFAULT CHARSET=utf8; 8. 9.CREATE TABLE `role` ( 10. `id` int(11) NOT NULL auto_increment, 11. `name` varchar(255) default NULL, 12. PRIMARY KEY (`id`) 13.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 14. 配置介绍15.CREATE TABLE `user_role` ( 16. `user_id` int(11) NOT NULL, 17. `role_id` int(11) NOT NULL, 18. PRIMARY KEY (`user_id`,`role_id`), 19. UNIQUE KEY `role_id` (`role_id`), 20. KEY `FK143BF46AF6AD4381` (`user_id`), 21. KEY `FK143BF46A51827FA1` (`role_id`), 22. CONSTRAINT `FK143BF46A51827FA1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`), 23. CONSTRAINT `FK143BF46AF6AD4381` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) 24.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 15. 配置介绍通过配置SQL来模拟用户和权限   有了数据库的表设计,我们就可以在Spring Security中,通过配置SQL,来模拟用户和权限,这依然通过来完成: 1. 2. 5. 从这段配置模拟用户和权限的情况来看,实际上Spring Security对于用户,需要username,password,accountEnabled三个字段。对于权限,它需要的是username和authority2个字段。   也就是说,如果我们能够通过其他的方式,模拟上面的这些对象,并插入到Spring Security中去,我们同样能够实现用户和权限的认证。接下来,我们就来看看我们如何通过自己的实现,来完成这件事情。
  • 16. 配置介绍通过扩展Spring Security的默认实现来进行用户和权限的管理   事实上,Spring Security提供了2个认证的接口,分别用于模拟用户和权限,以及读取用户和权限的操作方法。这两个接口分别是:UserDetails和UserDetailsService。 非常清楚,一个接口用于模拟用户,另外一个用于模拟读取用户的过程。所以我们可以通过实现这两个接口,来完成使用数据库对用户和权限进行管理的需求。
  • 17. 配置示例配置Web.xml,增加过滤器DelegatingFilterProxy springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* 设置Spring配置文件,增加HTTP访问控制
  • 18. 配置示例设置Spring配置文件,增加用户认证配置
  • 19. DEMO
  • 20. 谢谢!