技术开发 频道

Struts 2应用程序安全功能的配置详解

  演示示例使用BASIC登陆方法验证用户身份

  我使用的Servlet容器是Tomcat,找到它的目录下conf目录中的tomcat-users.xml文件打开内容如下:

<?xml version='1.0' encoding='utf-8'?><tomcat-users>
    
<role rolename="myeclipseWeb"/>
    
<role rolename="myeclipseWebservices"/>
    
<user username="webservices" password="webservices-pwd" roles="myeclipseWebservices"/>
    
<user username="admin" password="admin-pwd" roles="myeclipseWeb,myeclipseWebservices"/>
    
<user username="web" password="web-pwd" roles="myeclipseWeb"/>
</tomcat-users>

  我使用的IDE是myEclipse9.0,它配置好Tomcat下的tomcat-users.xml文件内容如上,我直接使用它了,你也可以添加自己的角色和用户。该文件定义了2个角色和3个用户,每一个用户都由自己的角色(或者说权限,可以有多重权限)。

  创建Web项目,找到web.xml,配置它,使它支持Struts 2并且启动Struts 2的安全策略

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
          xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
<display-name>Struts Blank</display-name>
    
<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>
     <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
        <!--  配置应用程序需要保护的资源与什么角色才可以访问它   -->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Admin Arew</web-resource-name>
            <url-pattern>*.action</url-pattern>
        </web-resource-collection>        <auth-constraint>
            <role-name>myeclipseWeb</role-name>
        </auth-constraint>    </security-constraint>
    <!-- 注册可以访问保护资源的角色  -->
    <security-role>
        <role-name>myeclipseWeb</role-name>    </security-role>
    <security-role>
        <role-name>myeclipseWebservices</role-name>
    </security-role>
        <!--  设置登录方法  -->
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>User Basic Authentication</realm-name>
    </login-config>
</web-app>

   创建接收一个字段信息的动作类:

public class SecureAction extends ActionSupport
{
    
private static final long serialVersionUID = 1961430702313132722L;
        
private String username;
    
public String getUsername()
{
        
return username;
    }
    
public void setUsername(String username)
{
        
this.username = username;
    }
        @Override
    
public String execute()
    {
        
return SUCCESS;
    }
}

  创建struts.xml配置文件,声明动作

 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    
<package name="securePackage" extends="struts-default">
        
<action name="secure" class="struts2.action.SecureAction">
            
<result name="success">/index.jsp</result>
        </action>
    
</package>
</struts>

   创建输入页面input.jsp和结果页面index.jsp

  input.jsp:

<body>
    
<s:form action="secure">        <s:textfield name="username" label="Enter your name">
</s:textfield>
        
<s:submit value="submit">
</s:submit>
    
</s:form>
</body>

 

  index.jsp

<body>
    
<s:property value="username"/>,Welcome
</body>

 

  6.测试效果,在浏览器输入:http://localhost:8081/SecureTest/input.jsp,得到如下界面:

  输入"Tom",点击"submit"按钮,查看效果:

  看到了登陆框了吧,此时我们要访问的资源是一个受限资源所以要求权限验证,还记得我们的用户表吧,查看用户表输入用户信息查看结果:

  输入"webservices"与"webservices-pwd"的用户信息:

  提示了一个"403"错误,这是因为虽然用户信息正确,但是"webservices"用户的没有"myeclipseWeb"权限。

  这次输入一个不存在的用户信息:

  这次获得了一个"401"错误,这是登陆失败的提示结果,这里会因浏览器的不同而需要不同次数的失败登陆才会得到这个结果。

  接下来输入一个正确的用户,并且拥有"webservices"权限的用户信息:

  点击"确定",获得如下结果:

  可以看到,我们成功的访问了受保护的资源。若要传中文字,解决方案我已经在前面"配置Struts2"时介绍过了,需要修改Struts 2默认的编码方式还需要修改页面的编码方式,都改为"GBK".

0
相关文章