Thứ Ba, 9 tháng 8, 2016

Security trong EJB 3

CMP – Container Managed Persistent Bean trong EJB 2

Security trong EJB 3

Mục đích: nội dung của chủ đề này tiếp tục mở rộng nội dung cài đặt và vận dụng các khái niệm liên quan trên security vào EJB 3.0 và ứng dụng Web. Dựa trên mô hình cài đặt này, chúng ta sẽ để thấy sự khác biệt giữa mô hình cài đặt của Security trên EJB 3.0 và EJB 2.1

Security trong EJB 3

Mục đích: nội dung của chủ đề này tiếp tục mở rộng nội dung cài đặt và vận dụng các khái niệm liên quan trên security vào EJB 3.0 và ứng dụng Web. Dựa trên mô hình cài đặt này, chúng ta sẽ để thấy sự khác biệt giữa mô hình cài đặt của Security trên EJB 3.0 và EJB 2.1

Yêu cầu

Tổng quát hóa

  • Khái niệm security không thay đổi cho dù áp dụng công nghệ hay framework nào cũng được.
  • Ở đây chúng tôi giới thiệu việc cài đặt security trên EJB 3.0 để cho các bạn thấy được cú pháp cài đặt và vận dụng đơn giản khi chúng ta sử dụng EJB 3.0 nhưng vấn đề này chỉ có hiệu quả khi bạn đã nắm được việc cài đặt EJB 2.1 và các lý thuyết tương ứng về security
  • Sự khác biệt của EJB 3.0 và EJB 2.1 chỉ là EJB 3.0 giúp đơn giản việc cấu hình thông qua các annotation trong khi EJB 2.1 là các tập tin XML

