WMS với Kiểm soát truy cập (ACL) cho người dùng khác nhau? Hoặc giải pháp cho hàng ngàn điểm trên bản đồ web?


8

Tôi có một bộ các trang web trong hàng ngàn. Không phải tất cả người dùng đều nhìn thấy cùng một Trang web trên bản đồ - do đó ACL. Dữ liệu được lưu trữ trong cơ sở dữ liệu không phải là GIS (mssql, ora, v.v.) và ngay bây giờ được truy xuất bằng truy vấn SQL tiêu chuẩn và được trả về máy khách (OpenLayers) bằng một tệp JSP.

Mã hiện tại đã được tối ưu hóa để thực hiện phân cụm phía máy khách (vì vậy ít gây ra sự lộn xộn trên máy khách, nhưng tất cả dữ liệu đều ở đó), truy xuất hộp giới hạn (vì vậy, một bộ dữ liệu phụ nhưng phải đến máy chủ cho mọi máy chủ pan / zoom cho dữ liệu mới) và thậm chí phân cụm phía máy chủ (để giảm dữ liệu được chuyển đến máy khách).

Thay vào đó, điều tôi muốn thay vào đó là tạo hình ảnh / gạch cho tất cả dữ liệu của mình, tương tự như cách Google Maps hiển thị hàng tấn chấm đỏ nhỏ cho tất cả các kết quả - http://bit.ly/d73qrw [google maps tìm kiếm "cà phê"] và hiển thị trên máy khách. Và khi nhấp vào, hãy thực hiện cuộc gọi ajax nhanh đến dịch vụ WMS để nhận thông tin. Đó là ý tưởng ít nhất.

Nhưng đây là vấn đề - Tôi không thể chỉ thiết lập một dịch vụ WMS tiêu chuẩn trước dữ liệu của mình vì không phải tất cả người dùng đều nhìn thấy cùng một dữ liệu. Có cách nào để tạo ra các ô này một cách nhanh chóng hoặc làm cho WMS ACL nhận biết không?

chỉnh sửa - 22/9/2010 - Vì vậy, tôi đã tìm ra cách google tạo ra các ô, hay đúng hơn là công nghệ đằng sau nó. Họ đang sử dụng Google Fusion Bảng. Lưu trữ N hàng trong các bảng của chúng và sau đó nếu dữ liệu nhận biết lat / lon, sản phẩm Fusion Table có thể tạo các ô ngay lập tức (!). Đây là thứ tôi đang tìm kiếm - bản đồ biểu diễn với hàng tấn dữ liệu. Nhưng tất nhiên tôi cần nó để được kiểm soát ACL. Liệu nó có ý nghĩa để viết một triển khai trọng lượng nhẹ tùy chỉnh của thông số WMS hoặc sửa đổi một sản phẩm hiện có? Mặc dù máy chủ địa lý có vẻ như rất nhiều "chỉ" sửa đổi để hỗ trợ ACL.

chỉnh sửa - 27/9/2010 - Một số thông tin khác kể từ khi thêm tiền thưởng. Dữ liệu của tôi là ở Oracle. Không gian Ora không được kích hoạt. Ngay bây giờ dữ liệu được trích xuất ở cấp độ kinh doanh và được chuyển đổi thành dữ liệu, được gửi đến máy khách nơi khách hàng đặt "dấu chấm" trên bản đồ. ACL được thực hiện ở mức logic nghiệp vụ, không phải DB hay ActivDir hay bất cứ thứ gì tương tự. Xác thực là đơn giản, nhưng Ủy quyền thì không và do đó phải được ghi lại trong mã. Muốn biết cách tạo dịch vụ WMS tốt nhất để phục vụ 1000 "dấu chấm" trên bản đồ nơi mỗi người dùng sẽ thấy một tập hợp các dấu chấm khác nhau. Câu trả lời có phải là CQL_FILTER không? Nhưng sau đó các tham số được đặt như thế nào? Một ý tưởng mà tôi có bây giờ là thực hiện quy trình 2 bước. Trước tiên hãy chạy truy vấn nội bộ để nhận danh sách ID mà người dùng được phép xem, sau đó xây dựng chuỗi yêu cầu WMS với các ID đó trong tham số CQL_FILTER. Có bất cứ điều gì đơn giản hóa quá trình này? Và nếu tôi thực hiện điều này, làm cách nào tôi có thể thêm lớp này dưới dạng lớp "WMS" vào máy khách Lớp mở vì OL điểm cuối là mã của tôi để lấy ID từ DB chứ không phải dịch vụ WMS thực tế trên ví dụ GeoServer?


