Spring security学习笔记四

来源:互联网 发布:常见软件生命周期模型 编辑:程序博客网 时间:2024/06/05 04:11

一、理解安全过滤器链

Spring Security的web架构是完全基于标准的servlet过滤器的。 它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc), 所以它没有与任何特定的web技术强行关联。 它只管处理HttpServletRequest 和HttpServletResponse,不关心请求时来自浏览器,web服务客户端,还是一个AJAX应用。

Spring Security 一启动就会包含一批负责各种安全管理的过滤器,这些过滤器组成过滤器链。

在web中配置

刚才说到Spring Security需要一些过滤器,这些过滤器如果在web.xml中配置的话,配置起来就很繁琐了,这些过滤器还必须按照顺序来配置. 所以为了方便,就只在web.xml文件中配置了一个代理过滤器,它就相当于是一个入口,web容器启动的时候,由它到spring容器中启动spring Security需要的过滤器链。

既然如此,我们就需要在spirng容器中配置过滤器了。我们知道,代理类需要有个代理目标,web.xml文件中的DelegatingFilterProxy 所代理的目标类是什么呢?这个类就是:org.springframework.security.web.FilterChainProxy ,在spring容器中声明这个类,然后将要启动的过滤器链配置进去就完成了配置任务,下面是在applicationContext.xml文件中的配置:

事实上我们并没有这样配置,我们一般都用自动配置,如果不想用自动配置,可以按照上面配置然后自己写过滤器类。

自动配置:


spring security提供的过滤器的作用


1、HttpSessionContextIntegrationFilter

第一个起作用的过滤器,首先判断用户的session中是否已经存在一个SecurityContext了,如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,拱Spring Security其他部分使用。如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,拱其它部分使用。
在所有过滤器执行完毕后,清空SecurityContextHolde。

2、LogoutFilter

只处理注销请求,默认为/j_spring_security_logout . 在用户发送注销请求的时候,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。

3、AuthenticationProcessingFilter

处理 form 登陆的过滤器,与form 登陆有关的所有操作都是在此进行的。默认情况下只处理/j_spring_security_check 请求,这个请求应该是用户使用form登陆后的提交地址
此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面

4、DefaultLoginPageGeneratingFilter

此过滤器用来生成一个默认的登录页面,默认的访问地址为/spring_security_login,这个默认的登录页面虽然支持用户输入用户名,密码,也支持rememberMe 功能,但是因为太难看了,只能是在演示时做个样子,不可能直接用在实际项目中

5、BasicProcessingFilter

此过滤器用于进行 basic 验证,功能与AuthenticationProcessingFilter 类似,只是验证的方式不同

6、SecurityContextHolderAwareRequestFilter

此过滤器用来包装客户的请求。目的是在原始请求的基础上,为后续程序提供一些额外的数据。比如getRemoteUser()时直接返回当前登陆的用户名之类的。

7、RememberMeProcessingFilter

此过滤器实现 RememberMe 功能,当用户cookie 中存在rememberMe 的标记,此过滤器会根据标记自动实现用户登陆,并创建SecurityContext,授予对应的权限。

8、AnonymousProcessingFilter

为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。有关匿名登录功能的详细信息

9、ExceptionTranslationFilte

此过滤器的作用是处理中 FilterSecurityInterceptor 抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。

10、SessionFixationProtectionFilter

防御会话伪造攻击。

11、FilterSecurityInterceptor

用户的权限控制都包含在这个过滤器中。

功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。
功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。
功能三:如果用户已登录,也具有访问当前资源的权限,则放行。


二、管理回话

一个用户正确的登录了系统,并没有使用系统提供的”退出”功能,而是直接关掉浏览器,或者长时间不适用体统,Tomcat默认情况下会保存session 30分钟,30分钟后,会话就会过期。

我们可以配置Spring Security 检测失效的session ID,并把用户转发到对应的URL上,我们可以通过配置 session-management元素

在页面中提供“退出”链接
Spring Security在启动的时候,启动了一个过滤器LogoutFilter,它能够接收请求/j_spring_security_logout ,此时可以将当前登录的用户“踢”出系统

在页面中提供“退出”链接

Spring Security在启动的时候,启动了一个过滤器LogoutFilter,它能够接收请求/j_spring_security_logout

同步会话控制

多个用户不能使用同一个账号同时登陆系统。为了实现这个功能,我们首先要在web.xml文件中添加一个监听器,这个监听器会在session 创建和销毁的时候通知Spring Security。

第二次登录会让第一次登录失效。

通常我们更想防止第二次登录





0 0