📜  JSP-安全性

📅  最后修改于: 2020-11-13 05:32:14             🧑  作者: Mango


JavaServer Pages和servlet使Web开发人员可以使用多种机制来保护应用程序。通过在应用程序部署描述符中标识资源并为其分配角色,以声明方式保护资源。

可以使用多种级别的身份验证,从使用标识符和密码的基本身份验证到使用证书的复杂身份验证。

基于角色的身份验证

Servlet规范中的认证机制使用一种称为基于角色的安全性的技术。这个想法是,您创建角色并按角色限制资源,而不是在用户级别限制资源。

您可以在文件tomcat-users.xml中定义不同的角色,该文件位于conf的Tomcat主目录之外。该文件的示例如下所示-



   
   
   
   
   
   
   
   

该文件定义了用户名,密码角色之间的简单映射。请注意,给定的用户可能具有多个角色;例如, username =“ both”和“ role1”角色。

一旦确定并定义了不同的角色,就可以使用WEB-INF目录中可用的web.xml文件中的元素,对不同的Web应用程序资源施加基于角色的安全限制。

以下是web.xml中的示例条目-


   ...
   
      
         SecuredBookSite
         /secured/*
         GET
         POST
      
      
      
         
            Let only managers use this app
         
         manager
      
   
   
   
      manager
   
   
   
      BASIC
   
   ...

以上条目将意味着-

  • 对/ secured / *匹配的URL的任何HTTP GET或POST请求都将受到安全性限制。

  • 授予具有管理者角色的人员访问受保护资源的权限。

  • login-config元素用于描述身份验证的BASIC形式。

如果尝试浏览包括/ security目录的任何URL,将显示以下对话框,要求输入用户名和密码。如果您提供用户“ admin”和密码“ secret” ,那么您将可以访问/ secured / *匹配的URL,因为我们已经定义了具有管理员角色的用户admin,该角色可以访问该资源。

基于表单的身份验证

使用FORM身份验证方法时,必须提供一个登录表单以提示用户输入用户名和密码。以下是login.jsp的简单代码。这有助于创建用于相同目的的表单-

S.No. Method & Description
1

String getAuthType()

The getAuthType() method returns a String object that represents the name of the authentication scheme used to protect the Servlet.

2

boolean isUserInRole(java.lang.String role)

The isUserInRole() method returns a boolean value: true if the user is in the given role or false if they are not.

3

String getProtocol()

The getProtocol() method returns a String object representing the protocol that was used to send the request. This value can be checked to determine if a secure protocol was used.

4

boolean isSecure()

The isSecure() method returns a boolean value representing if the request was made using HTTPS. A value of true means it was and the connection is secure. A value of false means the request was not.

5

Principle getUserPrinciple()

The getUserPrinciple() method returns a java.security.Principle object that contains the name of the current authenticated user.

在这里,您必须确保登录表单必须包含名为j_usernamej_password的表单元素。

标记中的操作必须是j_security_checkPOST必须用作表单方法。同时,您将必须修改标记以将auth-method指定为FORM-


   ...
   
      
         SecuredBookSite
         /secured/*
            GET
            POST
      
      
      
         Let only managers use this app
         manager
      
   
   
   
      manager
   
   
   
      FORM
      
         /login.jsp
         /error.jsp
      
   
   ...

现在,当您尝试使用URL / secured / *访问任何资源时,它将显示上面的表单,询问用户ID和密码。当容器看到“ j_security_check ”操作时,它使用某种内部机制对调用方进行身份验证。

如果登录成功,并且调用方被授权访问受保护的资源,则容器从该点开始使用会话ID为调用方标识登录会话。容器使用包含会话ID的cookie维护登录会话。服务器将cookie发送回客户端,并且只要调用方向该cookie提出后续请求,容器就会知道调用方是谁。

如果登录失败,则服务器发回由form-error-page设置标识的页面

在此, j_security_check是使用基于表单的登录名的应用程序必须为登录表单指定的操作。在相同的形式,你也应该有一个文本输入控件调用为j_username,并呼吁为j_password密码输入控件。当您看到此消息时,这意味着表单中包含的信息将被提交到服务器,服务器将检查名称和密码。如何完成此操作取决于服务器。

检查“标准领域实现”以了解j_security_check如何为Tomcat容器工作。

Servlet / JSP中的程序安全性

HttpServletRequest对象提供以下方法,可用于在运行时挖掘安全信息-

序号 方法与说明
1个

字符串getAuthType()

getAuthType()方法返回一个String对象,该对象代表用于保护Servlet的身份验证方案的名称。

2

boolean isUserInRole(java.lang.String作用)

isUserInRole()方法返回一个布尔值:如果用户处于给定角色,则返回true;否则,返回false。

3

字符串getProtocol()

getProtocol()方法返回一个String对象,该对象表示用于发送请求的协议。可以检查该值以确定是否使用了安全协议。

4

boolean isSecure()

isSecure()方法返回一个布尔值,该布尔值表示是否使用HTTPS发出了请求。值为true表示确实如此,并且连接是安全的。值为false表示请求不是。

5

原理getUserPrinciple()

getUserPrinciple()方法返回一个java.security.Principle对象,其中包含当前经过身份验证的用户的名称。

例如,对于链接到管理器页面的JavaServer页面,您可能具有以下代码-

通过检查用户在JSP或servlet中的角色,可以自定义网页以仅向用户显示她可以访问的项目。如果需要在身份验证表单中输入的用户名,则可以在请求对象中调用getRemoteUser方法。