基于Spring Security的web应用安全控制研究与实现
摘要:针对web应用安全控制问题,提出了一种基于Spring Security开源的安全框架的解决方案,分别从web应用中的用户认证和授权两个方面实现对web应用安全的控制,从而提高web应用的安全性。
关键词:web应用 Spring Security 安全 访问控制
0 引言
Web应用作为一种开放式的服务平台,其无时无刻不在面临非法访问者的访问或者攻击,同时也面临内部用户的非法操作,使得存储在Web应用中的数据时刻可能被窃取和破坏的危险。这就需要我们提供一定的安全控制规则来确保Web应用的安全。然而在系统实施Web应用安全控制的时候,主要有:基于Web容器的安全认证。基于第三方插件的安全认证。独立开发的安全认证。对于第一种方式,它是传统的安全认证方式,对具体的Web服务器依赖强,移植代价高。对于第二种方式,不依赖具体的Web服务器,灵活性强,但受自身功能限制,因此,插件选取很关键。对于第三种方式,其将代码耦合到相应的业务逻辑中,增加维护的难度,降低了开发效率,不便调试。从灵活性、易用性、功能和投入等方面考虑,第二种方式是一种比较理想的方式。如在J2EE平台比较流行的开源框架Spring Security,其提供了描述性安全访问控制解决方案。本文通过对Spring Security安全框架的工作原理进行简单的剖析并展示如何将Spring Security安全框架应用到我们具体的Web应用中。
1 Spring Security简介
如引言所阐述的,Web应用的安全控制主要包括外部和内部两个方面。在安全控制的时候需要从以下几个方面考虑:能够认证合法的用户、能够对Web 请求进行安全保护、能够对业务层面的方法进行安全保护、能够做到对实体级别的保护等四个方面,而这四方面概括起来则分为两部分用户认证和用户授权。用户认证是指证某个用户是否为系统中的合法主体,即用户是否能够访问该Web应用,用户认证一般通过验证用户名和密码来完成认证。用户授权指的是验证用户在访问过程中是否有权限执行某个操作。
Spring是一款轻量级的开源框架,采用Java语言实现的[1]。Spring Security是基于Spring的安全框架,其充分运用了Spring中的依赖注入(DI,Dependency Injection)和面向切面(AOP ,Aspect Oriented Programming)技术,使得开发者可以通过XML配置文件以无侵入式的方式快速的将其部署到已有或者新的Web应用中。它提供了认证、授权、访问控制、会话管理等多种功能,用于加强任何Java应用的安全,但最常用于基于Web的应用。在Web安全控制的两个部分,Spring Security分别提供了多种实现方式。在用户认证部分,Spring Security提供了包括HTTP基本认证、HTTP表单认证、HTTP摘要认证、OpenId和LDAP等主流的认证方式。在用户授权部分,Spring Security提供了基于角色的访问控
制和访问控制列表(Access Control List,ACL),可以实现领域对象的细粒度控制[2]。
1.1 Spring Security原理
Spring Security 框架的主要组成部分是: 安全代理、认证管理、访问决策管理、运行身份管理和调用后管理等[3]。其对访问对象的整体控制流程框架如图1所示:
图1 Spring Security访问控制流程框架
(1)安全代理
安全代理的主要作用是拦截所用用户的请求,并协调其他安全管理器实现安全控制。它的配置方式是在Web.xml中配置DelegatingFilterProxy实例,DelegatingFilterProxy负责的是将HTTP请求委派给实现java.util.logging.Filter接口的Spring Bean。
(2)认证管理
确定用户的身份和凭证。其配置是在Spring Security提供的XML标签中配置,为认证配置相应的认证方式,同时在配置中为认证方式配置认证的凭证。
(3)访问控制决策管理
关于是否允许用户访问应用中的一个资源做决策。它的工作原理是通过访问控制决策管理器中的投票者对访问控制决策投票,投票者可以投票赞成授权、弃权或者拒绝访问资源。
(4)运行时身份管理
确人当前的主体和凭证的授权在保护资源的权限变化适应。
(5)调用后管理
确认主体和凭证的权限是否被允许查看保护的资源返回的数据。
2 Spring Security在应用中的部署和环境的设置
如Spring Security的简介所述,Spring Security是基于Spring的安全框架,所以在部署Spring Security之前一定要确保Spring框架环境已经设置好以及Spring Security的jar已经部署到lib中。
2.1 在web.xml中配置安全代理:
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain/*
同时为Spring Security安全控制指定其配置文件,虽然我们可以将Web和服务层配置以及安全配置文件配置到同一个配置文件中,但是将安全配置分离到一个单独的文件(如spring-security.xml)做法更好,易于维护[2]。在web.xml中指定安全配置文件位置,让ContextLoaderLister在启动时加载该文件。
contextConfigLocation ...
/WEB-INF/spring-security.xml
2.2 认证管理的配置
2.2.1HTTP安全配置
这里我们为认证管理配置了基于表单的认证方式,其中login-page、
defaulet-target-url和authentication-failure-url这三个属性分别指定了默认的登入界面、登陆成功跳转的页面和登陆失败后跳转的页面,其中login.jsp必须使用Spring Security专有的表单操作URL和输入字段名称,当然也可以不用配置这三个属性,因为Spring Security已经默认为我们提供了,这也就是为什么login.jsp中必须包含Spring Security专有的表单操作URL和输入字段名称。这里我们也可以配置其他的认证方式如HTTP基本验证,其和表单认证同时启用时会采用后者。atuo-config=“true”表示自动配置典型的web应用安全需要的基本安全服务,如intercept-url,将访问属性与用户的权限比较,确定用户可以访问相应的URL。
2.2.2验证器配置:
默认情况下,Spring security是采用如下SQL语句查询用户细节和权限:
select username,password,enabled from users where username=?
select username,authority from authorities where username=?
为了让Spring Security用这些语句查询用户细节,我们必须在数据库中创建对应的表。但往往当我们把Spring Security部署到我们的Web应用中,用户细节信息已经存在数据库了,此时通过自定义的SQL语句查询遗留数据库中的用户细节:
同时我们也可以在认证管理器中为数据库配置相应的加密算法,目前应用最广的加密算法的是MD5加密。
2.3 访问控制决策管理配置
在Spring Security中,其默认为提供三种基于投票的访问决策管理器,分别为AffirmativeBased:至少一个投票者投票赞成授予权限、ConsensusBased:投票者一致赞成授予权限和UnanimousBased:所有投票者赞成或者弃权(没有拒绝访问的投票者)。默认情况下,如果我们没有指定访问决策管理器,则Spring Security自动配置一个AffirmativeBased访问控制管理器,其包含了两个投票者:RoleVoter和AuthenticatedVoter。其中RoleVoter根据用户角色对访问控制决策投票,其只处理以ROLE_前缀开始的访问属性,当然我们也可以定制的。AuthenticatedVoter则是根据用户验证级别对控制决策投票。但是有时这个访问决策管理器并不能满足我们的需求,此时我们可以自己创建相应的管理器,往往多数情况下,我们只需要自定义一个投票者,投票者需要实现AccessDecisionVoter接口即可,并在投票者中指定只对如IP_前缀开始的访问属性投票,然后将投票者部署到访问决策管理器中。如
因篇幅问题不能全部显示,请点此查看更多更全内容