Chủ Nhật, 7 tháng 8, 2016

Security trong EJB 2.1

CMP – Container Managed Persistent Bean trong EJB 2

Security trong EJB 2.1

Mục đích: nội dung của chủ đề này giới thiệu các khái niệm liên quan trên security và áp dụng security vào EJB 2.1 và ứng dụng Web. Bên cạnh đó, chúng ta sẽ học cách xử lý lỗi để tạo tính thân thiện về mặc giao diện cho người dùng. Để hiện thực hóa các khái niệm security về ứng dụng web và ejb, kết hợp với xử lý lỗi, chúng ta sẽ thực hiện cài đặt chúng trên ứng dụng cụ thể

Security trong EJB 2.1

Mục đích: nội dung của chủ đề này giới thiệu các khái niệm liên quan trên security và áp dụng security vào EJB 2.1 và ứng dụng Web. Bên cạnh đó, chúng ta sẽ học cách xử lý lỗi để tạo tính thân thiện về mặc giao diện cho người dùng. Để hiện thực hóa các khái niệm security về ứng dụng web và ejb, kết hợp với xử lý lỗi, chúng ta sẽ thực hiện cài đặt chúng trên ứng dụng cụ thể

Yêu cầu

  • Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
  • Nắm vững cú pháp và kiến thức về OOP
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22
  • Server: JBoss 4.2.3 GA
  • DBMS: SQL Server 2005

