📅  最后修改于: 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.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的简单代码。这有助于创建用于相同目的的表单-
在这里,您必须确保登录表单必须包含名为j_username和j_password的表单元素。 标记中的操作必须是j_security_check 。 POST必须用作表单方法。同时,您将必须修改
...
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容器工作。
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方法。