没有合适的资源?快使用搜索试试~ 我知道了~
首页使用 Spring Security 保护 Web 应用的安全
资源详情
资源评论
资源推荐
使用 Spring Security 保护 Web 应用的安全
http://www.ibm.com/developerworks/cn/java/j-lo-springsecurity/#major4
在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,
但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问 题,就可能陷
入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用
户的隐私数据被攻击者窃取;另一方面,应用的基本架构 已经确定,要修复安全漏洞,可能需
要对系统的架构做出比较重大的调整,因而需要更多的开发时间,影响应用的发布进程。因
此,从应用开发的第一天就应该把安 全相关的因素考虑进来,并在整个应用的开发过程中。
本文详细介绍了如何使用 Spring Security 来保护 Web 应用的安全。Spring Security 本身
以及 Spring 框架带来的灵活性,能够满足一般 Web 应用开发的典型需求,并允许开发人员
进行定制。下面首先简单介绍 Spring Security。
Spring Security 简介
Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,
提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证
(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户
是否为系统中 的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名
和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户 是否有权
限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有
的用户只能进行读取,而有的用户可以进行修改。一般来说, 系统会为不同的用户分配不同的
角色,而每个角色则对应一系列的权限。
对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。在用户认证方
面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验
证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于
角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进
行细粒度的控制。
本文将通过三个具体的示例来介绍 Spring Security 的使用。第一个示例是一个简单的企业员
工管理系统。该系统中存在三类用户,分别是普通员工、经理和总裁。不同类别的用户所能访
问的资源不同。对这些资源所 能执行的操作也不相同。Spring Security 能帮助开发人员以简
单的方式满足这些安全性相关的需求。第二个示例展示了如何与 LDAP 服务器进行集成。第三
个示例展示了如何与 OAuth 进行集成。下面首先介绍基本的用户认证和授权的实现。
基本用户认证和授权
本节从最基本的用户认证和授权开始对 Spring Security 进行介绍。一般来说,Web 应用都
需要保存自己系统中的用户信息。这些信息一般保存在数据库中。用户可以注册自己的账号,
或是由系统管理员统一进行分配。这些用户一般都有自己的角 色,如普通用户和管理员之类
的。某些页面只有特定角色的用户可以访问,比如只有管理员才可以访问 /admin#这样的网
址。下面介绍如何使用 Spring Security 来满足这样基本的认证和授权的需求。
首先需要把 Spring Security 引入到 Web 应用中来,这是通过在 web.xml 添加一个新的过
滤器来实现的,如 代码清单 1 #所示。
清单 1. 在 web.xml 中添加 Spring Security 的过滤器
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
#
Spring Security 使用的是 Servlet 规范中标准的过滤器机制。对于特定的请求,Spring
Security 的过滤器会检查该请求是否通过认证,以及当前用户是否有足够的权限来访问此资
源。对于非法的请求,过滤器会跳转到指定页面让用户进行认证,或是返回出错信 息。需要注
意的是,代码清单 1 #中虽然只定义了一个过滤器,Spring Security 实际上是使用多个过滤器
形成的链条来工作的。
下一步是配置 Spring Security 来声明系统中的合法用户及其对应的权限。用户相关的信息是
通过 org.springframework.security.core.userdetails.UserDetailsService#接口来加载
的。该接口的唯一方法是 loadUserByUsername(String username),用来根据用户名加载
相关的信息。这个方法的返回值是
org.springframework.security.core.userdetails.UserDetails#接口,其中包含了用户的信
息,包括用户名、密码、权限、是否启用、是否被锁定、是否过期等。其中最重要的是用户权
限,由 org.springframework.security.core.GrantedAuthority#接口来表示。虽然 Spring
Security 内部的设计和实现比较复杂,但是一般情况下,开发人员只需要使用它默认提供的实
现就可以满足绝大多数情况下的需求,而且只需要简单的配置声明即可。
在第一个示例应用中,使用的是数据库的方式来存储用户的信息。Spring Security 提供了
org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl#类来支持从数据库中
加载用户信息。开发人员只需要使用与该类兼容的数据库表结构,就可以不需要任何改动,而
直接使用该类。代码清单 2 #中给出了相关的配置。
清单 2. 声明使用数据库来保存用户信息
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
<property name="url" value="jdbc:derby://localhost:1527/mycompany" />
<property name="username" value="app" />
<property name="password" value="admin" />
</bean>
<bean id="userDetailsService"
class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<sec:authentication-manager>
<sec:authentication-provider user-service-ref="userDetailsService" />
</sec:authentication-manager>
#
如 代码清单 2 #所示,首先定义了一个使用 Apache Derby 数据库的数据源,Spring
Security 的 org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl#类使用
该数据源来加载用户信息。最后需要配置认证管理器使用该 UserDetailsService。
接着就可以配置用户对不同资源的访问权限了。这里的资源指的是 URL 地址。配置的内容如
代码清单 3 #所示。sec#是 Spring Security 的配置元素所在的名称空间的前缀。
清单 3. 配置对不同 URL 模式的访问权限
<sec:http>
<sec:intercept-url pattern="/president_portal.do**" access="ROLE_PRESIDENT" />
<sec:intercept-url pattern="/manager_portal.do**" access="ROLE_MANAGER" />
<sec:intercept-url pattern="/**" access="ROLE_USER" />
<sec:form-login />
<sec:logout />
</sec:http>
#
第一个示例应用中一共定义了三种角色:普通用户、经理和总裁,分别用 ROLE_USE
R、ROLE_MANAGER#和 ROLE_PRESIDENT#来表示。代码清单 3 #中定义了访问不同的 URL
模式的用户所需要的角色。这是通过 <sec:intercept-url>#元素来实现的,其属性 pattern#
声明了请求 URL 的模式,而属性 access#则声明了访问此 URL 时所需要的权限。需要按照
URL 模式从精确到模糊的顺序来进行声明。因为 Spring Security 是按照声明的顺序逐个进行
比对的,只要用户当前访问的 URL 符合某个 URL 模式声明的权限要求,该请求就会被允许。
如果把代码清单 3 #中本来在最后的 URL 模式 /**#声明放在最前面,那么当普通用户访
问 /manager_portal.do#的时候,该请求也会被允许。这显然是不对的。通过 <sec:form-
login>#元素声明了使用 HTTP 表单验证。也就是说,当未认证的用户试图访问某个受限 URL
的时候,浏览器会跳转到一个登录页面,要求用户输入用户名和密码。<sec:logout>#元素声
明了提供用户注销登录的功能。默认的注销登录的 URL 是/j_spring_security_logout,可以
通过属性 logout-url#来修改。
当完成这些配置并运行应用之后,会发现 Spring Security 已经默认提供了一个登录页面的实
现,可以直接使用。开发人员也可以对登录页面进行定制。通过 <form-login>#的属性 login-
page、login-processing-url#和 authentication-failure-url 就可以定制登录页面的 URL、
登录请求的处理 URL 和登录出现错误时的 URL 等。从这里可以看出,一方面 Spring
Security 对开发中经常会用到的功能提供了很好的默认实现,另外一方面也提供了非常灵活的
定制能力,允许开发人员提供自己的实现。
在介绍如何用 Spring Security 实现基本的用户认证和授权之后,下面介绍其中的核心对象。
SecurityContext 和 Authentication 对象
剩余14页未读,继续阅读
wenxing123
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1