>缺少URL保护和统一的认证造成的权限扩散
>授权不合理甚至缺失;
>数据库认证信息不安全且很容易获取
>个人的识别信息和敏感数据很容易获取或没有加密
>不安全的传输层保护,没有使用SSL加密
1)认证: 识别系统中的某一个用户,并将其与一个可信任的(安全的)实体关联;
2)授权:保证授权过的用户能够给功能和数据进行恰当的访问;
3)数据库认证信息不安全很容易获取:
4)敏感信息:如信用卡号等等;
5)数据传输层保护:
安全是一个组件
认证:鉴别我们应用中的用户是他们所声明的那个人。
principal:已认证安全实体,用来唯一标识一个认证过的实体。大多数情况下,一个principal只是简单地代表一个用户user。
授权:涉及2个方面:a)已认证的安全实体与一个或多个权限的匹配关系;b)分配 权限检查 给 系统中要进行安全保护的资源。
>如何扩展和配置spring security来满足需求。Spring Security有强大的基础配置功能以及内置的认证功能。
1)Spring Security的xml配置文件:描述所有需要用到的spring security组件,这些组件将会控制标准的web请求;SecurityNamespaceHandler 解析Spring Security的xml配置文件
2)web.xml里添加DelegatingFilterProxy,拦截servletRequest请求
Spring Security使用过滤器链的概念并实现了自己的抽象,提供了VirtualFilterChain,可以根据Spring Security XML配置文件中设置的URL模式动态地创建过滤器链。过滤链的名称:默认是DelegatingFilterProxy配置的filter-name,或者特别配置beanName
Spring Security拥有总共大约25个过滤器。过滤链的配置通过<http>元素实现。其中自动配置auto-config的选项会自动添加10个Spring Secutiry的过滤器:顺序如下:
o.s.s.web.context.SecurityContextPersistenceFilter |
负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext代表用户安全和认证过的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 |
监控一个基于form或OpenId认证的URL(默认为/spring_security_login),并生成展示登陆form的HTML |
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属性来指明一个实现了AccessDecisionManager的Spring Bean。
登录
1)配置form-login login-page屏蔽掉DefaultLoginPageGeneratingFilter;
2)去掉登录页的权限验证过滤:
退出
Remember me功能设置了一个cookie在用户的浏览器上,它包含一个Base64编码的字符串,包含以下内容:
l 用户的名字;
l 过期的日期/时间;
l 一个MD5的散列值包括过期日期/时间、用户名和密码;
l 应用的key值,是在<remember-me>元素的key属性中定义的。
这些内容将被组合成一个cookie的值存储在浏览器中以备后用。
RememberMeAuthenticationFilter在过滤器链中,位于SecurityContextHolderAwareRequestFilter之后,而在AnonymousProcessingFilter之前。