2015-12-23 24 views
9

Tôi muốn bảo vệ giấy phép webapp của mình. Khi bất kỳ trang/tài nguyên nào của webapp được yêu cầu, trước hết tôi muốn kiểm tra giấy phép. Nếu không tìm thấy giấy phép thì tôi muốn chuyển hướng đến trang tải lên giấy phép.Java: Cấp phép ứng dụng web. Kiểm tra giấy phép trước khi đăng nhập xảy ra

Tôi đã tạo bộ lọc ánh xạ tới tất cả các yêu cầu mà tôi có thể kiểm tra giấy phép và chuyển hướng nếu cần. Vấn đề là webapp của tôi có hạn chế về bảo mật xác thực đăng nhập. xem web.xml ở cuối để biết thêm thông tin.

Vì ràng buộc bảo mật, tất cả các yêu cầu đầu tiên bị chặn bởi xác thực đăng nhập và sau đó được chuyển tiếp đến bộ lọc của tôi. Tuy nhiên, tôi muốn kiểm tra giấy phép trước khi đăng nhập có thể xảy ra.

Đây là câu hỏi liên quan mà tôi đã hỏi.

Java : Intercept all requests before they go to login authentication

Ưu tiên bộ lọc trên các hạn chế an ninh dường như là bất khả thi. Vì vậy, tôi muốn hỏi là có cách nào khác tôi có thể tiếp cận trường hợp sử dụng này?

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <display-name>Tango</display-name> 

    <filter> 
     <filter-name>SalsaValidationFilter</filter-name> 
     <filter-class>net.semandex.salsa.validationFilters.SalsaValidationFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>SalsaValidationFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <!-- <servlet-name>SalsaValidationServlet</servlet-name> --> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

    <session-config> 
     <session-timeout>20</session-timeout> 
    </session-config> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>Login page images</web-resource-name> 
      <url-pattern>/images/salsadb-logo2.png</url-pattern> 
      <url-pattern>/images/salsa-icon.png</url-pattern> 
      <url-pattern>/images/shadow_box.png</url-pattern> 
      <url-pattern>/images/header.png</url-pattern> 
      <url-pattern>/images/bg.png</url-pattern> 
      <url-pattern>/css/splash.css</url-pattern> 
      <url-pattern>/WEB-INF/licenseValidation.html</url-pattern> 
      <url-pattern>/auth/licenseValidation.html</url-pattern> 
     </web-resource-collection> 
    </security-constraint> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>The entire webapp</web-resource-name> 
      <url-pattern>/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>SalsaUser</role-name> 
     </auth-constraint> 
    </security-constraint> 

    <security-role> 
     <role-name>SalsaUser</role-name> 
    </security-role> 

    <login-config> 
     <auth-method>FORM</auth-method> 
     <form-login-config> 
      <form-login-page>/auth/login.jsp</form-login-page> 
      <form-error-page>/auth/loginError.jsp</form-error-page> 
     </form-login-config> 

     <realm-name>mongo_login</realm-name> 
    </login-config> 
</web-app> 
+1

Đây không phải là điều tôi đã sử dụng, nhưng tôi tự hỏi liệu JACC có phải là giải pháp cho vấn đề của bạn không? Tôi tin rằng nó hoạt động như một cái móc trong quá trình hạn chế an ninh. Tôi đã tìm thấy nó được tham chiếu trong [câu hỏi SO này] (http://stackoverflow.com/questions/17654020/precedence-of-security-constraint-over-filters-in-servlets), là câu hỏi tương tự cho bạn, và nó liên kết tới [bài đăng trên blog này] (http://arjan-tijms.omnifaces.org/2014/03/implementing-container-authorization-in.html) về chủ đề này. – DaveyDaveDave

Trả lời

1

Nếu bạn phải xác minh giấy phép trước khi xác thực, cách duy nhất sẽ sử dụng bảo mật có lập trình và bao gồm xác minh giấy phép như một phần của quy trình.

Bảo mật có lập trình hữu ích khi chỉ riêng bảo mật khai báo là không đủ để thể hiện mô hình bảo mật của ứng dụng. API để bảo mật có lập trình bao gồm các phương thức của giao diện EJBContext và giao diện HttpServletRequest. Các phương thức này cho phép các thành phần đưa ra quyết định logic kinh doanh dựa trên vai trò bảo mật của người gọi hoặc người dùng từ xa.

https://docs.oracle.com/javaee/7/tutorial/security-intro003.htm#BNBXH

Dưới đây là một vài ví dụ ngắn: https://docs.oracle.com/javaee/7/tutorial/security-webtier003.htm#GJIIE

Tôi đã không làm an ninh theo chương trình bản thân mình nhưng từ vẻ của nó, bạn có thể làm một cái gì đó như thế này:

  1. Thả bảo mật vùng chứa từ web.xml của bạn - thiết kế nó sẽ đi trước tất cả mọi thứ khác và do đó có được theo cách của bạn. Lý tưởng nhất là bạn chỉ có thể đặt auth-method thành NONE và giữ ràng buộc bảo mật - bạn có thể hiển thị trực tiếp trang lỗi khi cố truy cập và sau đó bạn có thể thực hiện 2) và 3) (bên dưới) từ đó trong servlet trước khi thử lại . Nếu bạn cũng phải hủy ràng buộc bảo mật, hãy sử dụng các bộ lọc như sau.
  2. Thêm bộ lọc sẽ xác minh giấy phép. Nó không thành công, nó sẽ chuyển hướng đến một trang để tải lên giấy phép và thử lại. Nếu không, bạn sẽ làm bộ lọc tiếp theo trong chuỗi.
  3. Bộ lọc tiếp theo trong chuỗi biết giấy phép hợp lệ. Nếu người dùng không đăng nhập, nó sẽ cố gắng lấy người dùng và mật khẩu làm thông số yêu cầu. Nếu chúng tồn tại, nó sẽ cố gắng xác thực theo chương trình với chúng - vào thời điểm này bạn đang thực hiện một trong các ví dụ trong liên kết trước. Nếu người dùng đã đăng nhập, hãy tiếp tục. Nếu thông tin xác thực không khớp hoặc không có thông tin xác thực để thử, hãy chuyển hướng đến trang đăng nhập tùy chỉnh để cho phép người dùng điền thông tin xác thực của mình và thử lại.
  4. Nếu bạn phải bỏ ràng buộc bảo mật khỏi tệp web.xml của mình, hãy có bộ lọc khác để kiểm tra vai trò tại đây và bất kỳ điều gì khác bạn có thể cần.

