发布于 2015-08-17 14:49:59 | 238 次阅读 | 评论: 0 | 来源: 网络整理
JavaServer页面和servlet提供给Web开发人员几个机制,以确保应用程序。资源是通过确定它们在应用程序部署描述符和分配角色给他们声明的保护。
认证的几个层次可用,使用证书,从基本的使用认证标识和密码,复杂的认证。
在Servlet规范的认证机制使用一种称为基于角色的安全技术。这个想法是,而不是在用户级别限制的资源,您创建角色和角色限制的资源。
可以在文件tomcat-users.xml中,位于关在机密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>
文件定义的用户名,密码和角色之间的简单映射。请注意,给定的用户可以具有多个角色,例如,name="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>
上述项目将意味着:
任何HTTP GET或POST请求来匹配 /secured/* 将受到安全限制的URL。
个人与管理者的角色被赋予访问受保护的资源。
最后,在login-config元素用来描述认证的基本形式。
现 在,如果您尝试浏览到包含/security目录的任何URL,它会显示一个对话框,要求用户名和密码。如果你提供用户“admin”和密码 “secrer”,那么只有将会对URL访问匹配/secured/*因为上面我们已经定义了用户名为admin,谁被允许访问此资源管理器的作用。
当使用表单身份验证方法,必须提供一个登录表单提示输入用户名和密码的用户。以下是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!">
</center>
</form>
</body>
</html>
在这里,必须确保登录表单必须包含一个名为 j_username和j_password表单元素。在<form>标签的动作j_security_check。 POST必须作为表单的方法。同时将必须修改<login-config>标记来指定身份验证,方法形式:
<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/*,它会显示上面的表单要求用户名和密码。当容器看见“j_security_check”的动作,它使用了一些内部机制来验证调用者。
如 果登录成功并且调用方被授权访问受保护的资源,则容器使用一个会话ID来标识一个登录会话的调用者从这一点上。容器维护与包含会话ID的Cookie的登 录会话。服务器发送的cookie返回给客户端,只要调用者提出这个cookie与后续请求,那么容器就知道调用方是谁。
如果登录失败,则服务器将返回确定的表单错误页面设置页面
这 里的j_security_check是使用基于表单登录的应用程序必须指定登录表单的动作。在同一个表格,你也应该有一个文本输入控件调用 j_username和密码输入控件调用为j_password。当你看到这则意味着包含在表单中的信息将被提交到服务器,将检查名称和密码。如何做到这 一点的是服务器的特定。
检查标准领域实现了解如何运作j_security_check 在Tomcat容器。
HttpServletRequest对象提供了以下方法,它可以用来在运行时的安全信息:
SN | 方法和描述 |
---|---|
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. |
例如,一个JavaServer页面经理链接到的网页,可能有下面的代码:
<% if (request.isUserInRole("manager")) { %>
<a href="managers/mgrreport.jsp">Manager Report</a>
<a href="managers/personnel.jsp">Personnel Records</a>
<% } %>
通过检查在JSP或Servlet中的用户角色,可以自定义网页显示用户只有她可以访问项目。如果需要用户的名称,因为它是输入到验证表单,您可以在请求对象调用getRemoteUser方法。