Chƣơng 3 : Bảo mật với dịch vụ RESTful
3.6 Áp dụng bảo mật dịch vụ web RESTful
Để bảo mật dịch vụ web RESTful theo giải pháp đã đưa ra, chúng ta cần thực hiện theo một trong các phương pháp xác thực, cấp quyền, hoặc mã hóa.
3.6.1 Bảo mật dịch vụ web RESTful bằng cách cấu hình web.xml
Trong mô tả web.xml của ứng dụng web chứa dịch vụ RESTful chúng ta cần đưa vào các mô tả, hay các thẻ mô tả để có thể ứng dụng được chức năng bảo mật ta cần làm các việc như sau:
Định nghĩa một thẻ <security-constraint> cho mỗi tập tài nguyên(các URI) mà ta có kế hoạch bảo mật.
Sử dụng thẻ <login-config> để định nghĩa kiểu xác nhận mà ta muốn sử dụng và các realm bảo mật mà các ràng buộc trong đó sẽ được áp dụng.
Định nghĩa một hoặc nhiều tập quyền sử dụng thẻ <security-role> và ánh xạ chúng vào vào các ràng buộc bảo mật định nghĩa trong bước một.
Để mã hóa cần thêm thẻ <user-data-constraint> và thêm vào thẻ này một thẻ con <transport-guarantee> với giá trị CONFIDENTIAL.
<web-app> <servlet> <servlet-name>RestServlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> </servlet> <servlet-mapping> <servlet-name>RestServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection>
<web-resource-name>Orders</web-resource-name> <url-pattern>/orders</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>default</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role> </web-app>
3.6.2 Bảo mật dịch vụ web RESTful bằng cách sử dụng SecurityContext
Trong RESTful gói giao diện javax.ws.rs.core.SecurityContext cung cấp cho chúng ta thông tin bảo mật liên quan đến yêu cầu người dùng. SecurityContext cung cấp các chức năng tương tự javax.servlet.http.HttpServletRequest cho phép bạn truy cập thông tin bảo mật sau:
Đối tượng java.security.Principal chứa đựng tên người dùng mà tạo ra yêu cầu.
Người dùng xác thực trong đó gồm có cả quyền riêng.
Yêu cầu được thực hiện bằng cách sử dụng kênh an toàn như HTTPS.
Ta truy cập đối tượng SecurityContext thêm thể hiển vào các trường của lớp như phương thức setter hoặc các tham số của phương thức sử dụng đối tượng javax.ws.rs.core.Contextannotation. Đoạn mã sau chỉ ra cách thêm thể hiện của đối tượng SecurityContext vào các tham số của phương thức sử dụng ký hiện @Context và kiểm tra người dùng được bảo mật hay chưa trong quyền admin trước khi trả kết quả về.
package samples.helloworld; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.Context; ... @Path("/stateless") @Stateless(name = "JaxRSStatelessEJB") public class StlsEJBApp {
...
@GET
@Produces("text/plain;charset=UTF-8") @Path("/hello")
public String sayHello(@Context SecurityContext sc) { if (sc.isUserInRole("admin")) return "Hello World!"; throw new SecurityException("User is unauthorized."); }
3.6.3 Bảo mật dịch vụ web RESTful bằng cách sử dụng ký hiệu
Gói javax.annotation.security cung cấp cho chúng ta các ký hiệu để có thể giúp RESTful Web service bảo mật hơn. Trong bảng sau đây định nghĩa các ký hiệu các ký hiệu có thể được sử dụng để bảo mật RESTful Web service.
Ký hiệu Mô tả
DeclareRoles Được sử dụng bởi ứng dụng để khai báo các quyền.
DenyAll Chỉ ra rằng không có quyền bảo mật nào được phép yêu cầu xác định tài nguyên chỉ đỉnh.
PermitAll Chỉ ra rằng tất cả các quyền bảo mật được phép truy cập tài nguyên được chỉ định.
RolesAllowed Chỉ ra danh sách các quyền được phép truy cập vào tài nguyên của ứng dụng.
RunAs Định nghĩa định danh ứng dụng trong suốt quá trình thực thi trong trình chứa J2EE.
Đoạn mã sau đây chỉ ra cách định nghĩa các quyền bảo mật được cho phép như thế nào, hoặc mặc định để truy cập để truy cập các phương thức được định nghĩa trong lớp helloWorld. Phương thức sayHello được ký hiệu bởi ký hiệu truy cập @RolesAllows để override phương thức mặc định và chỉ cho phép những người dùng thuộc quyền bảo mật truy cập ADMIN.
package samples.helloworld; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces;
@Path("/helloworld")
@RolesAllowed({"ADMIN", "ORG1"}) public class helloWorld { @GET @Path("sayHello")
@Produces("text/plain") @RolesAllows("ADMIN") public String sayHello() { return "Hello World!"; }
Chƣơng 4- Thiết kế và hiện thực hệ thống SMSGateway
Trong chương này sẽ giới thiệu tổng quan về hệ thống cũng như lược đồ, cấu trúc của hệ thống SMSGateway và các công nghệ quan trọng được sử dụng trong hệ thống, cũng trong chương này sẽ mô tả quá trình thiết kế REST API, mô tả cấu trúc REST API sẽ xây dựng, nó được xây dựng như thế nào, môđun nào sẽ được làm và với mỗi môđun như vậy nó làm gì và tương tác với môđun khác như thế nào, hơn nữa sẽ giải thích nguyên tắc REST áp dụng vào hệ thống như thế nào, ngoài ra còn mô tả lược đồ use case chính được sử dụng.