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方法。