@ danh sách ID trong CQL_FILTER: Nếu danh sách này dài hơn, hiệu suất của Geoserver sẽ trở nên rất kém. Ít nhất đó là kinh nghiệm của tôi. Tương tự như câu hỏi: gis.stackexchange.com/q/1654/187
Underdark

Chỉ muốn nói, chúng tôi đã vật lộn với một vấn đề rất giống nhau, và tôi được khuyến khích nghe người khác nói về nó. Chúng tôi có một số ý tưởng nhưng mỗi người có sự đánh đổi riêng. Tôi hy vọng sẽ trở lại chủ đề này để đóng góp và / hoặc tìm hiểu điều gì đó.
LarsH

Câu trả lời:


3

Một số dự án cho dịch vụ web GIS ACL

Tại foss4g 2010, hãy xem vào ngày 09 tháng 9, 11:00 trong chương trình cuối cùng http://2010.foss4g.org/program_print.php (bản trình bày không có sẵn tại thời điểm này)


2

Tôi nghĩ rằng một giải pháp phổ biến là tạo một tập lệnh proxy hoặc trình bao bọc nằm giữa máy khách và WMS. Proxy được sử dụng để tạo một cuộc gọi WMS tùy chỉnh dựa trên các tham số từ máy khách.

Bạn chưa đề cập liệu mục đích của bạn cho thiết lập này là bảo mật hay chỉ là tùy chỉnh, hoặc thông tin nào khách hàng sẽ phải xác định 'chế độ xem' tùy chỉnh của dữ liệu mà WMS sẽ tạo ra.

Nếu bạn sẽ hiển thị hơn vài trăm điểm, bạn sẽ muốn gắn bó với một dịch vụ dựa trên hình ảnh như WMS. Tùy thuộc vào yêu cầu của bạn, bạn cũng có thể đặt MapServer phía sau tập lệnh trình bao bọc để thực hiện các yêu cầu bản đồ tùy chỉnh dựa trên các tham số bộ lọc hoặc biểu thức duy nhất.


David, Mục đích là tùy biến. Bảo mật cũng vậy, nhưng hãy cho rằng điều đó được quan tâm. Nhưng những gì người dùng nhìn thấy phụ thuộc vào quyền người dùng của họ. Vì vậy, họ (1) đăng nhập, (2) mở bản đồ và sau đó xem Trang web mà họ được phép xem. Bạn có thể mở rộng thêm về ý tưởng của MapServer / GeoServer (Tôi là một người Java) đằng sau một trình bao bọc yêu cầu bộ lọc. Bạn có nghĩa đen là tham số "LỌC" hoặc "CQL_FILTER" hay cái gì khác? Tôi đã nghiên cứu tùy chọn CQL_FILTER kể từ khi tôi đăng, nhưng chưa thể thử nghiệm nó ở bất cứ đâu trực tuyến.
Vadim

2

Tôi có một câu trả lời làm việc cho chúng tôi sau một số thử nghiệm và lỗi.

Oracle Spatial + Oracle VPD thực hiện thủ thuật. Chúng tôi đã sử dụng Ora và VPD, vì vậy đây là bước hợp lý tiếp theo. Ora spatial có dịch vụ WMS và có thể được tùy chỉnh thành khác nhau cho những người dùng khác nhau dựa trên quyền / ACL của họ thông qua VPD. Nếu những người khác đang tìm kiếm một cái gì đó như thế này, tôi nhận ra không phải mọi hoạt động đều có hoặc có thể chi trả cho Oracle, nhưng nếu bạn có nó - nó sẽ ở đó. Không biết MS SQL Server có chức năng tương tự không.


1

Một ý tưởng khác (tôi không chắc điều này có thực tế không). Những gì bạn cần là một ánh xạ giữa các quyền của người dùng và các tệp bản đồ được tạo. Vì vậy, tại sao không tạo ra một hàm băm từ sự cho phép của người dùng và yêu cầu / mở rộng bản đồ? Băm này ánh xạ tới một ô được tạo. Nếu bản đồ không có ở đó rõ ràng nó cần phải được tạo, nếu không nó có thể được lấy từ bộ đệm của bản đồ. Tất nhiên, phương pháp này không mang lại bất kỳ lợi ích nào nếu mỗi người dùng nhìn thấy một bộ dữ liệu hoàn toàn khác nhau. Nhưng nếu tất cả người dùng thuộc một nhóm quyền hạn chế, điều này thực sự có ích.

