JSP 安全

  • 安全

    JavaServer Pages和servlet使Web开发人员可以使用多种机制来保护应用程序。通过在应用程序部署描述符中标识资源并为其分配角色,以声明方式保护资源。身份验证有几种级别,从使用标识符和密码的基本身份验证到使用证书的复杂身份验证。
  • 基于角色的身份验证

    Servlet规范中的认证机制使用一种称为基于角色的安全性的技术。这个想法是,您创建角色并按角色限制资源,而不是在用户级别限制资源。您可以在文件tomcat-users.xml中定义不同的角色,该文件位于Tomcat主目录conf之下。该文件的示例如下所示-
    
    <?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>
    
    该文件定义了username,password和roles之间的简单映射。注意,给定的用户可能具有多个角色;例如,username="both"有两个角色"role1"和"admin"角色。一旦确定并定义了不同的角色,就可以使用WEB-INF目录中可用的web.xml文件中的<security-constraint>元素,将基于角色的安全性限制置于不同的Web应用程序资源上。以下是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>
    
    以上条目将意味着-
    • 对/secured/*匹配的URL的任何HTTP GET或POST请求都将受到安全性限制。
    • 授予具有管理者角色的人员访问受保护资源的权限。
    • login-config-元素被用来描述BASIC认证的形式。
    如果您尝试浏览包括/security目录的任何URL ,将显示以下对话框,要求输入用户名和密码。如果您提供用户“admin”和密码“secret”,那么您将可以访问/secured/*匹配的URL,因为我们已经定义了具有管理员角色的用户admin,该角色可以访问该资源。
  • 基于表单的身份验证

    使用FORM身份验证方法时,必须提供一个登录表单以提示用户输入用户名和密码。以下是login.jsp的简单代码。这有助于创建用于相同目的的表单-
    
    <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>
    
    在这里,您必须确保登录表单必须包含名为j_username和j_password的表单元素。<FORM>标记action必须j_security_check。POST必须用作表单方法。同时,您将必须修改<login-config>标记以将auth-method指定为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>
    
    现在,当您尝试使用URL/secured/*访问任何资源时,它将显示上面的表单,询问用户ID和密码。当容器看到“j_security_check” action 时,它使用某种内部机制对调用方进行身份验证。如果登录成功,并且调用方被授权访问受保护的资源,则容器从该点开始使用会话ID为调用方标识登录会话。容器使用包含会话ID的cookie维护登录会话。服务器将cookie发送回客户端,只要调用者向后续请求提供此cookie,则容器将知道调用者是谁。如果登录失败,则服务器发回由form-error-page设置标识的页面,在此,j_security_check是使用基于表单的登录名的应用程序必须为登录表单指定的操作。在相同的形式,你也应该有一个文本输入控件调用为j_username和j_password。当您看到此消息时,这意味着表单中包含的信息将被提交到服务器,服务器将检查名称和密码。如何完成此操作取决于服务器。查看文档以了解j_security_check对于Tomcat容器如何工作。
  • Servlet / JSP中的程序安全性

    HttpServletRequest对象提供了以下方法,可用于在运行时挖掘安全信息
    方法 描述
    String getAuthType() getAuthType()方法返回一个字符串对象,该对象表示用于保护Servlet的身份验证方案的名称。
    boolean isUserInRole(java.lang.String role) isUserInRole()方法返回一个布尔值:如果用户处于给定的角色中,则为true;如果用户不在指定的角色中,则为false。
    String getProtocol() getProtocol()方法返回一个字符串对象,该对象表示用于发送请求的协议。可以检查此值以确定是否使用了安全协议。
    boolean isSecure() isSecure()方法返回一个布尔值,表示是否使用HTTPS发出请求。true的值表示它是,而且连接是安全的。值false表示请求不存在。
    Principle getUserPrinciple() getUserPrinciple()方法返回一个java.security。原则对象,包含当前经过身份验证的用户的名称。
    例如,对于链接到管理器页面的JavaServer页面,您可能具有以下代码-
    
    <% if (request.isUserInRole("manager")) { %>
       <a href = "managers/mgrreport.jsp">Manager Report</a>
       <a href = "managers/personnel.jsp">Personnel Records</a>
    <% } %>
    
    通过检查用户在JSP或servlet中的角色,您可以自定义页面,以只向用户显示她可以访问的项目。如果需要在身份验证表单中输入的用户名,可以调用请求对象中的getRemoteUser方法。