10 февр. 2009 г.

Tomcat: WebDAV

На базе Apache Tomcat необходимо организовать WebDAV доступ
(добавить в web.xml):
<servlet>
<servlet-name>webdav</servlet-name>
<servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>

<!-- The following for read-write access -->

<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>webdav</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>


При этом каталог хранения файлов будет каталогом размещения web приложения, поэтому данное приложение не стоит совмещать с каким либо другим (без надобности), дабы изолировать хранилище файлов.

Подобная конфигурация позволяет как читать кому угодно, так и писать, переименовывать, удалять, словом, совершать все WebDAV операции.

Необходимо ограничить доступ так, чтобы читать мог кто угодно, а писать только авторизованные пользователи.
Добавляем роль uploader в Tomcat (файл tomcat-users.xml или через менеджер пользователей Tomcat'а):
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="uploader"/>
<user username="uploader" password="12345" roles="uploader"/>
</tomcat-users>


Далее, существует два подхода - первый ограничить http операции к web ресурсу (добавив в web.xml):
 <security-constraint>
<web-resource-collection>
<web-resource-name>Upload</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PROPFIND</http-method>
<http-method>PROPPATCH</http-method>
<http-method>COPY</http-method>
<http-method>MOVE</http-method>
<http-method>DELETE</http-method>
<http-method>PUT</http-method>
<http-method>LOCK</http-method>
<http-method>UNLOCK</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>uploader</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Upload supported realm</realm-name>
</login-config>

<security-role>
<description>An example role defined in "conf/tomcat-users.xml"</description>
<role-name>uploader</role-name>
</security-role>


Либо сделать два сервлета - один исключительно на чтение, другой на полный доступ, но под авторизацией и с различными servlet-mapping:
<servlet>
<servlet-name>webdav</servlet-name>
<servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
</servlet>

<servlet>
<servlet-name>webdavUpload</servlet-name>
<servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>webdav</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>webdavUpload</servlet-name>
<url-pattern>/upload/*</url-pattern>
</servlet-mapping>

<security-constraint>
<web-resource-collection>
<web-resource-name>Upload</web-resource-name>
<url-pattern>/upload/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>uploader</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Upload supported realm</realm-name>
</login-config>

<security-role>
<description>An example role defined in "conf/tomcat-users.xml"</description>
<role-name>uploader</role-name>
</security-role>

Комментариев нет: