`
sungang_1120
  • 浏览: 325264 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

配置Struts 2应用程序的安全功能

 
阅读更多

配置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".

分享到:
评论

相关推荐

    Struts2 应用程序示例

    Struts2是一个强大的Java web应用程序框架,用于构建可维护、可扩展且结构良好的Web应用程序。这个"Struts2应用程序示例"是专为初学者和开发者设计的,它利用Eclipse 3.3作为集成开发环境,JDK 6.0作为Java运行环境...

    struts2小程序 struts2代码

    Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用。这个“struts2小程序”很可能是开发者利用Struts2框架开发的一个小型项目,可能包含了基本的CRUD操作或其他特定功能。...

    建立你的第一个Struts2应用程序

    综上所述,构建第一个Struts2应用程序涉及多个关键步骤,包括项目创建、框架集成、配置文件编辑以及对框架特性的理解和应用。通过细致的准备与实践,可以有效提升项目开发效率,并加深对Struts2框架及其与其他Java...

    配置struts2需要的资源包

    Struts2是一个强大的Java web应用程序框架,用于构建和部署企业级的MVC(Model-View-Controller)架构应用。在开发基于Struts2的应用时,正确配置和选用所需的资源包至关重要,这能确保项目的稳定性和高效性。在这个...

    配置第一个Struts2的简单登陆程序

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。...这个简单的例子展示了如何使用Struts2构建Web应用程序的基本流程,但实际应用中还需要考虑更多安全和功能扩展。

    struts2 result配置详解

    Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果.render 到一个 JSP 页面。Struts...

    Struts2安全缺陷

    Struts2 是一个流行的 Java WEB 框架,它提供了许多有用的功能来帮助开发者快速构建 Web 应用程序。然而,在开发和学习 Struts2 时,开发者需要注意一些安全缺陷,以避免安全漏洞。 Struts2 框架概述 Struts2 是一...

    Eclipse中配置Struts2项目指南

    Eclipse中配置Struts2项目指南 Struts2 是一个基于MVC 模式的Web 应用程序框架,它提供了一种灵活的方式来构建Web 应用程序。在 Eclipse 中配置 Struts2 项目需要经过多个步骤,包括安装所需软件、配置环境、创建...

    struts2示例程序

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、高效且易于维护的Web应用。这个"struts2示例程序"是为了帮助初学者理解并熟悉Struts2框架的基本概念和工作流程。该程序基于Struts2的2.0.14版本,...

    struts2实现文件下载功能

    1. **配置Struts2 Action**: - 创建一个新的Action类,例如`FileDownloadAction`,这个类需要继承自Struts2的Action类,如`ActionSupport`。 - 在`execute()`方法中,实现文件路径的获取和文件读取逻辑。通常,...

    Struts2小程序源代码

    理解路径配置对于理解和调试Struts2应用程序至关重要。 通过深入研究这些源代码,开发者不仅可以了解到Struts2的核心机制,还可以学习到如何进行最佳实践,如错误处理、结果转发、国际化、数据校验等。此外,这些小...

    Struts2漏洞检查工具Struts2.2019.V2.3

    1. 自动扫描:自动扫描应用程序中的Struts2组件,查找已知的安全漏洞。 2. 漏洞报告:生成详细的漏洞报告,列出所有发现的问题以及修复建议。 3. 静态代码分析:对源代码进行分析,寻找潜在的安全问题。 4. 实时监控...

    struts2配置文件

    Struts2是一个流行的Java Web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。它简化了开发过程,提供了丰富的插件和强大的功能。以下是对`struts2配置`的详细解释: 首先,要配置Struts2框架,你需要...

    Struts2添加SSL功能

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展、模块化和高度控制的MVC(模型-视图-控制器)应用程序。在现代Web应用中,安全性是至关重要的,尤其是在处理敏感用户数据时。SSL(Secure Sockets Layer...

    配置Struts2开发环境

    截至文档编写时,最新的Java SE版本是6.0,该版本引入了许多新特性,如对脚本语言的支持、简化Web服务开发、数据库绑定开源的Derby(JavaDB)、增强的桌面应用程序API以及改进的监视和管理功能等。 配置Struts2开发...

    struts2实现简单功能

    Struts2是Apache软件基金会下的一个开源框架,主要用于构建基于Java EE的企业级Web应用程序。它在Struts1的基础上进行了很多改进,提供了更强大的MVC(Model-View-Controller)架构支持,增强了动作处理、异常处理、...

    struts2核心配置文件

    `struts.xml` 文件是Struts2的核心配置文件之一,主要负责管理和定义应用程序中的Action映射以及相关的Result定义。具体来说,该文件包括以下几个关键部分: 1. **Action 映射**: - 指定每个Action的名称、执行的...

    利用Myeclipse快速开发struts应用程序

    通过创建Web项目,配置Struts框架,设计JSP页面,编写ActionForm和Action类,以及正确配置`struts-config.xml`文件,可以高效地实现Struts应用的开发流程。这种方式有助于提高开发效率,降低出错率,是学习和实践...

    struts2 配置dtd 自动提示

    在配置Struts2时,通常会使用一个名为`struts.xml`的配置文件,该文件定义了应用程序的行为和组件。为了在开发环境中获得更好的代码辅助和提示,我们需要使IDE(例如Eclipse)理解`struts.xml`文件的结构,这通常...

Global site tag (gtag.js) - Google Analytics