2011-10-11 11 views
8

Tôi có quyền truy cập trình quản lý tomcat và có thể tải lên các tệp tin chiến tranh. Một trong những cuộc chiến tranh là một dự án web tĩnh (nén html + các tập tin media, đổi tên thành * .war). Tôi muốn thêm tệp Web-INF/web.xml vào cuộc chiến này để bảo vệ nội dung bằng http xác thực cơ bản.Làm cách nào để cung cấp xác thực http cơ bản cho các ứng dụng web tomcat tĩnh mà không thay đổi tomcat-users.xml?

Tôi biết cách thực hiện điều này bằng cách thêm người dùng toàn cầu và gán vai trò trong tomcat-users.xml, nhưng tôi muốn có tất cả tên người dùng và mật khẩu được xác định trong tệp chiến tranh của mình.

  1. Điều này có thể được thực hiện mà không cần chạm vào số tomcat-users.xml của tomcat không?
  2. Và nếu có, làm cách nào để xác định điều này trong dự án tĩnh của tôi web.xml?

Thx, Juve

Trả lời

8

Tôi tìm thấy một giải pháp ở đây: http://wiki.metawerx.net/wiki/SecuringYourSiteWithContainerManagedSecurity

Trang mô tả làm thế nào để xác định riêng META-INF/context.xml trỏ của bạn để riêng bạn WEB-INF/users.xml. Thật không may, liên kết đến tệp users.xml phải tuyệt đối và tôi không muốn đưa ra bất kỳ giả định nào về đường dẫn hệ thống/tệp hệ thống trong tệp cấu hình của tôi.

Đây là hiện WEB-INF/web.xml tôi:

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

Một phù hợp với META-INF/context.xml sẽ trông như thế này:

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

Nếu bạn biết thư mục tomcat đặt tất cả các ứng dụng được triển khai, bạn có thể sử dụng đường dẫn tương đối (vì chúng được giải quyết liên quan đến catalina.base env.variable, tức là tomcat home).

Ví dụ, nếu bạn đang triển khai sử dụng IDE Eclipse, thường là các ứng dụng được triển khai tại wtpwebapps, vì vậy bạn có thể sử dụng:

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

Không hoàn hảo, nhưng ít nhất bạn không sử dụng đường dẫn đầy đủ.

Một cách khác, sẽ là triển khai lĩnh vực của riêng bạn để mở rộng MemoryRealm và xử lý trước tên đường dẫn trước khi gọi super.setPathname();

Bạn cũng có thể sử dụng DataSourceRealm, không có vấn đề này và nó phù hợp để sản xuất.

Để tiếp cận độc lập với thùng chứa servlet, bạn có thể sử dụng khung bảo mật dựa trên bộ lọc (ví dụ: Bảo mật mùa xuân, ...)