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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值