Các khái niệm về Security

  • Security là một yếu tố không thể thiếu sau khi các chức năng ứng dụng đã hoàn tất bởi vì
    • Ứng dụng chúng ta đang sử dụng và triển khai là các ứng dụng dạng phân tán, người dùng dùng web browser để truy cập ứng từ các thiết bị cá nhân đến các server ở xa
    • Việc truy cập trên đường truyền với băng thông nhỏ, số lượng người dùng tại một lúc truy cập có rất người sử dụng dẫn đến việc truy cập chậm chạp. Chính tốc độ chậm chạp đó dẫn đến những kẻ tấn công có thể chụp các packet truyền đi để thay đổi thông tin hay lấy thông tin để sử dụng thông tin bất hợp lý
    • Ngoài ra, thông tin sử dụng trong ứng dụng phải có sự phân biệt rõ ràng ai được phép xem nội dung nào, sử dụng chức năng nào để đảm bảo tính bảo mật về thông tin và không bị phá vỡ trong quá trình xử lý hay truy cập thông tin bất hợp khác. Vấn đề này nhằm hạn chế sự sai sót trong xử lý
  • Có 4 cơ chế áp dụng trong Security
    • Authentication: xác thực người dùng đúng là thành viên của hệ thống thông qua username, password (pin), vân tay, móng mắt, …
    • Authorization: những đối tượng là thành viên của hệ thống sau khi authentication thành công sẽ được hệ thống thông qua cơ chế xác thực quyền để cho phép họ sử dụng những chức năng và dữ liệu trong quyền hạn của họ, không được phép thấy hay xâm phạm hay sử dụng các chức năng mà họ không được cho phép

    • Data Integrity: đảm bảo thông tin khi truyền đi không bị thay đổi hay truy cập khi được truyền đi trên mạng hay trên đường truyền
    • Confidentiality: Thông tin được mã hóa được truyền đi trên kênh đặc biệt (như là SSL: Socket Secure Layer) dựa trên thông tin authentication và authorization

  • Mô hình J2EE Security
    • Ứng dụng J2EE được cấu tạo trên mô hình 03 lớp: client (chứa EJB Client truy cập middleware qua console hay thành phần Web module truy cập middleware qua browser), middleware – application server (chứa các Web Container xử lý Web và EJB Container xử lý các nghiệp vụ của ứng dụng) và CSDL (dùng để chứa và xử lý các dữ liệu)
    • Client truy cập vào middle ware phải được xác thực để truy cập vào container tuân theo qui luật của từng container
    • Trên middleware, các thành phần container thực hiện cơ chế xác thực để truy cập lẫn nhau đảm bảo ứng dụng có tính bảo mật cao.
    • Middleware trong quá trình xử lý phải thực hiện truy cập vào CSDL với sự xác thực của CSDL và quyền hạn thao tác trên CSDL để lấy dữ liệu về xử lý
    • Cơ chế bảo mật trong J2EE đảm bảo cho ứng dụng có tính bảo mật cao nhất

    • JAAS – Java Authentication and Authorization Services
      • JAAS là framework cung cấp Authencation và Authorizaion cho các ứng dụng của Java.
      • Cơ chế bảo mật trong JAAS
        • Xác định tài nguyên – resources cần bảo mật
        • Xác định provider phù hợp cho tài nguyên cần bảo mật.
        • Dùng các phương thức security của provider trên resources để thực hiện bảo mật.
        • Cung cấp các cơ chế để với client sử dụng tài nguyên đã được bảo mật
        • Một số cách thức bảo mật
          • Basic Authentication
            • Sử dụng cơ chế người dùng muốn truy cập client phải nhập username và password thông qua cửa số popup sercurity được hỗ trợ từ cửa sổ web browser.
            • Nếu xác thực đúng người dùng sẽ truy cập Web, ngược lại browser sẽ hiển thị trang web không tồn tại hay không load được trang web này.
          • Form-based Authentication
            • Tương tự như cơ chế Basic authentication nhưng developers thực hiện tạo các form của web (html, jsp …) với các control để tiếp nhận username và password để đón nhận giá trị nhập của người dùng và thực hiện xác thực (có thể bằng code hay container hỗ trợ)
          • Digest Authentication
            • Hệ thống yêu cầu thông tin xác thực
            • Client cung cấp thông tin để chuyển tới server
            • Server xác định thông tin, nếu đúng, sẽ tạo token chứa các thông tin mã hóa và gửi cho client
            • Client nhận được token phải dùng các cách giải mã tương ứng, nếu thực hiện được, thông tin sẽ gửi lại server và client được phép truy cập hệ thống
            • Bất kỳ giai đoạn nào có lỗi phát sinh thì việc authentication được coi là không hiệu lực.
            • Cơ chế có tính bảo mật cao vì thông tin đã được mã hóa
          • Certificate based Authentication
            • Sử dụng dạng xác thực của một trung tâm chứng thực có uy tín để xác thực
            • Dữ liệu được mã hóa và truyền đi trên kênh đặc biệt và được server xác thực, nếu kênh này không được mở thì dữ liệu sẽ không bao giờ đến được server
            • Áp dụng SSL hay HTTPS
  • Các thành phần của JAAS
    • Login module:  thực hiện cơ chế authentication và authorization qua việc xác thực username hay password. Đối tượng tương tác trực tiếp với client.
    • Login context: client sử dụng đối tượng này để cung cấp thông tin trong quá trình login
    • CallbackHandler và Callback:
      • Hỗ trợ tương tác giữa client và Login module.
      • Loginmodule dùng Callback để lấy thông tin của Client và CallbackHander sẽ cung cấp các thông tin cho Loginmodule
    • Principal and Group: class để Login module chứa thông tin của authentication (Principal) và authorization (group)
    • Subject: đối tượng chứa các thông tin liên quan đến client sau khi login thành công để sử dụng cho authentication.
    • Một số đối tượng khác
      • Principal: thông tin xác định đối tượng (ví dụ: username)
      • Credenticals: thông tin cung cấp thuộc tính liên quan đến đối tượng được bảo mật (ví dụ: password)
    • Cơ chế thực hiện Authentication: client truy cập resource bảo mật trên Server có các bước xử lý như sau
      • Client gửi các thông tin có liên quan đến việc login đến CallbackHandler (ví dụ: username, password) để thực hiện khởi tạo và lưu trữ giá trị để sử dụng trong các bước tiếp theo.
      • CallbackHandler đưa thông tin đến Login Context để khởi tạo cho quá trình thực hiện authentication
      • Login Context thực hiện tạo instance LoginModule, thông báo cho Login Context và Login Context đưa đối tượng cho Client (tương tự như cơ chế client truy cập EJB thông quan EJBObject)
      • Client gọi phương thức Login trên đối tượng Login Module
      • Login module yêu cầu thông tin xác thực từ CallbackHandle để lấy thông tin mà client đã cung cấp trong quá trình khởi tạo
      • Login module thực hiện xử lý xác thực. Nếu xác thực sai, sẽ đưa ra exception còn đúng sẽ thông báo cho user.
        • Việc xác thực thành công, thông tin của client sẽ được lưu trữ trong đối tượng Subject thông qua Login Context.

    • Cơ chế thực hiện authorization
      • Client hay user truy cập các phương thức trên Server
      • Thông tin của user trong Subject được cung cấp để xác định role tương ứng. Nếu không được truy cập sẽ thông báo lỗi, ngược lại gọi phương thức thực thi
      • Có 02 cách thức để thực hiện authorization
        • Declarative:
          • Không cần lập trình mà chỉ mô tả thông tin qua deployment descriptor.
          • Deployment descriptor mô tả và thông báo cho container các roles về security và security constraints để client truy cập các phương thức phải tuân theo qui tắc bảo mật. Đặc biệt container sẽ hỗ trợ cơ chế security cho các ứng dụng được deploy vào container
          • Cấu hình security cho ứng dụng EJB deploy trên server JBoss
        • Programmatic
          • Lập trình bảo mật trực tiếp trong Bean
          • Các phương thức xử lý business sẽ được tích hợp với các kiểm tra bảo mật
          • Có khả năng kết hợp với declarative để tăng tính uyển chuyển trong việc vận dụng bảo mật
  • Việc xác thực và phân quyền của JAAS trên mô hình J2EE/JavaEE được container kiểm tra trên ACL – Access Control List
    • ACL là một tập tin tài nguyên chứa đựng thông tin liên quan đến quyền xác thực và nhóm user được phân quyền
    • Khi có một request gửi đến server thì lời yêu cầu bắt buộc được container kiểm tra trên ACL, nếu như tồn tại thành viên sẽ tiếp tục kiểm tra quyền để thành viên được cấp quyền truy cập tài nguyên hay bị từ chối không có phép truy cập

