spring-security上手笔记
博客专区 > v1-alpha 的博客 > 博客详情
spring-security上手笔记
v1-alpha 发表于2年前
spring-security上手笔记
  • 发表于 2年前
  • 阅读 24
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 读张卫滨翻译的spring security3及读一些源码的uml笔记

不安全隐患

>缺少URL保护和统一的认证造成的权限扩散

>授权不合理甚至缺失;

>数据库认证信息不安全且很容易获取

>个人的识别信息和敏感数据很容易获取或没有加密

>不安全的传输层保护,没有使用SSL加密

 

1)认证: 识别系统中的某一个用户,并将其与一个可信任的(安全的)实体关联;

2)授权:保证授权过的用户能够给功能和数据进行恰当的访问;

3)数据库认证信息不安全很容易获取:

4)敏感信息:如信用卡号等等;

5)数据传输层保护:

 

安全是一个组件

 

一些术语

认证:鉴别我们应用中的用户是他们所声明的那个人。

principal:已认证安全实体,用来唯一标识一个认证过的实体。大多数情况下,一个principal只是简单地代表一个用户user

授权:涉及2个方面:a)已认证的安全实体与一个或多个权限的匹配关系;b)分配 权限检查 系统中要进行安全保护的资源。

 

扩展和配置

>如何扩展和配置spring security来满足需求。Spring Security有强大的基础配置功能以及内置的认证功能。

 

 

1)Spring Securityxml配置文件:描述所有需要用到的spring security组件,这些组件将会控制标准的web请求;SecurityNamespaceHandler 解析Spring Securityxml配置文件

2)web.xml里添加DelegatingFilterProxy,拦截servletRequest请求

整体流程

过滤链

Spring Security使用过滤器链的概念并实现了自己的抽象,提供了VirtualFilterChain,可以根据Spring Security XML配置文件中设置的URL模式动态地创建过滤器链。过滤链的名称:默认是DelegatingFilterProxy配置的filter-name,或者特别配置beanName

        Spring Security拥有总共大约25个过滤器。过滤链的配置通过<http>元素实现。其中自动配置auto-config的选项会自动添加10Spring Secutiry的过滤器:顺序如下:

o.s.s.web.context.SecurityContextPersistenceFilter

负责从SecurityContextRepository获取或存储SecurityContextSecurityContext代表用户安全和认证过的session

http://dead-knight.iteye.com/blog/1513086

 

使用memcache存储,可以分布式。

默认通过session获取,多个应用同一个域名被坑。

o.s.s.web.authentication.logout.LogoutFilter

退出

监控一个实际为退出功能的URL(默认为/j_spring_security_logout),并在匹配时完成用户的退出功能

 

o.s.sweb.authentication.UsernamePasswordAuthenticationFileter

使用<http><form-login>子元素配置

form登录认证

监控一个使用用户名和密码基于form认证的URL(默认为/j_spring_security_check),并在URL匹配时尝试认证用户

o.s.s.webauthentication.ui.DefaultLoginPageGeneratingFilter

监控一个基于formOpenId认证的URL(默认为/spring_security_login),并生成展示登陆formHTML

o.s.s.web.authentication.www.BasicAuthenticationFilter

HTTP基本认证

监控HTTP基础认证的头信息并进行处理

o.s.s.web.saverequest.RequestCacheAwareFilter

用户用户登录成功后,重新恢复因为登陆被打断的请求

o.s.s.web.servletapi.SecurityContextHolderAwareRequestFilter

用一个扩展了HttpServletRequestWrapper的子类o.s.s.web.servletapi.SecurityContextHolderAwareRequestWrapper包装HttpServletRequest。它为请求处理器提供了额外的上下文信息。

o.s.s.web.authentication.AnonumousAuthenticationFilter

如果用户到这一步还没经过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。

o.s.s.web.session.SessionManagementFilter

根据认证的安全实体信息跟踪session,保证所有关联一个安全实体的session都能被跟踪到。session固化

o.s.s.web.access.ExceptionTranslationFilter

解决在处理一个请求时产生的指定异常

o.s.s.web.access.intercept.FilterSecurityInterceptor

简化授权和访问控制决定,委托一个AccessDecisionManager完成授权的判断。

 

org.springframework.security.config.http.HttpSecurityBeanDefinitionParser

使用order排序

认证

有两个重要接口的实现是在认证链中被这些参与的类初始化的,它们用来封装一个认证过(或还没有认证过的)的用户的详细信息和权限:

1)o.s.s.core.Authentication存储用户的详细信息,包括唯一标识(如用户名)、凭证信息(如密码)以及本用户被授予的一个或多个权限(o.s.s.core.GrantedAuthority)。开发人员通常会使用Authentication对象来获取用户的详细信息,或者使用自定义的认证实现以便在Authentication对象中增加应用依赖的额外信息。

             

异常

授权

投票器(voter)是在授权过程中的一个重要角色,它的作用是评估以下的内容:

l 要访问受保护资源的请求所对应上下文(如URL请求的IP地址);

l 用户的凭证信息(如果存在的话);

l 要试图访问的受保护资源;

l 系统的配置以及要访问资源本身的配置参数。请求资源的“访问声明信息”。

实际上Spring Security允许通过security命名空间来配置AccessDecisionManager<http>元素的access-decision-manager-ref属性来指明一个实现了AccessDecisionManagerSpring Bean

登录-退出

登录

1)配置form-login login-page屏蔽掉DefaultLoginPageGeneratingFilter

2)去掉登录页的权限验证过滤:

 

退出

remember me

Remember me功能设置了一个cookie在用户的浏览器上,它包含一个Base64编码的字符串,包含以下内容:

l 用户的名字;

l 过期的日期/时间;

l 一个MD5的散列值包括过期日期/时间、用户名和密码;

l 应用的key值,是在<remember-me>元素的key属性中定义的。

 

这些内容将被组合成一个cookie的值存储在浏览器中以备后用。

 

RememberMeAuthenticationFilter在过滤器链中,位于SecurityContextHolderAwareRequestFilter之后,而在AnonymousProcessingFilter之前。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
v1-alpha
粉丝 5
博文 57
码字总数 71691
×
v1-alpha
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: