14/08/2018, 11:09

Bảo mật trong JSP

JavaServer Pages và Servlet cung cấp một số kỹ thuật có sẵn tới lập trình viên để bảo mật các ứng dụng. Nguồn được bảo vệ bởi việc nhận diện chúng trong Application Deployment Descriptor và gán một role cho chúng. Một số mức độ xác nhận (Authentication) là có sẵn, từ Basic Authentication ...

JavaServer Pages và Servlet cung cấp một số kỹ thuật có sẵn tới lập trình viên để bảo mật các ứng dụng. Nguồn được bảo vệ bởi việc nhận diện chúng trong Application Deployment Descriptor và gán một role cho chúng.

Một số mức độ xác nhận (Authentication) là có sẵn, từ Basic Authentication (xác nhận cơ bản) bởi sử dụng Identifier và Password cho tới Sophisticated Authentication (xác nhận tinh vi hơn) bởi sử dụng Certificate.

Role dựa trên Authentication

Kỹ thuật Authentication trong Servlet Specification sử dụng một kỹ thuật gọi là Role-Based Security. Ý tường này thay cho việc hạn chế các nguồn (restricting resources) tại level người sử dụng, bạn tạo các role và hạn chế nguồn bởi role đó.

Bạn có thể định nghĩa các role khác nhau trong tomcat-users.xml file, mà được đặt tại cuối của Home directory trong Tomcat trong conf. Một ví dụ của file này là:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="admin" password="secret" roles="admin,manager"/>
</tomcat-users>

File này định nghĩa một ánh xạ đơn giản giữa user name, password và role. Chú ý rằng, một người sử dụng đã cho có nhiều role, ví dụ, user name="both" là trong "tomcat" role và "role1" role.

Khi bạn đã nhận diện và định nghĩa các role khác nhau, một sự hạn chế Role-Based Security có thể được đặt trên các nguồn Web application khác nhau bởi sử dụng phần tử <security-constraint> trong web.xml file có sẵn trong thư mục WEB-INF.

Ví dụ sau là một entry mẫu trong web.xml:

<web-app>
...
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
               SecuredBookSite
            </web-resource-name>
            <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>
            Let only managers use this app
            </description>
            <role-name>manager</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
  	   <role-name>manager</role-name>
    </security-role>
    <login-config>
      <auth-method>BASIC</auth-method>
    </login-config>
...
</web-app>

Các entry trên nghĩa là:

Bây giờ, nếu bạn thử trình duyệt tới bất kỳ URL nào bao gồm thư mục /security, nó sẽ hiển thị một hộp thoại yêu cầu user name và password. Nếu bạn cung cấp một user là "admin" và password là "secrer", thì chỉ bạn sẽ có quyền truy cập trên URL đã được kết nối bởi /secured/*, bởi vì ở trên chúng ta đã định nghĩa user admin với manager role, người mà được phép truy cập nguồn này.

Form dựa trên Authentication

Khi bạn sử dụng phương thức FORM authentication, bạn phải cung cấp một login form để nhắc người dùng về một username và một password. Sau đây là code đơn giản login.jsp để tạo mọt form cho mục đích trên:

<html>
<body bgcolor="#ffffff">
   <form method="POST" action="j_security_check">
      <table border="0">
      <tr>
      <td>Login</td>
      <td><input type="text" name="j_username"></td>
      </tr>
      <tr>
      <td>Password</td>
      <td><input type="password" name="j_password"></td>
      </tr>
      </table>
      <input type="submit" value="Login!">
      </center>
   </form>
</body>
</html>
 

Tại đây bạn phải đảm bảo rằng, login form phải chứa các phần tử form với tên j_username và j_password. Action trong thẻ <form> phải là j_security_check. Phương thức POST phải được sử dụng như là phương thức của form. Cùng lúc đó, bạn phải sửa đổi thẻ <login-config> để xác định auth-method là FORM:

<web-app>
...
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
               SecuredBookSite
            </web-resource-name>
            <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>
            Let only managers use this app
            </description>
            <role-name>manager</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
  	   <role-name>manager</role-name>
    </security-role>
    <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
    </login-config>
...
</web-app>

Lúc này, khi bạn thử truy cập bất kỳ nguồn nào với URL là /security/*, nó sẽ hiển thị form trên, yêu cầu cho user id và password. Khi container thấy "j_security_check" action, nó sử dụng một số kỹ thuật nội vi để xác nhận khách truy cập.

Nếu việc login là thành công và khách truy cập được cho quyền truy cập tới các nguồn bảo mật, thì khi đó container sử dụng một session-id để nhận diện login session cho khách truy cập từ thời điểm đó. Container duy trì login session với một cookie chứa session-id đó. Server gửi cookie trở lại tới Client, và miễn là khách truy cập đưa ra cookie này với các request liên tục, thì container sẽ biết khách truy cập đó là ai.

Nếu login thất bại, thì Server gửi trả lại trang đó một thiết lập form-error-page

Tại đây j_security_check là action mà các ứng dụng sử dụng form dựa trên login phải xác định login form đó. Trong cùng form đó bạn cũng nên có một điều khiển Text input, gọi là j_username và một password gọi là j_password. Khi bạn thấy điều này, nghĩa là thông tin được chứa trong form đó sẽ được đệ trình tới Server, mà sẽ kiểm tra name và password. Đó là cách thực hiện với một Server cụ thể.

Bạn kiểm tra Standard Realm Implementations để hiểu cách j_security_check làm việc cho Tomcat container.

Bảo mật tự động trong một Servlet/JSP

Đối tượng HttpServletRequest cung cấp các phương thức có thể được sử dụng để đặt thông tin bảo mật tại runtime.

SNPhương thức and Description
1

String getAuthType()

Phương thức getAuthType() trả về một đối tượng String mà biểu diễn tên của Authentication Scheme được sử dụng để bảo về Servlet

2

boolean isUserInRole(java.lang.String role)

Phương thức isUserInRole() trả về true nếu người dùng là ở một role đã cho, trả về false nếu họ là không

3

String getProtocol()

Phương thức getProtocol() trả về một đối tượng String biểu diễn giao thức được để gửi request. Giá trị này có thể được kiểm tra để quyết định nếu một giao thức an toàn được sử dụng

4

boolean isSecure()

Phương thức isSecure() method trả về giá trị true biểu diễn nếu request được tạo bởi sử dụng HTTPS. Giá trị true nghĩa là nó và kết nối là an toàn. Giá trị false nghĩa là yêu cầu là không an toàn

5

Principle getUserPrinciple()

Phương thức getUserPrinciple() trả về một đối tượng java.security.Principle chứa tên người dùng đã được xác nhận hiện tại

Ví dụ, một JavaServer Page mà liên kết với các trang có role là manager, bạn có các dòng code sau:

<% if (request.isUserInRole("manager")) { %>
<a href="managers/mgrreport.jsp">Manager Report</a>
<a href="managers/personnel.jsp">Personnel Records</a>
<% } %>

Bằng việc kiểm tra role của người sử dụng trong một JSP hoặc Servlet, bạn có thể tùy chỉnh Webpage để hiển thị các item mà chỉ người đó được truy cập. Nếu bạn cần tên của người dùng khi họ nhập trong Authentication Form, bạn có thể gọi phương thức getRemoteUser trong đối tượng request.

0