Khái niệm về security được áp dụng trong EJB 2.1

  • Login module trong JBoss được thể hiện qua security domain với JNDI có cú pháp java:/jaas/<tên domain>. JBoss đã hỗ trợ sẵn một domain mặc định là others
  • JBoss cung cấp UserRolesLoginModule nhằm lấy username, password và role từ tập tin ACL, cụ thể ACL được thể hiện qua các tập tin properties trong ejb package
    • users.properties: Chứa các username và password theo từng hàng một với dạng username=password (lưu ý: không có khoảng cách trong các thành phần khai báo)
    • Ví dụ: users.properties

khanh=123456

guest=khanhkt

    • roles.properties: Chứa nội dung phân quyền cho các user, thông tin được lưu trữ thành từng hàng có dạng username=roles[, role2][,…][, rolen] (lưu ý: tên username phải tồn tại trong tập tin users.property và các role có thể có nhiều hơn 1 và cách nhau bằng dấu phẩy)
    • Ví dụ: roles.properties

khanh=admin,manager

guest=user

  • Các bước xây dựng ứng dụng EJB có áp dụng Security
    • Bước 1: Tạo đối tượng ứng dụng hỗ trợ EJB
    • Bước 2: cấu hình LoginModule với các file properties đặt tại thư mục của application
      • users.properties
      • roles.properties
    • Bước 3: bổ sung cấu hình security các tập tin deployment descriptor các thành phần element hỗ trợ khai báo security.
      • Bổ sung việc xác định domain trong tập tin jboss.xml

<jboss>

            <security-domain>java:/jaas/tên domain</security-domain>

            <enterprise-beans>

                        ....

            </enterprise-beans>

</jboss>

      • Bổ sung các thành phần resource, phương thực cần hỗ trợ security trong tập tin ejb-jar.xml

<enterprise-beans>

                        ....

