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

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(附源码)

    14.2 编写安全策略 240 14.2.1 保护资源 240 14.2.2 指定登录方法 241 14.3 身份验证方法 242 14.3.1 使用基本身份验证方法 243 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    14.2 编写安全策略 240 14.2.1 保护资源 240 14.2.2 指定登录方法 241 14.3 身份验证方法 242 14.3.1 使用基本身份验证方法 243 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 ...

    Struts in Action中文版

    2. 深入 STRUTS架构..................................................................................37 2.1. 随便谈谈......................................................................................

    struts in Action

    2. 深入STRUTS 架构..................................................................................37 2.1. 随便谈谈.......................................................................................

    ARCH4系统开发指南

    2.20.2 四舍五入 46 2.20.3 科学记数法 47 2.20.4 java.math.BigDecimal介绍 48 2.20.4.1 BigDecimal的构造方法 48 2.20.4.2 用BigDecimal进行四则运算 49 2.20.4.3 舍入模式 51 2.20.4.3.1 ROUND_CEILING 51 2.20....

    spring in action英文版

     5.3.2 声明一个简单的事务策略  5.4 通过方法名声明事务  5.4.1 使用NameMatchTransactionAttributeSource  5.4.2 名称匹配事务的捷径  5.5 用元数据声明事务  5.5.1 用元数据来书写事务属性  ...

    Java常见面试题208道.docx

    十四、RabbitMQ 135.rabbitmq 的使用场景有哪些? 136.rabbitmq 有哪些重要的角色? 137.rabbitmq 有哪些重要的组件? 138.rabbitmq 中 vhost 的作用是什么? 139.rabbitmq 的消息是怎么发送的? 140.rabbitmq 怎么...

    超级有影响力霸气的Java面试题大全文档

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

    java 面试题 总结

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

Global site tag (gtag.js) - Google Analytics