如何在不更改tomcat-users.xml的情况下为静态tomcat webapps提供基本的http身份验证?

时间:2011-10-11 12:27:55

标签: tomcat web.xml http-authentication

我可以访问tomcat管理器并可以上传war文件。其中一场战争是静态网络项目(压缩的html +媒体文件,重命名为* .war)。我想在此战争中添加一个Web-INF / web.xml文件,以使用基本的http auth保护内容。

我知道如何通过添加全局用户并在tomcat-users.xml中分配角色来实现此目的,但我希望在我的war文件中定义所有用户名和密码。

  1. 这可以在不触及tomcat的tomcat-users.xml
  2. 的情况下完成
  3. 如果是,我如何在我的静态项目web.xml
  4. 中指定此项

    Thx,Juve

2 个答案:

答案 0 :(得分:9)

我在这里找到了一个解决方案:http://wiki.metawerx.net/wiki/SecuringYourSiteWithContainerManagedSecurity

该页面介绍了如何定义自己的META-INF/context.xml指向您自己的WEB-INF/users.xml。不幸的是,users.xml文件的链接必须是绝对的,我不想对我的配置文件中的OS /文件系统路径做任何假设。

这是我当前的WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
    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_5.xsd"
    version="2.5">

    <display-name>SuperCoolTool</display-name>
    <description>What an awesome app!</description>

    <security-role>
        <role-name>manager</role-name>
    </security-role>
    <security-role>
        <role-name>keyuser</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
                Entire Application
            </web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>keyuser</role-name>
            <role-name>manager</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Evaluation Area</realm-name>
    </login-config>

</web-app> 

匹配的META-INF/context.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Realm className="org.apache.catalina.realm.MemoryRealm"
           pathname="[PATH-TO-YOUR-WEBAPP]/WEB-INF/users.xml"/>
</Context>

答案 1 :(得分:1)

如果您知道tomcat放置所有已部署应用程序的目录,则可以使用相对路径(因为它们是根据catalina.base env.variable解决的,即tomcat home)。

例如,如果您使用eclipse IDE进行部署,通常应用程序部署在wtpwebapps中,因此您可以使用:

<Realm className="org.apache.catalina.realm.MemoryRealm"
pathname="wtpwebapps/YOUR_APP_NAME/WEB-INF/users.xml"/>

还不完美,但至少你没有使用完整路径。

另一种方法是在调用super.setPathname()之前实现自己的扩展MemoryRealm并预处理路径名的Realm;

您还可以使用DataSourceRealm,它没有此问题且适合生产。

对于独立于servlet容器的方法,您可以使用基于过滤器的安全框架(例如Spring security,...)