`
Luob.
  • 浏览: 1584261 次
  • 来自: 上海
社区版块
存档分类
最新评论

Struts2 编写安全策略(四十五)

 
阅读更多
编写安全策略 包含(1保护资源,2指定登录方法)

----保护资源
   在web应用程序中保护资源 ,需要在web.xml文件中配置<security-constraint>元素,该元素的语法定义如下:
<!ELEMENT security-constraint(display-name?,web-resource-collection+,auth-constraint?,user-data-constraint?)>

上述语法定义的含义如下:
display-name? :包含的是xml编辑器显示的名称.可选的 ,最多只有一个
web-resource-collection+:可选的 ,一个或多个
auth-constraint?:可选  最多一个
user-data-constraints?: 可选 最多一个


---<web-resource-collection>元素可以包含如下几个子元素-----
   <web-resource-name>:用来标识一个资源  (这个必须,下面可选)
   <discription>:用来对资源进行描述 
   <url-patter>:用来定义个URL模式,所有与这个URL模式相匹配的URL地址的资源都将受到保护. (可以是 0个 或 多个)
   <http-method>:用来定义受限制的HTTP请求方法.例如设置其值为POST,则POST 请求方法将受到限制.


---<auth-constraint>元素可以包含的几个子元素-----
  <role-name>:用来指定允许访问受保护资源的角色,可以配置多个. (0个或多)
  <discription>:用啦定义描述信息. (可选)


---<user-data-constraint>元素可以包含的子元素---
  description:定义描述信息
  transport-guarantee:用来定义数据传输的保护形式.
    有如下可选值:
    integral:表示web应用程序在传输数据时,必须保证数据在传输过程中不被修改.
   confidential:表示web应用程序在传输数据时,必须对传输的数据加密.
   none:表示web应用程序在传输数据时,不做任何额外保护.

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <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>
 
 <!-- 编写安全策略 -->
 <security-constraint>
 	<web-resource-collection>
 		<web-resource-name>Admin</web-resource-name>
 		<description>nobody but admin</description>
 		<url-pattern>/admin/*</url-pattern>
 	</web-resource-collection>
 	<!-- 指定可以访问的角色  -->
 	<auth-constraint>
 		<role-name>admin</role-name>
 	</auth-constraint>
 </security-constraint>
 
 <!-- 定义安全角色 -->
 <security-role>
 	<role-name>admin</role-name>
 </security-role>
 
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

然后在 WebRoot\admin\test.jsp
  <body>
    security-constraint:test.jsp
  </body>

发现访问 http://localhost:8080/Struts2-token/admin/test.jsp 出现 401错误 而 如果不配置安全策略 则可以直接访问 admin/test.jsp

---指定登录方法---
    在上面的示例中,将admin文件夹下面的所有资源都列为保护资源,只允许角色为admin的用户进行访问.那么,如果判断用户角色是否是admin呢?或者说 用户如何让程序知道自己的角色是admin?这时候  我就需要对用户的登录方法进行定义,也就是给出用户证明身份的渠道.
  在web中,定义用户的的登录方法,是通过web.xml文件中使用<login-config>元素进行配置的 语法如下:
<!ELEMENT login-config (auth-method?,realm-name?,form-login-config?)>

<auth-method>:用来指定用户身份验证的方法,可选值有:基本方式(BASIC),基于摘要方式(DIGEST),基于表单方法(FORM),SSl(Secure Socket Layer)方式和基于客户证书方法(CLIENT-CRET).

<realm-name>:用来定义一条提示信息.如果使用BASIC身份验证,提示信息建显示在标准的登录对话框中.

<form-login-config>:用来指定一个登录页面,以及一个身份验证失败时的错误页面,该元素在<auth-method>元素的FORM是使用才有意义.


---基表身份验证方法 (BASIC)----
struts.xml
<action name="test">
			<result name="success">/admin/test.jsp</result>
		</action>


wem.xml 在上面的web.xml中加入下面的配置
<!-- 使用基本身份验证方法 BASIC -->

  <!-- 安全策略 -->
 <security-constraint>
 	<web-resource-collection>
 		<web-resource-name>Admin</web-resource-name>
 		<url-pattern>/test.action</url-pattern>
 	</web-resource-collection>
 	<!-- 指定可以访问的角色  -->
 	<auth-constraint>
 		<role-name>admin</role-name>
 	</auth-constraint>
 </security-constraint>
 <!-- 定义用户的的登录方法 -->
 <login-config>
 	<!-- 指定用户身份验证的方法 -->
 	<auth-method>BASIC</auth-method>
 	<!-- 用来定义一条提示信息 -->
 	<realm-name>taobao</realm-name>
 </login-config>



然后在 C:\apache-tomcat-6.0.20\apache-tomcat-6.0.20\conf 下的
tomcat-users.xml 加上 role 和 user 的配置
<tomcat-users>
<role rolename="admin"/>
<user username="iteye" password="10101" roles="admin"/>
</tomcat-users>


//访问上面的 地址
--http://localhost:8080/Struts2-token/test.action
输入 iteye 10101 就可以看到正式 /admin/test.jsp 的内容了

---Struts2 的安全配置---
  在Struts2应用中,大多数用户请求都需要经过Action,所以Struts2的安全配置应该针对Action,如果需要限制所有Action访问,只需要在web.xml文件中将.action结尾的所有请求全部配置为受保护资源即可.
 <url-pattern>*.action</url-pattern>
在web.xml文件中对所有的.action结尾的用户进行身份限制

在Strut2应用中,可以通过Roles拦截器去指定那些角色可以访问指定的Action动作.Roles拦截器有如下几个参数:

allowedRoles: 设置允许访问指定Action动作的角色,多个角色之间使用英文状态的逗号(,)隔开.

disaledRoles:设置不允许访问指定Action动作的角色,多个角色之间使用英文状态的逗号(,)隔开

<action name="useRoles">
  <interceptor-ref name="roles">
      <param name="allowedRoles">admin</param>
  </interceptor-ref>
  <result name="success">/success.html</result>


--getAuthType()方法---
   getAuthType()方法用来返回身份验证方法的名称,该方法有如下几个返回值:BASCI FORM CLIENT_CERT DIGEST 如果用户灭有通过身份验证该方法返回null

package com.sh.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class AuthType extends ActionSupport {

	@Override
	public String execute() throws Exception {
		HttpServletRequest request=ServletActionContext.getRequest();
		String methodName=request.getAuthType();
		System.out.println(methodName);
		return SUCCESS;
	}
	
}

struts.xml
<action name="authType" class="com.sh.action.AuthType">
	<result name="success">/success.html</result>
</action>

web.xml 加入下面的配置
<security-constraint>
	<web-resource-collection>
		<web-resource-name>Admin2</web-resource-name>
		<url-pattern>*.action</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>admin</role-name>
	</auth-constraint>
</security-constraint>


--访问
---http://localhost:8383/Struts2-token/authType.action


---isUserInRole()--------
判断已经通过身份验证的用户  所拥有的角色
package com.sh.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UserInRole extends ActionSupport {

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		HttpServletRequest request=ServletActionContext.getRequest();
		boolean flag1=request.isUserInRole("admin");
		System.out.println("登录用户是否拥有admin角色:"+flag1);
		return SUCCESS;
	}
   
}

struts.xml
<action name="userInRole" class="com.sh.action.UserInRole">
			<result name="success">/success.html</result></action>


--getUserPrincipai()方法---
获取登录的用户名
package com.sh.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UserPrincipai extends ActionSupport {

	@Override
	public String execute() throws Exception {
		//获取 通过身份验证的用户名
		HttpServletRequest request=ServletActionContext.getRequest();
		String userName=request.getUserPrincipal().getName();
		System.out.println(userName);
		userName=request.getRemoteUser();
		System.out.println(userName);
		return SUCCESS;
	}
}


<action name="userPrincipai" class="com.sh.action.UserPrincipai">
			<result name="success">/success.html</result>
		</action>
0
0
分享到:
评论
1 楼 rensanning 2012-09-24  
这个配置跟struts2没有任何关系。HTTP协议中Basic/Digest Authentication是最基本规范(RFC 2617),无论开发语言或者框架是什么,只要基于HTTP的都可以实现。

http://www.avajava.com/tutorials/lessons/how-do-i-use-basic-authentication-with-tomcat.html

相关推荐

    struts2 学习重点笔记

    #### 五、Struts2 实践技巧与优化 **5.1 性能优化** - **减少 Action 调用**:合理设计 Action,避免不必要的多次调用。 - **缓存策略**:利用缓存机制减少数据库查询次数。 **5.2 安全性增强** - **输入验证**:...

    struts2 API帮助文档

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效...

    struts2安全漏洞修复

    2. 配置安全策略:禁用不必要的插件和功能,特别是与OGNL相关的配置。例如,可以禁用`struts2-convention-plugin`和`struts2-ognl-plugin`,或者限制OGNL表达式的执行。 3. 使用过滤器:在Web应用的部署描述符(如...

    struts2资源下载,struts2资源下载

    在"struts2资源下载"中,我们可以获取到与Struts2相关的各种资料,包括但不限于教程、示例代码、API文档、安全补丁以及社区提供的插件等,这些都对学习和使用Struts2框架极其有益。 Struts2的核心功能包括: 1. **...

    struts2下载地址

    #### 五、Struts2的常见问题与解决方案 1. **依赖冲突**:在使用Struts2的过程中可能会遇到与其他框架的依赖冲突问题,解决方法通常是调整依赖版本或者排除不必要的依赖。 2. **配置错误**:配置文件的错误是常见的...

    struts2,spring

    3. **安全控制**:Spring Security(原Acegi)可以与Struts2集成,提供用户认证和授权服务,增强应用的安全性。 4. **AOP集成**:Spring AOP可以与Struts2的拦截器一起工作,实现更细粒度的功能,如性能监控、日志...

    struts2学习心得

    9. **全局类型转换配置**:为了统一管理不同类型转换的规则,Struts2允许在`struts.xml`配置文件或`xwork-conversion.properties`文件中定义全局的类型转换策略,从而避免在每个Action中重复配置相同的转换规则。...

    Struts2漏洞利用工具Devmode版

    同时,安全工作不仅仅是检测漏洞,还包括定期更新框架和依赖,以及制定和执行严格的安全策略。 总之,"Struts2漏洞利用工具Devmode版"是网络安全领域的重要工具,它帮助我们识别并解决Struts2框架的潜在风险,提升...

    Struts2输入校验总结

    在Struts2框架中,输入校验是确保数据完整性和安全性的重要环节。对于手动输入完成校验,Struts2提供了灵活的机制。 1. **普通处理方式**:在Action类中重写`validate()`方法是最常见的做法。此方法允许开发者...

    转:struts1与struts2的区别

    ### Struts1与Struts2的主要区别 #### 1. Action类的设计差异 - **Struts1**: 在Struts1框架中,Action类必须继承自一个抽象类`org.apache.struts.action.Action`。这种方式可能导致的问题是代码灵活性较低,尤其...

    struts2反序列化漏洞,存在s2-005、s2-016、s2-016_3、s2-017

    2. **配置安全策略**:禁用不必要的插件和功能,特别是那些涉及OGNL表达式的。限制OGNL表达式的行为,例如使用`struts.ognl.allowStaticMethodAccess`配置项。 3. **过滤和验证输入**:对所有用户输入进行严格的...

    Struts1与Struts2本质区别

    - **Struts 2**:支持在Action中重写`validate`方法进行校验,也支持整合`XWork`校验框架进行校验,提供了更多的校验策略。 #### 10. Action执行控制的对比 - **Struts 1**:Action的执行顺序依赖于配置文件中的...

    Struts2权威指南完整版

    9. **异常处理**:讲解如何配置Struts2的全局和Action级别的异常处理器,以及如何自定义异常处理策略。 10. **插件系统**:Struts2有丰富的插件库,如Struts2-dojo-plugin、Struts2-convention-plugin等,书中会...

    struts2最新jar包

    7. **异常处理**:Struts2提供了一套全面的异常处理机制,可以自定义错误页面和错误处理策略。 8. **安全性**:虽然Struts2在过去的版本中曾出现过安全漏洞,但2.5.12版已经对这些漏洞进行了修复,增强了框架的安全...

    基于struts2 自定义标签 分页

    Struts2是一个强大的MVC框架,它在Java Web开发中被广泛应用。自定义标签是Struts2的一个重要特性,允许开发者扩展框架的功能,提供更友好的界面元素。在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨...

    Struts2框架安全缺陷.pdf

    然而,如同任何复杂软件系统一样,Struts2也存在一些安全缺陷,这些缺陷可能导致严重的安全问题,如SQL注入、跨站脚本(XSS)攻击等。 Struts2的安全问题主要集中在两个方面:框架本身的缺陷和开发者在使用框架时的...

    Struts2登录注册

    Struts2通过Struts Tags(标签库)简化了JSP页面的编写,如s:form、s:textfield等,可以方便地与Action进行交互。 8. **国际化(i18n)**:Struts2支持多语言环境,可以为不同地区的用户提供本地化的界面和错误消息...

    Struts2的输入校验

    在Struts2中,输入校验是确保数据安全、准确和有效的重要环节。本篇文章将深入探讨Struts2的输入校验机制及其相关知识点。 **输入校验的重要性** 输入校验是Web应用开发中的关键步骤,它可以防止恶意用户提交无效或...

    Struts2漏洞利用工具2016版 32.zip

    描述中提到的“Struts2漏洞利用工具”,通常是一些安全研究人员或黑客编写的程序,用于检测和利用这些已知漏洞。这些工具可能包括自动化扫描器,可以尝试多种攻击向量,以找出目标系统中的易受攻击点。使用这类工具...

Global site tag (gtag.js) - Google Analytics