配置Struts 2应用程序的安全功能
安全性是Web应用程序开发工作中最关键的问题之一。在基于servlet的应用程序里,保护应用程序资源的办法有两种:一是对应用程序进行配置 (web.xml),二是使用Java代码硬编码到程序中。前一种方法使用配置文件,该方法很灵活,这是因为通过使用配置文件,无需改写任何代码就可以改 变安全策略,是一种常见的手段。而Struts 2是基于servlet技术的,所以Struts 2的安全策略也可以使用配置文件进行灵活的配置
配置安全策略时,有两个概念需要清楚的区分 ,用户和角色,简单的说用户为使用计算机的人,可以是个人或组织。角色是一个抽象的概念,泛指职务或者权限。例如,张三,李四,王五三个人,有职员、主管 和经理三个职务(权限),张三是用户,张三可以是主管职务,代表张三这个用户含有主管的权利。
不同的servlet容器所提供的用户和角色管理机制是不相同的。我使用的是Tomcat服务器,它提供的用户和角色管理机制文件是在其安装目录下的conf目录中的tomcat-users.xml文件,可以在这个文件里完成对用户和角色的编辑。例如:
<tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> </tomcat-users>
这个文件定义了2个角色(tomcat和role1)和3名用户(tomcat、both和role1)。你可以在tomcat-users.xml文件里定义任意多个用户和角色。
使用Struts 2保护应用程序的资源
Struts 2应用程序的安全策略是通过部署web.xml文件中的security-constraint元素实现的,该元素的语法定义:
<!ELEMENT security-constraint (display-name?, web-resource-collection+, auth-constraint?, user-data-constraint?)> <!ELEMENT display-name (#PCDATA)> <!ELEMENT web-resource-collection (web-resource-name, description?, url-pattern*, http-method*)> <!ELEMENT auth-constraint (description?, role-name*)> <!ELEMENT user-data-constraint (description?, transport-guarantee)>
该语法说明了,security-constraint元素可以有一个可选的display-name子元素,至少一个web-resource- collection子元素,一个可选的auth-constraint子元素和一个可选的user-data-constraint子元素。
web-resource-collection子元素是用来列出打算保护的Web资源,具体的做法是为这些资源设置URL限制,它是通过设置web-resource-collection元素包含的子元素实现的:
- web-resource-name:是与受保护资源相关联的名称。该子元素为必须元素。
- description:对给定资源的描述。这个子元素为可选元素。
- url-pattern:用来设置URL表达式,与这个URL表达式相匹配的URL地址指向的资源将受到保护。该子元素为至少有一个,为必须元素。
- http-method:用来表明哪些HTTP方法将受到限制,例如设置为GET那么所有的GET请求就将受到限制。该元素为可选元素。
auth-constraint元素用于指定可以访问该资源用户角色集合。如果没有指定auth-constraint元素,就将安全约束应用于所有角色。它包含下面几个子元素:
- description:描述。该元素是可选元素。
- role-name:可以访问保护资源的用户角色。该元素可以有多个。
user-data-constraint元素用来设置怎样保护在客户端和Web容器之间传递的数据。
- description: 描述。可选元素。
- transport-guarantee :该元素有以下几个值
● NONE,这意味着应用不需要传输保证。
● INTEGRAL,意味着服务器和客户端之间的数据必须以某种方式发送,而且在传送中数据不能被篡改。
● CONFIDENTIAL,这意味着传输的数据必须加密。
配置完毕security-constraint元素的基本信息,大致为下面的格式:
<security-constraint> <web-resource-collection> <web-resource-name>Admin Arew</web-resource-name> <url-pattern>*.action</url-pattern> </web-resource-collection> <auth-constraint> <role-name>myeclipseWeb</role-name> </auth-constraint> </security-constraint>
这个security-constraint元素的效果为:只要与表达 式"*.action"匹配的请求不是来自拥有"myeclipseWeb"权限的用户,Web容器就会阻断它。在这里还可以使用http-method 元素,阻断特定方法的请求,因为没有使用会阻断所有方法提交的请求。
♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣
设置完安全策略后,还需要设置让用户有机会提供证明,证明自己有权限访问这个受限资源的登陆方法。允许使用的登陆方法使用login-config元素设置,下面为login-config元素的语法定义:
<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)> <!ELEMENT auth-method (#PCDATA)> <!ELEMENT realm-name (#PCDATA)> <!ELEMENT form-login-config (form-login-page, form-error-page)>
login-config子元素的描述如下:
● auth-method指定用来验证用户身份的方法。它的值为下面的一个:BASIC、DIGEST、FORM或 CLIENT-CERT
● realm-name指定HTTP Basic验证中在标准登陆框中显示的一条提示。
● form-login-config元素是在<auth-method>元素值为"FORM"时使用的。它是指定基于表单的登录中应该使用的 登录页面和出错页面。如果没有使用基于表单的验证,则忽略这些元素。这个元素的定义如下,其中form-login-page用于指定显示登录页面的资源 路径, form-error-page则用于指定用户登录失败时显示出错页面的资源路径。
<!ELEMENT form-login-config (form-login-page, form-error-page)> <!ELEMENT form-login-page (#PCDATA)> <!ELEMENT form-error-page (#PCDATA)>
♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣ ♣
设置完登陆方法后,还应该使用security-role元素,注册允许用来访问受保护资源所有角色。在该元素内部使用一个role-name子元素来注册一个角色。例如:
<security-role> <role-name>myeclipseWeb</role-name> </security-role>
注册了一个"myeclipseWeb"的角色。
演示示例:使用BASIC登陆方法验证用户身份
1.我使用的Servlet容器是Tomcat,找到它的目录下conf目录中的tomcat-users.xml文件打开内容如下:
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="myeclipseWeb"/> <role rolename="myeclipseWebservices"/> <user username="webservices" password="webservices-pwd" roles="myeclipseWebservices"/> <user username="admin" password="admin-pwd" roles="myeclipseWeb,myeclipseWebservices"/> <user username="web" password="web-pwd" roles="myeclipseWeb"/> </tomcat-users>
我使用的IDE是myEclipse9.0,它配置好Tomcat下的tomcat-users.xml文件内容如上,我直接使用它了,你也可以添加自己的角色和用户。该文件定义了2个角色和3个用户,每一个用户都由自己的角色(或者说权限,可以有多重权限)。
2.创建Web项目,找到web.xml,配置它,使它支持Struts 2并且启动Struts 2的安全策略
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Struts Blank</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 配置应用程序需要保护的资源与什么角色才可以访问它 --> <security-constraint> <!-- 用来列出打算保护的资源, --> <web-resource-collection> <!-- 一个资源的标示符,这个子元素必须给出 --> <web-resource-name>Admin Arew</web-resource-name> <!-- 用来给定一个URL模式,与这个模式相匹配的URL地址的资源将受到保护 --> <url-pattern>*.action</url-pattern> </web-resource-collection> <!-- 用来定义定义那些用户访问受保护的资源 --> <auth-constraint> <!-- 允许访问受保护资源的角色用户可以定义一个或者零个role-name子元素 --> <role-name>myeclipseWeb</role-name> </auth-constraint> </security-constraint> <!-- 注册可以访问保护资源的角色 --> <security-role> <!----> <role-name>myeclipseWeb</role-name> </security-role> <security-role> <role-name>myeclipseWebservices</role-name> </security-role> <!-- 设置登录方法 --> <login-config> <!-- 具体指定用来验证用户自身的方法,它的可取值是BASIC DIGEST FORM CLIENT-CERT之一 --> <auth-method>BASIC</auth-method> <!-- 用来给定一条提示:这条提示将显示在标准的登陆对话框里————如果使用BASIC的话 --> <realm-name>User Basic Authentication</realm-name> </login-config> </web-app>
3. 创建接收一个字段信息的动作类:
public class SecureAction extends ActionSupport { private static final long serialVersionUID = 1961430702313132722L; private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String execute() { return SUCCESS; } }
4. 创建struts.xml配置文件,声明动作
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="securePackage" extends="struts-default"> <action name="secure" class="struts2.action.SecureAction"> <result name="success">/index.jsp</result> </action> </package> </struts>
5. 创建输入页面input.jsp和结果页面index.jsp
input.jsp:
<body> <s:form action="secure"> <s:textfield name="username" label="Enter your name"></s:textfield> <s:submit value="submit"></s:submit> </s:form> </body>
index.jsp
<body> <s:property value="username"/>,Welcome </body>
6.测试效果,在浏览器输入:http://localhost:8081/SecureTest/input.jsp,得到如下界面:
输入"Tom",点击"submit"按钮,查看效果:
看到了登陆框了吧,此时我们要访问的资源是一个受限资源所以要求权限验证,还记得我们的用户表吧,查看用户表输入用户信息查看结果:
输入"webservices"与"webservices-pwd"的用户信息:
提示了一个"403"错误,这是因为虽然用户信息正确,但是"webservices"用户的没有"myeclipseWeb"权限。
这次输入一个不存在的用户信息:
这次获得了一个"401"错误,这是登陆失败的提示结果,这里会因浏览器的不同而需要不同次数的失败登陆才会得到这个结果。
接下来输入一个正确的用户,并且拥有"webservices"权限的用户信息:
点击"确定",获得如下结果:
可以看到,我们成功的访问了受保护的资源。若要传中文字,解决方案我已经在前面"配置Struts2"时介绍过了,需要修改Struts 2默认的编码方式还需要修改页面的编码方式,都改为"GBK".
相关推荐
1、MVC 概述 2、Struts1.x简述 3、Struts2概述 4、编写一个struts2应用程序 5、Struts2的核心配置文件 6、Action的实现 7、拦截器
Struts2简介以及Struts2的环境配置和Struts2框架实现功能的原理
Struts 2 应用程序的 CRUD 框架描述为 Struts 2 开发人员提供易于使用的框架,用于使用约定优于配置来构建 CRUD(创建、读取、更新、删除)应用程序。 包括多个实用程序类,以促进快速 Struts 2 应用程序开发。用法...
基于Struts应用程序框架构造的应用程序,除了可以复用业已证明可用的解决方案外,同时也可以使得开发人员更加关注应用程序的特性。Struts是由Apache软件基金会支持的开源软件。 本书完整介绍了Struts框架结构,涵盖...
8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做...
Struts2执行流程 1. web.xml 部署描述符 2. FilterDispatcher 实现StrutsStatics, Filter接口 (1)Filter:一个filter是一个对象用于执行过滤任务为每个请求资源(一个servlet...过滤器的配置在Web应用程序的部署描述符中.
第14章提高Struts应用程序的安全性 239 14.1 用户和角色 239 14.2 编写安全策略 240 14.2.1 保护资源 240 14.2.2 指定登录方法 241 14.3 身份验证方法 242 14.3.1 使用基本身份验证方法 243 14.3.2 使用基于...
考虑到ExtJS与主流服务端框架的整合越来越紧密,《ExtJS Web应用程序开发指南(第2版)》还特意讲解了Struts和Struts 2框架的整合与配置。最后全面细致地讲解了ExtJS 4.0中新增的主题、图形和图表部分,真正实现完全...
myeclipse下struts2开发框架的基本搭建;基于struts2框架开发Java Web应用程序的相关配置
Apache Struts2的是一个在Java中构建Web应用程序开源框架。 Struts2是基于OpenSymphony的WebWork的框架。它是Struts1的提高,它更加灵活,易于使用和扩展。 Struts2的核心组成部分是Action,拦截器和结果页。 ...
Struts 2 是一个基于 Java 的开源 Web 应用程序框架,旨在简化和加速 Java EE Web 应用程序的开发。它提供了一种清晰的架构和丰富的功能,使开发人员能够构建出结构良好、可维护和高性能的 Web 应用程序。以下是对 ...
配置struts.properties 配置资源文件*.properties 前台页面i18n.jsp 配置struts.xml Action类文件的配置(I18NAction.java)
(1) 编写一个自定义类型转换器,并基于应用程序进行全局配置,实现字符串参数与颜色值之间的转换,并将颜色值应用于视图当中。 (2) 根据实验四的图书管理系统,扩展图书新增功能,要求对新增页面表单中的每个...
虽然它由Struts应用程序的基础开始并深入讲解了Model 2设计方案,但这本书很快转入了较高级的主题。安装和设置贯穿文档始终,并且清楚地解释了每个配置选项。本书利用大量使用了标准JSP标记库和Struts附加程序的实际...
虽然它由Struts应用程序的基础开始并深入讲解了Model 2设计方案,但这本书很快转入了较高级的主题。安装和设置贯穿文档始终,并且清楚地解释了每个配置选项。本书利用大量使用了标准JSP标记库和Struts附加程序的实际...
配置和开发struts应用项目三.总结参考资料关于作者一.下载并安装EasyStruts包1.EasyStruts是开放源代码组织sourceforge.net上的一个项目,目前最新的版本是0.64,可以在它的网站...
Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java...