Daniel


1

Hạn chót của bạn là gì? Trong Geomajas, chúng tôi đã có các giới hạn truy cập bảo mật / dữ liệu. Chúng tôi đang làm việc về bộ nhớ đệm / rasterizing tại thời điểm này sẽ dẫn đến loại hệ thống mà bạn đang tìm kiếm. Nó sẽ được hoàn thành trong một vài tuần.


hừm Tôi muốn được nghe nhiều hơn. Chúng tôi không vội vàng. Như tôi đã đề cập ở trên (tôi biết, có rất nhiều thứ để đọc) chúng tôi đã có một giải pháp phân cụm máy khách + máy chủ hoạt động. Nhưng tôi muốn chuyển đổi nó thành một giải pháp dựa trên ô tương tự như các bản đồ google maps có nhiều dấu chấm trên một ô. Làm thế nào để sản phẩm của bạn gắn vào một mô hình bảo mật hiện có nhưng tùy chỉnh? Chúng tôi không sử dụng oAuth hoặc Activ Dir hoặc tương tự.
Vadim


0

Có thể giải pháp này là điên rồ, nhưng ở đây chúng tôi đi.

Tại sao không phải là máy chủ WMS cho mỗi người dùng? Giả sử chúng ta đang sử dụng MapServer. Cấu hình MapServer được lưu trữ trong tệp .map (còn gọi là mapfile), nhưng không có gì cấm sử dụng một số mapfile. Khi yêu cầu WMS được thực hiện, một trong các tham số dành riêng cho nhà cung cấp MapServer sẽ chấp nhận là 'map', đây là một chuỗi chứa đường dẫn và tên tệp của mapfile đã sử dụng [1]. Nếu trong WMS của bạn yêu cầu một mapfile khác được gửi tùy thuộc vào id của người dùng đã đăng nhập trước đó, thì bạn sẽ nhận được máy chủ WMS với tư cách là người dùng và chỉ với một lần cài đặt MapServer.

Về mặt bảo mật, bạn sẽ phải kiểm tra mapfile đã sử dụng đối với id phiên, tác vụ có thể được thực hiện bởi proxy giữa máy khách và MapServer. Một người dùng muốn xem bản đồ của người dùng khác có thể thay đổi thủ công URL thay đổi tham số 'bản đồ' và biện pháp đối chiếu kiểm tra này sẽ khiến những nỗ lực đó không thành công.

Các Contra (điên loạn) của giải pháp này là dành cho mỗi người dùng một mapfile phải được tạo ra. Rõ ràng, trong trường hợp số lượng người dùng cao, giải pháp này không thực tế, trừ khi mapfiles có thể được tạo và cập nhật tự động, khi cần, bằng cách sử dụng tập lệnh hoặc cơ chế tương tự.

[1] Nếu sử dụng MapServer, tham số 'map' thực sự là bắt buộc.


Tôi đánh giá cao việc viết dài, tuy nhiên giải pháp này không thực tế vì hệ thống có nhiều người dùng cũng có thể được thêm hoặc xóa bất cứ lúc nào và các đặc quyền / bộ lọc xem dữ liệu của họ cũng bị thay đổi bất cứ lúc nào.
Vadim

0

Có một số bộ phận di chuyển ở đây.

Đầu tiên, có lọc các điểm: Điều này nên được thực hiện ở phía máy chủ, ngay sau hoặc trong khi truy vấn SQL của bạn.

Sau đó, các điểm được lọc cần phải được trả lại cho khách hàng.

Đó là phần đơn giản. :) Tôi sẽ khuyên bạn nên thực hiện điều này sau đó kiểm tra hiệu suất, và lý tưởng nhất là có thể dừng ở đây.