Đảm bảo bạn chuyển hướng đến một đường dẫn khác, để các trang đó không gọi lại bộ lọc và lặp lại. (Bộ lọc có thể được cấu hình để bỏ qua khi chuyển tiếp/chuyển hướng và tôi nghĩ đó là mặc định, nhưng nếu bạn phải bỏ ràng buộc bảo mật thì bạn muốn chắc chắn chúng được gọi là không có vấn đề gì.)

Bạn có thể làm tất cả điều này trong một bộ lọc duy nhất và/hoặc thay vì chuyển hướng khi không ghi ra phản ứng thích hợp (kinda mô phỏng một servlet POSTing cho chính mình nhiều lần). Một bộ lọc tốt hơn cho điều này hơn là một servlet vì bạn có thể chắc chắn nó được gọi cho bất kỳ nỗ lực truy cập nào.

Cách khác là viết mọi thứ trong 2) và 3) dưới dạng một servlet đơn ngoài ứng dụng "thực" và có bộ lọc chuyển hướng đến nó nếu phiên không được xác thực và không có đúng " giấy phép hợp lệ "thuộc tính thiết lập (bạn đặt nó trong servlet). Điều này có thể nhanh hơn và có lẽ đơn giản hơn để duy trì nhưng không quá chặt chẽ.

+0

+1 Điều này thật thú vị! Bây giờ tôi đã giải quyết với giải pháp sau đây khi tôi gần để phát hành. Tôi đã loại trừ trang chủ webapp của tôi khỏi xác thực biểu mẫu và đã tạo bộ lọc sẽ chặn yêu cầu trang chủ. Yêu cầu cho trang chủ sẽ bị chặn bởi bộ lọc đầu tiên vì nó đã bị loại trừ khỏi xác thực biểu mẫu. Từ bộ lọc của tôi, tôi chuyển hướng đến trang uploadLicense nếu được yêu cầu. Tôi biết điều này sẽ chỉ hoạt động cho trang chủ nhưng tôi có thể giải quyết ngay bây giờ. Nhưng tôi chắc chắn sẽ muốn thử phương pháp này khi tôi có thời gian. –

+0

"nó sẽ đi trước tất cả mọi thứ khác" Không có nó sẽ không, nó sẽ gọi một ServerAuthModule (SAM) đầu tiên. Ở đó bạn nên làm kiểm tra giấy phép xác minh, không phải trong một bộ lọc! –

0

Đây là không có gì để làm với JACC. Kiểm tra giấy phép ứng dụng web bình thường được thực hiện sau khi ủy quyền người dùng được thực hiện. Làm thế nào bạn xác nhận điều này phụ thuộc vào thiết kế của bạn của ứng dụng.

1. You can add a filter to the filter chain that intercepts to after 
    the user authorization. In this approach you need to properly 
    communicate user that license is failed. 


2. Redirect the user to license verification page after user 
     authorization is done. Ask user to verify the license. If the verification fails then redirect user again login page. In this approach you have advantage of displaying the web apps he is licensed in the suite of web apps. 

Thank in advance 
-Bharat 
+0

Tôi không thể cho phép xác thực người dùng xảy ra trước khi xác thực giấy phép theo trường hợp sử dụng của tôi. –

+0

Trong trường hợp đó, chúng ta cần phải cấu hình chuỗi bộ lọc để kiểm tra xác thực giấy phép đầu tiên trong JACC. Vui lòng đảm bảo bạn đại diện cho lỗi chính xác trên giao diện người dùng để thông báo cho người dùng. – BValluri

Các vấn đề liên quan