- JSP 基础教程
- JSP - 主页
- JSP - 概述
- JSP - 环境设置
- JSP-架构
- JSP-生命周期
- JSP - 语法
- JSP - 指令
- JSP - 操作
- JSP - 隐式对象
- JSP - 客户请求
- JSP——服务器响应
- JSP - HTTP 状态代码
- JSP - 表单处理
- JSP - 编写过滤器
- JSP - Cookie 处理
- JSP - 会话跟踪
- JSP-文件上传
- JSP - 处理日期
- JSP - 页面重定向
- JSP - 点击计数器
- JSP - 自动刷新
- JSP - 发送电子邮件
- 高级 JSP 教程
- JSP - 标准标签库
- JSP - 数据库访问
- JSP - XML 数据
- JSP-Java Bean
- JSP - 自定义标签
- JSP——表达式语言
- JSP——异常处理
- JSP-调试
- JSP-安全性
- JSP-国际化
- JSP 有用资源
- JSP - 问题与解答
- JSP - 快速指南
- JSP - 有用的资源
- JSP - 讨论
JSP-安全性
JavaServer Pages 和 servlet 为 Web 开发人员提供了多种机制来保护应用程序的安全。通过在应用程序部署描述符中识别资源并为其分配角色,以声明方式保护资源。
可以使用多种级别的身份验证,从使用标识符和密码的基本身份验证到使用证书的复杂身份验证。
基于角色的身份验证
servlet 规范中的身份验证机制使用称为基于角色的安全性的技术。这个想法是,您不是在用户级别限制资源,而是创建角色并按角色限制资源。
您可以在文件tomcat-users.xml中定义不同的角色,该文件位于conf中Tomcat的主目录之外。该文件的示例如下所示 -
<?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 = "both"属于“tomcat”角色和“role1”角色。
识别并定义不同的角色后,可以使用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元素用于描述身份验证的基本形式。
如果您尝试浏览包括/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>标记中的操作必须是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 ”操作时,它会使用某种内部机制来验证调用者的身份。
如果登录成功并且调用者被授权访问受保护的资源,则容器使用会话 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 | 布尔值 isSecure() isSecure ()方法返回一个布尔值,表示请求是否是使用 HTTPS 发出的。true 值意味着它是并且连接是安全的。false 值表示请求不是。 |
5 | 原理 getUserPrinciple() getUserPrinciple ()方法返回一个 java.security.Principle 对象,其中包含当前经过身份验证的用户的名称。 |
例如,对于链接到经理页面的 JavaServer 页面,您可能有以下代码 -
<% if (request.isUserInRole("manager")) { %> <a href = "managers/mgrreport.jsp">Manager Report</a> <a href = "managers/personnel.jsp">Personnel Records</a> <% } %>
通过检查用户在 JSP 或 servlet 中的角色,您可以自定义网页以仅向用户显示她可以访问的项目。如果您需要在身份验证表单中输入的用户名,则可以调用请求对象中的getRemoteUser方法。