Tuy nhiên, nếu bạn có quá nhiều điểm để hiển thị hiệu quả trong OpenLayers, thì bạn sẽ đến (các) tối ưu hóa mà google xuất hiện để thực hiện cho các chấm đỏ nhỏ:

  • Bạn cần kết nối trình kết xuất ô với toàn bộ kết quả đã lọc, tạo ra các ô hoàn toàn trong suốt ngoại trừ một chấm nhỏ trên mỗi kết quả. (Quyết định thiết kế: sản xuất những thứ này một cách háo hức, hoặc chỉ theo yêu cầu?)

    • GeoServer, v.v., sẽ yêu cầu mã 'kích hoạt' vì họ sẽ cần một lớp mới cho mỗi truy vấn cho mỗi người dùng; khi bạn thêm người dùng, bạn sẽ cần thêm những thứ mới để GeoServer hiển thị. (Ngoài ra, bạn sẽ cần tạo các bản ghi kết quả theo định dạng có thể được sử dụng khi triển khai kết xuất). Và tần suất gạch cũ được kết xuất lại như thế nào?

    • Tôi muốn giới thiệu một chút mã máy chủ để proxy truy cập vào trình kết xuất ô xếp - theo cách đó ai đó sẽ không thể thấy kết quả không phải của họ bằng cách đoán URL.

  • Tiếp theo, các kết quả đang được trả về trình duyệt cần được phân vùng: n đầu tiên là các kết quả đầy đủ nhận được các điểm đánh dấu, trong khi phần còn lại được gửi dưới dạng tọa độ + URL gọi lại. (Ngay cả khi không chịu trách nhiệm hiển thị chúng, trình duyệt cần biết vị trí của chúng để thay đổi con trỏ, cung cấp chú giải công cụ và thực hiện hành động có ý nghĩa khi nhấp chuột!)

  • Sau đó, có mã JS trong trình duyệt để quản lý các tương tác với các dấu chấm.

Theo như tôi biết, không xa lắm, không ai đã viết mã 'ngoài hộp' để làm như trên: Bạn đang xem một loạt mã tích hợp hệ thống trên phụ trợ và khá nhiều mã JS mới trên mặt tiền.


Cảm ơn Dân. Rất nhiều "nấu ăn tại nhà" là những gì tôi mong đợi, nhưng thực sự muốn biết liệu có một giải pháp tốt hơn hay thanh lịch hơn. Gạch cũ nên được kết xuất lại thường xuyên vì đây là một phần của EMS và dữ liệu được cập nhật liên tục. Tôi đã kích hoạt phân cụm phía máy khách và máy chủ. Và nó giúp một tấn. Bởi vì 1000 điểm trở thành chỉ 30-40 trong đó phần lớn là các cụm (mà tôi kết xuất bằng dấu "cộng"). Trên zoom / pan, dữ liệu mới được tải từ máy chủ thông qua chiến lược BoundingBox. Nhưng phân cụm loại bỏ "sự lộn xộn" khỏi bản đồ. Vì vậy, bạn mất hình ảnh của bao nhiêu công cụ có.
Vadim

Quên thêm. Trong một số cách "lộn xộn" là một điều tốt. Và chúng tôi không muốn biểu diễn nó chỉ bằng một vòng tròn có kích thước thay đổi (ví dụ: vòng tròn lớn cho 50 điểm trong cụm và nhỏ cho 10) vì trong trường hợp sử dụng của chúng tôi, nó không có ý nghĩa giống như có nhiều dấu chấm nhỏ trên bản đồ. tiếng thở dài :)
Vadim

Cá nhân, tôi coi thường việc phân cụm điểm: nó loại bỏ một lượng thông tin khổng lồ và không có giải thích tốt nào cả. Vì vậy, tôi ở đó với bạn. Ngoài ra, nếu bản đồ của bạn nằm trong một phép chiếu đơn giản như Spatorical Mercator trên bản đồ web điển hình: bạn có thể xem xét việc tự tạo kết xuất ô. (Không có nhiều mã để chuyển đổi lat / lon thành tọa độ pixel X / Y cho một ô; Tôi nghĩ bạn có thể tìm thấy mã trên OpenStreetMap) --- sẽ loại bỏ rất nhiều tích hợp hệ thống, chuyển hướng, v.v. công việc. (với chi phí ít tính năng hơn, ví dụ: bạn không thể tạo ra các dấu chấm như lạ mắt!)
Dan S.

0

Nếu bạn có một truy vấn có thể được thực thi để cho bạn biết ID nào mà người dùng có thể thấy (như bạn nói trong lần chỉnh sửa mới nhất) thì giải pháp "tốt nhất" có thể sẽ là mã hóa bộ lọc đó dưới dạng bộ lọc CQL hoặc OGC như một phần của Yêu cầu WMS. Bạn có thể thấy rằng việc sắp xếp lại dữ liệu thành một khung nhìn là cần thiết để làm cho điều này khả thi.

Trước khi bạn bắt đầu sử dụng Bộ đệm, tôi sẽ tạo phiên bản đơn giản và xem nó có đủ nhanh không, và sau đó sẽ phức tạp khi và chỉ khi bạn cần thêm tốc độ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.