</enterprise-beans>

<assembly-descriptor>

  <security-role><role-name>tên role trong file roles</role-name></security-role>

  các security role khác

  <method-permission>

    <role-name> tên role trong file roles </role-name>

    <method>

            <ejb-name>tên ejb</ejb-name>

            <method-name>tên method</method-name>

            <method-params>

<method-param>loại dữ liệu<method-param>

</method-param>

     </method>

  </method-permission>

Cấu hình nhiều hơn một phương thức, để cấu hình toàn bộ phương thức dùng dấu *

...

</assembly-descriptor>

    • Bước 4: xây dựng client truy cập vào ứng dụng thông qua các xác thực
      • Đối với ứng dụng web – bổ sung cấu ứng authentication và authorization trên tập tin web.xml

<security-constraint>

      <web-resource-collection> (xác định tài nguyên được security)

                  <web-resource-name>tên resource</web-resource-name>

                    <url-pattern>/* hay tên tài nguyên/thư mục</url-pattern>

                  <http-method>HEAD</http-method> (xác định các phương thức HTTP được security)

                  <http-method>GET</http-method>

                  <http-method>PUT</http-method>

                  <http-method>POST</http-method>

                  <http-method>DELETE</http-method>

      </web-resource-collection>

      <auth-constraint> (xác định các roles được phép truy cập tài nguyên)

<role-name>tên role – tồn tại trong file roles</role-name>

các role khác

</auth-constraint>

      <user-data-constraint> (xác định cơ chế mã hóa dữ liệu để truyền đi)

                  <transport-guarantee>NONE|INTEGRITY|CONFIDENTIAL</transport-guarantee> (NONE: không mã hóa; INTEGRITY: mã hóa; CONFIDENTIAL: mã hóa và truyền kênh riêng)

      </user-data-constraint>

  </security-constraint>

  <login-config> (xác định cơ chế authentication)

      <auth-method>BASIC|FORM|DIGEST</auth-method>

  </login-config>

  <security-role> (xác định các roles được security để truy cập ứng dụng)

      <role-name>tên role</role-name>

  </security-role>

  các security role khác

    • Bước 5: Đóng gói ứng dụng, deploy và testing ứng dụng
  • Một số thông tin hay phương thức hỗ trợ xử lý security trong Bean của EJB
    • EJB Context là gateway đến container và có khả năng truy cập từ bên trong bean. Do vậy, các phương thức callbacks hoạt động trên EJB Context để tương tác với container một cách dễ dàng.
    • EJB Context sử dụng javax.ejb.EJBContext với các chức năng hỗ trợ

Methods

Mô tả

getHome()

Sử dụng để lấy đối tượng Home Object.

getCallerPrincipal()

Sử dụng để lấy định danh bảo mật của client đang truy cập vào hệ thống để có thể xác định vai trò của client trong việc truy cập các chức năng của EJB

isCallerInRole(String role)

Xác định client có được phân quyền – role hay không

setRollbackOnly()

Thiết lập chế độ rollback trong transaction hiện hành cho instance bean

getRollbackOnly()

Xác định xem transaction có được đánh dấu rollback không

getUserTransaction()

Lập trình để thực hiện điều khiển transaction

    • Session – Entity Context Interface được extends từ EJBContext, do vậy, session bean có thể truy cập tất cả các phương thức của EJBContext

Ứ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
  • 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  EJB2Security
    • Chúng ta chọn Server là JBoss 4.2.3 GA và version của Java EE là J2EE 1.4 bởi vì chúng ta đang tạo trên nền EJB 2.1
    • 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 Transaction trong EJB2.1
    • Chọn Session Bean
    • Đặ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

      • Tập tin ejb-jar.xml được Netbeans cập nhật tự động như sau

  • Bước 3: phát sinh một số business method cho EJB tương tự như bài Transaction 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

    • 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

    • 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

    • Lưu ý
      • Tên tag ejb-name phải được mapping chính là tag ejb-name trong tập tin ejb-jar.xml (cụ thể TransBean)
      • 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ì các cmp được phát sinh chỉ có Local và Local Home 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ý
    • 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
      • Tạo tập tin users.properties để tạo username và password
        • Click phải chuột vào Source Package của gói ejb, chọn New, chọn Other…

        • Chọn Other trong Categories, chọn Properties File trong File Types

        • Nhấn Next, gõ tên tập tin users và nhấn Finish

        • 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
      • Chúng ta có cấu trúc project cập nhật mới như sau

      • Mở tập tin users.properties cập nhật thông tin username và password tùy theo chúng ta đặt theo mẫu username=password (lưu ý không có khoảng trắng)

      • Mở tập tin roles.properties để cung cấp quyền cho các user đã tồn tại trong users.properties theo dạng username=các roles cấp quyền (lưu ý không có khoảng trắng bên username và các roles phân cách bằng dấu phẩy)

    • Xác định cấu hình security trên các chức năng, nhóm role nào được sử dụng chức năng nào. Chúng ta sẽ cấu hình trên tập tin ejb-jar.xml
      • Tất cả các chức năng cho phép role manage và admin toàn quyền sử dụng, chúng ta bổ sung code xml vào tập tin ejb-jar.xml như sau phần tag assembly-descriptor (trước phần container transaction)

        • Lưu ý:
          • Phần màu đỏ khai báo các security role được phép truy cập vào hệ thống
          • Phần màu xanh định nghĩa các role được phép truy cập tài nguyên cụ thể của một bean nhất định
          • method-name với dấu * thể hiện được sử dụng tất cả
          • Các role nên tồn tại và lấy từ tập tin roles.properties
      • Chúng ta tiếp tục cấu hình cho chức năng doIt và phương thức create cho role jboss sử dụng trong ejb-jar.xml như sau (bổ sung nối tiếp vào phần security ở trên và trước phần container-transaction)

    • 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. Gói ejb được cập nhật như sau

  • 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 AccessLocalException 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
      • Để thực hiện nội dung này, phần cấu hình phải được thể hiện và khai báo trong web deployment descrisptor đó là tập tin web.xml
      • Mở tập tin web.xml trong gói web - EJB2Security-war/WEB-INF, click chọn tag Security

      • Cấu hình authentication, mở rộng mục Login Configuration, chọn Basic để thông báo container kích hoạt browser đưa ra cửa sổ login cho người dùng

      • 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

      • Click nút OK, và áp dụng tương tự với manager và jboss. 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

      • 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

      • 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
    • 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 4.2.3 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 CMR 1:1
      • Click chuột phải trên thành phần gói war trong gói ứng dụng của Enterprise 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 Basic 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 3 lần 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 từ web container đến ejb container thông qua các tham số khai báo của chúng ta trong tập tin deployment descriptor (ejb-jar.xml và web.xml)
  • Tuy nhiên, phần giao diện trình bày lỗi vẫn chưa như mong muốn bởi vì chúng ta thấy rằng kết quả trình bày lỗi về phía người dùng vẫn còn lỗi của server gây nên sự phản cảm cho người dùng. Do vậy, ở đây nhân tiện chúng tôi giới thiệu cách xử lý lỗi và trình bày giao diện báo lỗi về phía người dùng và không bao giờ cho hiển thị những lỗi người dùng mà họ có thể không hiểu
    • Các bước thực hiện để đưa ra cách thức trình bày giao diện tương ứng khi xử lý lỗi như sau
      • Quay trở lại gói web EJB2Security-war, tạo thêm 02 tập tin JSP để xử lý lỗi cụ thể là
        • Trang notAccess.jsp dùng để trình bày thông báo khi người dùng không đăng nhập sai username hay password hay user chưa tồn tại hay chưa đăng ký, cụ thể là lỗi 401
        • Trang accessDenied.jsp dùng để trình bày thông báo khi người dùng là thành viên của hệ thống nhưng không có quyền truy cập tài nguyên hệ thống hay bị giới hạn truy cập, cụ thể là lỗi 403
        • Cấu trúc project web cập nhật như sau

        • Chúng ta cập nhật trang notAccess.jsp như sau
          • Bởi vì nếu chỉ ghi thông báo lỗi thì một trong những cơ chế BASIC authentication là khi người dùng yêu cầu tài nguyên của hệ thống hay truy cập ứng dụng thì lời gọi của người dùng – request được gửi về server hay web container
          • Web container đã được cấu hình hỗ trợ BASIC authentication sẽ gửi response với header có mã code là 401 và tiêu đề WWW-Authentication với có nhóm ký tự Basic realm vê client
          • Client Browser khi nhận được mã lỗi 401 sẽ kích hoạt cửa sổ loginWindow như chúng ta đã thấy trong ví dụ trên
          • Do vậy, nếu như chúng ta xử lý lỗi 401 tức thời thì trình duyệt bao giờ cũng chuyển sang cửa sổ báo lỗi – in thông báo mà không kích hoạt cửa sổ loginWindow
          • Cho nên trong phần đầu của phần xử lý lỗi chúng ta phải kích hoạt cửa số loginWindow bằng cách phương thức setStatus với giá trị truyền 401 để yêu cầu chương trình kích hoạt login Window trước khi xử lý thông báo
          • Chúng ta chỉnh sửa tập tin notAccess.jsp như sau

        • Chúng ta cập nhật trang accessDenied.jsp đơn giản chỉ là thông báo lỗi như sau

      • Cấu hình nội dung xử lý lỗi vào trong tập tin web.xml để yêu cầu container hỗ trợ khi có lỗi tương ứng xảy ra thì chuyển hay gọi trang tương ứng với mã lỗi
        • Chúng ta mở tập tin web.xml, click chọn tag Page

        • Chúng ta thấy phần mục Error Pages là nơi khai báo để yêu cầu khi response header trả về lỗi thì container sẽ chọn trang tương ứng và response về phía người dùng.
        • Chúng ta click nút Add để add mã lỗi cần xử lý vào

        • Để chọn trang xử lý lỗi chúng ta click chọn nút Browse... để chọn trang xử lý lỗi tương ứng trong project của chúng ta. Khi click nút browse xong cửa số hiện tất cả các trang web của chúng ta như sau

        • Chúng ta chọn trang notAccess.jsp và nhấn nút Select File, sau đó điền mã lỗi vào phần Error Code (ở đây chúng ta xử lý lỗi 401, nên chúng ta nhập 401), nếu bạn muốn xử lý 1 exception, bạn có thể nhập vào loại exception với đầy đủ package name của nó

        • Chúng ta nhấn nút OK, giao diện được cập nhật như sau

        • Nhấn Save File và chọn tag XML chúng ta thấy tập tin xml cập nhật như sau

        • Tương tự với việc xử lý lỗi 403 với trang accessDenied.jsp như các bước trên chúng ta cập nhật web.xml như sau

        • Việc mapping xử lý lỗi đã hoàn tất
    • Chúng ta thực hiện Build, Deploy lại Project và Testing lại các bước đã nêu trong các bước trên chúng ta sẽ thấy 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ệ (kết quả vẫn như cũ). Áp dụng tương tự với user: khanhkt, pass: 123456 vì user khanhkt không chặn trên web mà chặn trên ejb

      • 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 3 lần và xuất hiện kết quả như sau

        • Chúng ta thấy rằng lỗi 401 không hiển thị như trước mà thông báo lỗi về phía người dùng rõ ràng.
      • 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. Nhưng bây giờ lỗi 403 không xuất hiện mà hiện ra trang xử lý lỗi tương ứng mà chúng ta đã cấu hình

  • Chúng ta đã hoàn tất thêm bước xử lý lỗi và trình bày giao diện cho người dùng tạo nên tính thuận lợi về phía người dùng và chúng ta học thêm cơ chế xử lý lỗi

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 và Web. Ngoài ra, chúng ta tăng thêm kiến thức và kỹ năng về xử lý lỗi trên giao diện khi thực hiện ứng dụng. 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 2.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 EJB 3.0

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

Đăng nhận xét