JSP - Bảo mật

Các trang JavaServer và các servlet cung cấp một số cơ chế cho các nhà phát triển Web để bảo mật các ứng dụng. Tài nguyên được bảo vệ một cách khai báo bằng cách xác định chúng trong bộ mô tả triển khai ứng dụng và gán một vai trò cho chúng.

Một số cấp độ xác thực có sẵn, từ xác thực cơ bản sử dụng số nhận dạng và mật khẩu đến xác thực tinh vi bằng chứng chỉ.

Xác thực dựa trên vai trò

Cơ chế xác thực trong đặc tả servlet sử dụng một kỹ thuật được gọi là role-based security. Ý tưởng là thay vì hạn chế tài nguyên ở cấp người dùng, bạn tạo vai trò và hạn chế tài nguyên theo vai trò.

Bạn có thể xác định các vai trò khác nhau trong tệp tomcat-users.xml, nằm ngoài thư mục chính của Tomcat trong conf. Ví dụ về tệp này được hiển thị bên dưới:

<?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>

Tệp này xác định một ánh xạ đơn giản giữa username, passwordrole. Lưu ý rằng một người dùng nhất định có thể có nhiều vai trò; ví dụ,username = "both" là trong vai "tomcat" và vai "role1".

Khi bạn đã xác định và xác định các vai trò khác nhau, các hạn chế bảo mật dựa trên vai trò có thể được đặt trên các tài nguyên Ứng dụng Web khác nhau bằng cách sử dụng <security-constraint> yếu tố trong web.xml tệp có sẵn trong thư mục WEB-INF.

Sau đây là một mục 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 mục trên có nghĩa là -

  • Mọi yêu cầu HTTP GET hoặc POST đến một URL được khớp bởi / secure / * sẽ phải tuân theo giới hạn bảo mật.

  • Một người có vai trò quản lý được cấp quyền truy cập vào các tài nguyên được bảo đảm.

  • Các login-config phần tử được sử dụng để mô tả BASIC hình thức xác thực.

Nếu bạn thử duyệt qua bất kỳ URL nào bao gồm /securitythư mục, hộp thoại sau sẽ được hiển thị yêu cầu nhập tên người dùng và mật khẩu. Nếu bạn cung cấp một người dùng"admin" và mật khẩu "secret", thì bạn sẽ có quyền truy cập vào URL khớp với /secured/* vì chúng tôi đã xác định quản trị viên người dùng với vai trò người quản lý được phép truy cập tài nguyên này.

Xác thực dựa trên biểu mẫu

Khi bạn sử dụng phương pháp xác thực MẪU, bạn phải cung cấp biểu mẫu đăng nhập để nhắc người dùng nhập tên người dùng và mật khẩu. Sau đây là một đoạn mã đơn giản củalogin.jsp. Điều này giúp tạo một biểu mẫu cho cùng mục đích -

<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!">
         
      </form>
      
   </body>
</html>

Ở đây bạn phải đảm bảo rằng biểu mẫu đăng nhập phải chứa các thành phần biểu mẫu có tên j_usernamej_password. Hành động trong<form> thẻ phải là j_security_check. POSTphải được sử dụng làm phương thức biểu mẫu. Đồng thời, bạn sẽ phải sửa đổi<login-config> để chỉ định phương thức auth dưới dạng 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>

Bây giờ khi bạn cố gắng truy cập bất kỳ tài nguyên nào bằng URL /secured/*, nó sẽ hiển thị biểu mẫu ở trên yêu cầu id người dùng và mật khẩu. Khi vùng chứa nhìn thấy "j_security_check"hành động, nó sử dụng một số cơ chế nội bộ để xác thực người gọi.

Nếu đăng nhập thành công và người gọi được ủy quyền truy cập tài nguyên được bảo mật, thì vùng chứa sử dụng id phiên để xác định phiên đăng nhập cho người gọi kể từ thời điểm đó. Vùng chứa duy trì phiên đăng nhập bằng cookie có chứa id phiên. Máy chủ gửi cookie trở lại máy khách và miễn là người gọi trình bày cookie này với các yêu cầu tiếp theo, thì vùng chứa sẽ biết người gọi là ai.

Nếu đăng nhập không thành công, thì máy chủ sẽ gửi lại trang được xác định bởi cài đặt trang lỗi biểu mẫu

Đây, j_security_checklà hành động mà các ứng dụng sử dụng đăng nhập dựa trên biểu mẫu phải chỉ định cho biểu mẫu đăng nhập. Trong cùng một biểu mẫu, bạn cũng nên có một điều khiển nhập văn bản được gọi làj_username và một password input control gọi là j_password. Khi bạn thấy điều này, có nghĩa là thông tin có trong biểu mẫu sẽ được gửi đến máy chủ, máy chủ sẽ kiểm tra tên và mật khẩu. Làm thế nào điều này được thực hiện là máy chủ cụ thể.

Kiểm tra Triển khai Vương quốc chuẩn để hiểu cáchj_security_check hoạt động cho Tomcat container ..

Bảo mật có lập trình trong Servlet / JSP

Các HttpServletRequest đối tượng cung cấp các phương thức sau, có thể được sử dụng để khai thác thông tin bảo mật trong thời gian chạy:

Không. Phương pháp & Mô tả
1

String getAuthType()

Các getAuthType() phương thức trả về một đối tượng Chuỗi đại diện cho tên của lược đồ xác thực được sử dụng để bảo vệ Servlet.

2

boolean isUserInRole(java.lang.String role)

Các isUserInRole() phương thức trả về một giá trị boolean: true nếu người dùng ở vai trò đã cho hoặc false nếu họ không ở trong vai trò này.

3

String getProtocol()

Các getProtocol()phương thức trả về một đối tượng Chuỗi đại diện cho giao thức được sử dụng để gửi yêu cầu. Giá trị này có thể được kiểm tra để xác định xem một giao thức an toàn đã được sử dụng hay chưa.

4

boolean isSecure()

Các isSecure()phương thức trả về một giá trị boolean thể hiện nếu yêu cầu được thực hiện bằng HTTPS. Giá trị true có nghĩa là nó đã tồn tại và kết nối được bảo mật. Giá trị sai có nghĩa là yêu cầu không phải.

5

Principle getUserPrinciple()

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

Ví dụ: đối với Trang JavaServer liên kết đến các trang dành cho người quản lý, bạn có thể có mã sau:

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

Bằng cách kiểm tra vai trò của người dùng trong JSP hoặc servlet, bạn có thể tùy chỉnh Trang web để chỉ hiển thị cho người dùng những mục mà họ có thể truy cập. Nếu bạn cần tên của người dùng như được nhập vào biểu mẫu xác thực, bạn có thể gọigetRemoteUser trong đối tượng yêu cầu.