编写安全策略 包含(1保护资源,2指定登录方法)
----保护资源
---<web-resource-collection>元素可以包含如下几个子元素-----
---<auth-constraint>元素可以包含的几个子元素-----
---<user-data-constraint>元素可以包含的子元素---
web.xml
然后在 WebRoot\admin\test.jsp
发现访问 http://localhost:8080/Struts2-token/admin/test.jsp 出现 401错误 而 如果不配置安全策略 则可以直接访问 admin/test.jsp
---指定登录方法---
---基表身份验证方法 (BASIC)----
struts.xml
wem.xml 在上面的web.xml中加入下面的配置
然后在 C:\apache-tomcat-6.0.20\apache-tomcat-6.0.20\conf 下的
tomcat-users.xml 加上 role 和 user 的配置
//访问上面的 地址
--http://localhost:8080/Struts2-token/test.action
输入 iteye 10101 就可以看到正式 /admin/test.jsp 的内容了
---Struts2 的安全配置---
--getAuthType()方法---
struts.xml
web.xml 加入下面的配置
--访问
---http://localhost:8383/Struts2-token/authType.action
---isUserInRole()--------
判断已经通过身份验证的用户 所拥有的角色
struts.xml
--getUserPrincipai()方法---
获取登录的用户名
----保护资源
在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>