Ứng dụng EJB áp dụng security trên ví dụ cụ thể

  • Đầu tiên chúng tôi sẽ làm ví dụ mô tả chương trình ứng dụng sử dụng stateful bean có sử dụng transaction xử lý việc mua hàng và xuất kết quả của quá trình giao dịch mua hàng. Trong đó, người sử dụng có thể hoàn tất hay hủy mua hàng (ví dụ này tương tự trong bài Security trong EJB 2.1)
  • Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 trong EJB 2.1
  • Bước 1: Tạo Enterprise Application Project tương tự như bước 2 của tutorial trong CMR 1:1
    • Tạo Project Enterprise Application có tên EJB3 Security
    • Chúng ta chọn Server là JBoss 5.1.0 GA và version của Java EE là JavaEE5 bởi vì chúng ta đang tạo trên nền EJB 3.0
    • Chúng ta sẽ có project trên NetBeans như sau

  • Bước 2: Tạo Stateless Session Bean tương tự như bài Security trong EJB2.1
    • Chọn New Session Bean trên gói EJB3Security-ejb
    • Đặt tên bean (SecuritySessionBean), gõ tên package (sample.security), chọn Stateless, chọn cả Remote và Local.
    • Nhấn nút Finish, project được phát sinh như sau

  • Bước 3: phát sinh một số business method cho EJB tương tự như bài Security trong EJB2.1
    • Phát sinh hàm business method có tên dice với tham số truyền vào số lần đổ xí ngầu và kết quả trả ra của hàm này trả ra tổng số lần đổ hay ra trả impossible nếu giá trị truyền vào là số âm trong bean class. Chức năng này được cho phép mọi user đăng nhập trong hệ thống đều được sử dụng

    • Lưu ý:
      • Tại bước này chúng ta cần phải truy cập context hay container để xác định đối tượng truy cập bean, chúng ta phải khai báo biến context loại SessionContext
      • Để xác định đây là biến môi trường của bean nên chúng ta phải khai báo annotation @Resource của gói javax.annotaion
      • Ngoài ra, chúng ta thiết kế hàm dice để cho tất cả user sử dụng được do vậy chúng ta phải khai báo thông số bằng annotation @PermitAll của gói javax.annotation.security để thông báo với container phương thức này cho tất cả mọi user cho phép của hệ thống được sử dụng
    • Tương tự phát sinh tiếp phương thức doIt() dùng để trình bày username đang truy cập context hiện hành. Chức năng này chỉ cho 02 nhóm người dùng sử dụng đó là nhóm admin và manager

      • Lưu ý: như đã nói ở trên chúng ta chỉ cho nhóm quyền admin và manager sử dụng, do vậy, trên hàm chúng ta phải khai báo annotation @RolesAllowed({role1}[, {role2}, …]) của gói javax.annotation.security
    • Khi hoàn tất các bước trên, chúng ta thấy các thành phần interface của Remote và Local được cập nhật như sau

  • Bước 4:  Cấu hình thông tin để sử dụng và mapping bean, áp dụng tương tự như tutorial CMR 1:1 và bài Security trong EJB 2.1

 

    • Lưu ý
      • Tên tag ejb-name là tên của Session Bean class (cụ thể SecuritySessionBean)
      • Tên jndi là do chúng ta đặt, tên này chúng ta sẽ dùng truy cập bean
      • Ở đây chúng ta dùng tag local-jndi-name và jndi vì các session được phát sinh có cả 02 remote và local interface
      • Giá trị khung màu đỏ với tag security-domain, chúng ta đang yêu cầu container thực hiện security với domain được thiết lập trong JBoss có tên là other
    • Chúng ta hoàn tất xong việc mapping bean
  • Bước 5: Cấu hình security hay khai báo hỗ trợ security để container có thể cung cấp dịch vụ security trên đúng đối tượng trong bean chúng ta đang xử lý áp dụng tương tự với bài Security trong EJB 2.1
    • Chúng ta cần tạo các tập tin ACL cho ứng dụng để qui định username, password và nhóm role group cho các username này áp dụng tương tự với bài Security trong EJB 2.1
      • Tạo tập tin users.properties để tạo username và password trong source package áp dụng tương tự với bài Security trong EJB 2.1

        • Tập tin được tạo ngay thư mục gốc của source packages hay cụ thể là default package
      • Tương tự như các bước trên tạo tập tin roles.properties để gán quyền cho các user trong tập tin users.properties áp dụng tương tự với bài Security trong EJB 2.1

      • Chúng ta có cấu trúc project cập nhật mới như sau

    • Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean và chúng ta tiến tới sử dụng bean trong ứng dụng web.
  • Bước 6: Tạo giao diện web để sử dụng các chức năng kết hợp security như sau
    • Chúng tôi mô tả ứng dụng khi truy cập thì trình duyệt sẽ đưa ra cửa số login để người dùng login
    • Nếu login sai hay login không có quyền truy cập, chương trình sẽ báo lỗi
    • Nếu login đúng và toàn quyền truy cập thì chương trình sẽ in hết ra kết quả. Login đúng và chỉ có 1 phần quyền truy cập, các chức năng được phép sẽ hiển thị, các chức năng không có quyền sẽ thông báo message không được truy cập
    • Chúng ta cập nhật giao diện bổ sung cho ứng dụng qua trang index.jsp

    • Phát sinh Controller để sử dụng như sau

      • Đoạn code được tô khung đỏ ở trên thể hiện chúng ta truy cập các chức năng có phân quyền trong bean. Nếu như chức năng đó không được quyền truy cập thì lỗi sẽ được ném vào EJBAccessException (thay vì AccessLocalException trong Security EJB 2.1) và chúng ta sẽ in ra việc giới hạn truy cập cho người dùng
    • Bước quan trọng nhất trong ứng dụng security đó là chúng ta phải cấu hình cơ chế authentication để có thể xác thực và phân quyền người dùng trên web – tương tự như bài Security trong EJB 2.1 nhưng ở đây chúng tôi thực hiện authentication bằng cơ chế FORM authentication để giúp các bạn mở rộng kiến thức về security trên web qua việc vận dụng các khái niệm đã nêu trong bài Security trong EJB 2.1 nhưng chúng ta chỉ mới vận dụng với BASIC
      • Đầu tiên chúng ta tạo form login với tập tin login.jsp để container sẽ chọn form này cho chúng ta khi chúng ta thực hiện truy cập resource đã được bảo mật như sau

        • Lưu ý:
          • Form bắt buộc phải có action là j_security_check, đây là servlet đã được implement sẵn trong container để hỗ trợ cơ chế login khi người dùng nhập username password và nhấn submit để gửi đến servlet container
          • Ngoài ra, form bắt buộc phải dùng method POST
          • Nếu thiếu 1 trong 2 vấn đề nêu trên, chương trình khi chạy sẽ phát sinh lỗi 404 – servlet không tồn tại hay không thể tìm thấy
          • Bên cạnh đó, j_security_check nhận 02 tham số HTTPServletRequest là j_username và j_password, do vậy các control trên form phải đặt tên tương ứng, nếu đặt sai tên 02 tham số này sẽ dẫn đến luôn checking là invalid username hay password
          • Trang login.jsp này không được thiết lập là trang chạy mặc định (welcome file) trong web.xml vì nếu form này không được container kích hoạt mà người dùng kích hoạt nó thì lần đầu tiên sử dụng form này, form sẽ refresh trắng, nếu dùng cố gắng dùng tiếp tục thì có khả năng sẽ phát sinh lỗi 408 – cố gắng kết nối đến server mà thời gian đã hết hạn – timeout

      • Tạo tập tin login để xử lý báo lỗi khi người dùng nhập sai username hay password đã được đăng ký thông qua các tập tin ACL (tương tự như chúng ta xử ly lỗi 401 trong Security của EJB 2.1 – nhưng 2.1 khi dùng cơ chế BASIC chúng ta làm hơi phức tạp – do cơ chế đó thực hiện như thế nhưng ở đây cơ chế form sẽ đơn giản hơn là do container xử lý và điều khiển thông qua các cấu hình của chúng ta)

      • Thực hiện các nội dung liên quan đến cấu hình qua tập tin web deployment descrisptor đó là tập tin web.xml
      • Mở tập tin web.xml trong gói web - EJB3Security-war/WEB-INF, click chọn tag Security tương tự như Security trong EJB 2.1

      • Cấu hình authentication, mở rộng mục Login Configuration, chọn Form để thông báo container kích hoạt browser đưa ra cửa sổ login sử dụng form của chúng ta thiết kế cho người dùng
        • Chọn Browse trong phần Form Login Page để chọn trang login.jsp
        • Chọn Browse trong phần Form Error Page để chọn trang notAccessed.jsp

      • Nhấn Save file và chuyển sang XML, chúng ta thấy XML cập nhật bổ sung thêm như sau

      • Chuyển trở lại tab Security, thu gọn Login Configuration, mở rộng mục Security Roles
      • Nhấn nút Add để đưa thêm role mới vào, chúng tôi sẽ đưa 3 role đã khai báo truy cập trong tập tin ACL roles.properties là admin, manager, và jboss tương tự như Security trong EJB 2.1
      • Màn hình mục Security Roles được cập nhật như sau

      • Chuyển tab XML, chúng ta sẽ thấy web.xml bổ sung thêm như sau

      • Chuyển lại tab Security, thu gọn mục Security Roles, chúng ta tiến tới xác định tài nguyên của ứng dụng cần bảo mật bằng chọn nút Add Security Contraint trong mục Security Contraints tương tự như Security trong EJB 2.1
        • Chúng ta điền vào Display Name nếu cần, mặc định nó có tên là Contraint1. Chúng ta cần xác định resource bảo mật bằng cách nhấn vào nút Add trong Web Resource Collection
        • Chúng ta điền tên Resource Name – đặt tên cho nhóm resource chúng ta muốn bảo mật, tên không nên có khoảng trắng
          • Xác định tập đường dẫn resource chúng ta cần security thông qua URL Pattern, đường dẫn tính từ root hay context path “/”. Dấu * thể hiện tất cả trong thư mục. Ở đây chúng ta muốn security toàn bộ web ứng dụng nên ta gõ /*. Điều này có nghĩa Browser sẽ tự kích hoạt cửa sổ login khi chúng ta truy cập ứng dụng web lần đầu tiên
          • Cho phương thức HTTP bảo mật, chúng ta chọn hàng Selected HTTP Methods để chọn 1 trong 7 phương thức, nếu không chọn gì cả tiếp theo cũng có nghĩa là chọn hết nhưng dùng cách này thay vì chọn All Http Methods để làm code XML phát sinh đơn giản hơn
          • Nhấn OK, sau đó chúng ta check tiếp vào check box Enable Authentication Contraints để xác định tài nguyên cấu hình vừa rồi cho phép được truy cập bởi nhóm quyền nào
        • Chúng ta nhấn nút Edit để mở cửa sổ xuất hiện các Security Roles mà chúng ta đã add ở các mục trên để xác định group roles nào được truy cập. Chúng ta nhấn nút Add để add các roles qua tương tự như Security trong EJB 2.1
        • Nhấn Ok để hoàn tất, chúng ta thấy giao diện Security được cập nhật như sau

      • Nhấn Save file XML và chuyển sang tab XML, chúng ta thấy tập tin web.xml được cập nhật như sau

      • Chúng ta hoàn tất việc cấu hình Security trên web
    • Chúng ta cần bổ sung việc xử lý lỗi 403 để tránh trường hợp xuất hiện trang lỗi không thiện cảm đối với người dùng bằng cách áp dụng phần cuối trong bài Security trong EJB 2.1
      • Chúng ta tạo trang accessDenied.jsp như sau

      • Cấu hình ánh xạ trang lỗi tương tự như phần xử lý lỗi Security trong EJB 2.1

    • Cấu trúc ứng dụng web và project được cập nhật như sau

  • Bước 6: Thực hiện Build Project, Start Server, Deploy để testing thư
    • Deploy tập tin ear vào trong thư mục đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 5.1.0 GA), ta thấy trên server

      • Lưu ý:
        • Chúng ta cứ chờ cho việc deploy hoàn tất, không nên vội vã, bất cứ hành động nhanh nhẩu nào sẽ gây lỗi cho code phát sinh
    • Thực hiện testing tương tự như tutorial Entity Bean trong EJB 3.0
      • Click chuột phải trên thành phần gói war trong gói ứng dụng của Web Application, chọn Open in Browser
      • Chúng ta thấy chương trình chạy đầu tiên nó kích hoạt authentication Form như sau

      • Đầu tiên chúng ta nhập liệu với user admin, manager được khai báo trong tập tin users.properties và roles.properties đó là user: khanhkieu, pass: ktkhanh. Nhấn OK thì giao diện xuất hiện là trang index.jsp vì đây là password hợp lệ

        • Chúng ta nhập số bất kỳ vào ô Times và nhấn Perform, ở đây chúng tôi nhập 3.

        • Chúng ta thấy kết quả hiện thị đầy đủ 02 hàm và không có lỗi gì cả ở server
      • Tiếp tục chúng ta thực hiện với users không có trong hệ thống khai báo trong tập tin users.properties và roles.properties hay giá trị nhập login sai username hay password, chúng ta thử với users: abc, pass: 345.
        • Thực hiện chạy lại chương trình ở cửa số Browser khác
        • Nhập user, pass không có khai báo, chương trình sẽ cho chúng ta nhập 1 lần duy nhất và servlet của hệ thống container j_security_check sẽ xử lý tức thời mà không cần cơ chế xử lý lỗi 401 như trong bài Security trong EJB 2.1 phần xử lý lỗi hay sẽ xuất hiện trang lỗi 401 và xuất hiện kết quả như sau

      • Tiếp tục chúng ta thực hiện với users có trong hệ thống khai báo trong tập tin users.properties và roles.properties nhưng users bị hạn chế quyền truy cập trong EJB cụ thể là role jboss, chúng ta thử với users: khanhkt, pass: 123456.
        • Thực hiện chạy lại chương trình ở cửa số Browser khác
        • Nhập user và pass nêu trên, nhấn OK giao diện trang index vẫn xuất hiện bình thường vì trên web chúng ta cho user thuộc role jboss được truy cập web

 

        • Chúng ta nhập số 4 và nhấn perform, chúng ta có kết quả như sau

        • Chúng ta thấy rằng nhóm role jboss không được truy cập chức năng doIt, do vậy exception phát sinh và nó chuyển xuống phần xử lý exception và in như màn hình trên
      • Tiếp tục chúng ta thực hiện với users có trong hệ thống khai báo trong tập tin users.properties và roles.properties nhưng users bị hạn chế quyền truy cập ngay từ ứng dụng web cụ thể là role user, chúng ta thử với users: guest, pass: khanh.
        • Thực hiện chạy lại chương trình ở cửa số Browser khác
        • Nhập user và pass nêu trên, nhấn OK thì lỗi 403 – access denied vì trên web chúng ta cho user thuộc role user được truy cập tài nguyên của web

  • Chúng ta đã hoàn tất được ứng dụng có hỗ trợ security trên EJB 3.0 từ web container đến ejb container thông qua các tham số khai báo của chúng ta qua annotation và trong tập tin deployment descriptor (web.xml)

Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt security trên các phương thức của EJB 3.0 và Web. Rất mong bài viết sẽ giúp ích cho bạn trong việc sử dụng và làm quen đến các khái niệm mở rộng và nâng cao của EJB 3.x, đặc biệt ở đây là mở rộng khái niệm về security

Rất mong sự góp ý chân thành của các bạn và hẹn các bạn trong bài tiếp theo về security trên các ứng dụng Web mở rộng ngoài BASIC, FORM chúng ta đã thực hiện trong bài Security của EJB 2.x và EJB 3.0, chúng ta sẽ còn phải thực hiện một số nội dung riêng biệt liên quan đến DIGEST, CLIENT-CERT và đảm bảo mã hóa và toàn vẹn dữ liệu với cơ chế truyền dữ liệu qua kênh bảo mật SSL – CONFIDENTIAL. Ngoài ra, chúng tôi sẽ để cập security theo hướng định ACL từ tập tin bình thường hay xml sang sử dụng Database cụ thể

Không có nhận xét nào:

Đăng nhận xét