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?: 可选 最多一个


[b][color=red]---<web-resource-collection>元素可以包含如下几个子元素-----[/color][/b]

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


[b][color=red]---<auth-constraint>元素可以包含的几个子元素-----[/color][/b]

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


[b][color=red]---<user-data-constraint>元素可以包含的子元素---[/color][/b]

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

[b][color=red]---指定登录方法---[/color][/b]

在上面的示例中,将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是使用才有意义.


[b][color=red]---基表身份验证方法 (BASIC)----[/color][/b]
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 的内容了

[b][color=red]---Struts2 的安全配置---[/color][/b]

在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>


[b][color=red]--getAuthType()方法---[/color][/b]

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


[b][color=red]---isUserInRole()--------[/color][/b]
判断已经通过身份验证的用户 所拥有的角色

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>


[b][color=red]--getUserPrincipai()方法---[/color][/b]
获取登录的用户名

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值