原文链接:http://www.cnblogs.com/suxiaolei/archive/2011/11/02/2233601.html

安全性是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-pattern>*.action</url-pattern></web-resource-collection><auth-constraint><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><auth-method>BASIC</auth-method><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; }

 @Overridepublic 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".

转载于:https://www.cnblogs.com/mumumy/p/3989122.html

配置Struts 2应用程序的安全功能(转)相关推荐

  1. IDEA配置Struts框架

    对于刚接触编程的同学,对框架只是还不是很了解,本文主要介绍在Idea上配置Struts,实现简单的页面跳转,以及页面参数传递. 在进行代码编写之前先对Idea进行一个简单了解,对于长时间接触编程的,对 ...

  2. Struts2的配置 struts.xml Action详解

    在学习struts的时候,我们一定要掌握struts2的工作原理.只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置.接下来我就先简 ...

  3. WEB服务器和HTTP服务器和应用服务器的区别?(web服务器就是HTTP服务器)为什么要把Web服务器独立配置,和应用程序服务器一前一后?

    参考文章1:WEB服务器.应用程序服务器.HTTP服务器区别 参考文章2:如何区分Web服务器.HTTP服务器.应用程序服务器 WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apach ...

  4. spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序

    spring boot注释 1.简介 在以前的文章中,我们学习了如何使用Spring JMS配置项目. 如果查看有关使用Spring JMS进行消息传递的文章介绍 ,您会注意到它是使用XML配置的. ...

  5. Spring Cloud配置–外部化应用程序配置

    本教程是关于Spring Cloud Config的,这里我们将研究如何在不同的应用程序中针对不同的环境(例如开发人员,本地,产品等)使用Spring Cloud Config来管理和存储分布式外部配 ...

  6. 使用Spring Boot和注释支持配置Spring JMS应用程序

    1.简介 在以前的文章中,我们学习了如何使用Spring JMS配置项目. 如果查看有关使用Spring JMS进行消息传递的文章介绍 ,您会注意到它是使用XML配置的. 本文将利用Spring 4. ...

  7. 配置Editplus调试PHP程序入门教程

    之前介绍了PHP开发工具zend studio7入门使用教程,zend studio的使用其实蛮耗费内存的,针对PHP入门学习者,今天和大家分享如何配置Editplus来调试PHP程序,Editplu ...

  8. 微信小程序原生开发功能合集一:微信小程序开发介绍

    一.专栏介绍   本专栏主要内容为微信小程序常用功能开发过程的介绍说明,包括开发微信小程序常用组件的封装.常用功能的开发等,提供源代码.开发过程讲解视频.完整的课程等.   组件封装: 下拉选择组件. ...

  9. IVX低代码平台开发——微信小程序实现抽奖功能

    写在前面 通过利用可视化编程实现微信小程序的抽奖功能,带大家初步了解 iVX 的强大之处. 文章目录 写在前面 iVX开发 抽奖功能实现 iVX开发 基本介绍 iVX是一个 "零代码&quo ...

最新文章

  1. EasyStack华丽亮相OpenStack Days China
  2. java 调用codesoft_请问各位前辈高人,java调用codesoft,如何给lab文件中的变量赋...
  3. shell + mysql
  4. style=background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)
  5. 笔记本电池电量校正方法(转CSDN)
  6. 混合云应用双活容灾实践
  7. Grid布局和Flex布局
  8. 分数化小数 Fractions to Decimals
  9. 菜鸟教程终极篇之Microsoft Windows Pre-installation Environment (Windows PE) 2.0
  10. openai-gpt_GPT-3报告存在的问题
  11. python数据分析与机器学习(Numpy,Pandas,Matplotlib)
  12. Visual Studio 2008 无法切换到设计视图
  13. linux系统搭建监控,Linux系统搭建zabbix监控系统实例讲解
  14. pluswell双机软件基本概述
  15. Linux中使用定时任务每周定时清理45天以前日志
  16. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对照注解方式的优缺点)...
  17. 不错的 HttpHelper类 c#
  18. java多线程过桥问题_(java)农夫过桥问题
  19. 浙江工业大学计算机应用基础,本科教学-浙江工业大学计算机科学与技术.doc
  20. 【代码】树莓派小车蓝牙键盘遥控方向行驶

热门文章

  1. Linux 输出重定向和的区别
  2. 文件服务器结构,文件服务器结构
  3. 5.3.5 TCP拥塞控制
  4. Matlab中的结构类型struct
  5. java linkedlist 查找_Java中LinkedList真的是查找慢增删快
  6. linux下kafka常用命令
  7. 在一个gradle 的maven property 里添加多个URL
  8. HotSpot虚拟机对象的创建过程
  9. XSS攻击之窃取Cookie
  10. RabbitMQ 发布/订阅