// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= 在 NetBeans IDE 中保护 Web 应用程序的安全
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: 在 NetBeans IDE 中保护 Web 应用程序的安全 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, 在 NetBeans IDE 中保护 Web 应用程序的安全

由 Dan Kolar 撰稿，James Branam 和 Jeff Rubinoff 维护

本文档介绍在部署到 Oracle GlassFish Open Source Edition、Oracle WebLogic 或 Apache Tomcat 服务器的 Web 应用程序中添加安全功能的基础知识。

本文档介绍了如何使用基本登录窗口以及 Web 页中的登录窗体配置安全验证。本文档还将指导您完成在 Tomcat 和 GlassFish Server 上创建用户的步骤。创建用户之后，然后可以通过在部署描述符中设置安全属性创建安全角色。本文档还介绍了在将应用程序部署到 GlassFish Server 时，如何使用 JDBC 验证来保护应用程序的安全。

*预计时间：_40_ 分钟*


image::images/netbeans-stamp-80-74-73.png[title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"]


*要学习本教程，您需要具备以下软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Java EE 版本 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发者工具包 (JDK)+] |版本 7 或 8 

|Java EE 平台 |Java EE 6 或 7 

|Travel 数据库 |无版本要求 

|符合 Java EE 规范的 Web 服务器或应用服务器 |Tomcat Web 服务器 7.x 或 8.x、Oracle WebLogic 11g 或
GlassFish Server Open Source Edition 4.x 
|===


== 安装和配置工作环境

安装并启动 NetBeans IDE。可以使用捆绑的 Tomcat 服务器或 GlassFish Server 完成本教程。

确保已安装服务器，并已在 IDE 中注册服务器实例。可以使用服务器管理器来注册已安装的服务器实例。（选择 "Tools"（工具）> "Servers"（服务器）> "Add Server"（添加服务器）。选择 "GlassFish Server <version number>"（GlassFish Server <版本号>）或 "Tomcat <version number>"（Tomcat <版本号>），然后单击 "Next"（下一步）。单击 "Browse"（浏览）并找到该应用服务器的安装目录。单击 "Finish"（完成）。


==  创建 Web 应用程序

在本练习中，您首先将创建 Web 应用程序项目和目录结构。然后在每个安全目录中创建一些简单的  ``html``  文件。Web 应用程序使用基本登录验证来访问安全目录。如果希望使用登录窗体进行验证，则可以向窗体添加  ``jsp``  页。


=== 创建安全目录

1. 选择 "File"（文件）> "New Project"（新建项目）（Ctrl-Shift-N 组合键），从 Java Web 类别中选择 "Web Application"（Web 应用程序），然后单击 "Next"（下一步）。
2. 将项目命名为  ``WebApplicationSecurity`` 。接受默认设置。
3. （可选）选中“使用专用文件夹存储库”复选框，并指定库文件夹的位置。有关此选项的详细信息，请参见_使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG455[+与其他用户共享库+]。
4. 单击 "Next"（下一步）。
5. 选择要在其中部署应用程序的服务器。这里仅列出了已在 IDE 中注册的服务器。单击 "Next"（下一步）。
6. 不需要添加框架，因此请单击 "Finish"（完成）。
7. 如果创建了一个 EE 6 应用程序，请转到 IDE 的 "Projects"（项目）窗口，右键单击该项目的节点，然后选择 "New"（新建）> "Other"（其他）> "Web" > "Standard Deployment Descriptor (web.xml)"（标准部署描述符 (web.xml)）。接受所有默认值，然后单击相应的按钮以完成向导。

*注：*本教程介绍了如何在部署描述符中配置安全功能，但 EE 6 和 EE 7 应用程序默认使用标注，而不是部署描述符。


[start=8]
. 如果使用 GlassFish 或 WebLogic Server 以及 NetBeans IDE 7.0.1 或更高版本，则需生成特定于服务器的描述符。右键单击项目的节点并选择 "New"（新建）> "Other"（其他）> "GlassFish" > "GlassFish Descriptor"（GlassFish 描述符），或选择 "New"（新建）> "Other"（其他）> "WebLogic" > "WebLogic Descriptor"（WebLogic 描述符）。"Create Server-Specific Descriptor"（创建特定于服务器的描述符）对话框将会打开。接受所有默认值，然后单击 "Finish"（完成）。特定于服务器的描述符（名为  ``glassfish-web.xml``  或  ``weblogic.xml`` ）将出现在项目中的 "Configuration Files"（配置文件）文件夹中。

[start=9]
. 在 IDE 的 "Projects"（项目）窗口中，右键单击 "Web Pages"（Web 页），然后选择 "New"（新建）> "Other"（其他）。

[start=10]
. 在新建文件向导中，选择 "Other"（其他）作为类别，选择 "Folder"（文件夹）作为文件类型。单击 "Next"（下一步）。

[start=11]
. 
在新建文件夹向导中，将文件夹命名为 "secureAdmin"，然后单击 "Finish"（完成）。

secureAdmin 文件夹将显示在 "Projects"（项目）窗口的 "Web Pages"（Web 页）文件夹中。

[start=12]
. 重复前面的 3 个步骤，以创建另一个名为 secureUser 的文件夹。

[start=13]
. 在 secureUser 文件夹中创建一个新的  ``html``  文件，方法是在 "Projects"（项目）窗口中右键单击 secureUser 文件夹，然后选择 "New"（新建）> "Other"（其他）。

[start=14]
. 在 "Other"（其他）类别中选择 "HTML" 文件类型。单击 "Next"（下一步）。

[start=15]
. 将新文件命名为 "pageU"，然后单击 "Finish"（完成）。

单击 "Finish"（完成），此时将在源代码编辑器中打开  ``pageU.html``  文件。


[start=16]
. 在源代码编辑器中，将  ``pageU.html``  中的现有代码替换为以下代码。[html-tag]#<html>
   <head>
      <title>#

[source,xml]
----

User secure area[html-tag]#</title>
   </head>
   <body>
      <h1>#User Secure Area[html-tag]#</h1>
   </body>
</html>#
----

[start=17]
. 右键单击 secureAdmin 文件夹并创建一个新的名为 pageA 的  ``html``  文件。

[start=18]
. 在源代码编辑器中，将  ``pageA.html``  中的现有代码替换为以下代码。[html-tag]#<html>
   <head>
      <title>#

[source,xml]
----

Admin secure area[html-tag]#</title>
   </head>
   <body>
      <h1>#Admin secure area[html-tag]#</h1>
   </body>
</html>#
----


=== 创建 JSP 索引页

现在可以创建包含指向安全区域的链接的 JSP 索引页。当用户单击链接时，系统将提示他们输入用户名和口令。如果使用的是基本登录，将使用默认浏览器登录窗口进行提示。如果使用的是登录窗体页，则用户将在一个窗体中输入用户名和口令。

1. 在源代码编辑器中打开  ``index.jsp`` ，并将以下链接添加到  ``pageA.html``  和  ``pageU.html`` ：[jsp-html-tag]#<p>#

[source,html]
----

Request a secure Admin page [jsp-html-tag]#<a# [jsp-html-argument]#href=#[jsp-xml-value]#"secureAdmin/pageA.html"#[jsp-html-tag]#>#here![jsp-html-tag]#</a></p>
<p>#Request a secure User page [jsp-html-tag]#<a# [jsp-html-argument]#href=#[jsp-xml-value]#"secureUser/pageU.html"# [jsp-html-tag]#>#here![jsp-html-tag]#</a></p>#
----

[start=2]
. 保存所做的更改。


=== 创建“登录窗体”（对 Tomcat 为必选，对 GlassFish 或 WebLogic Server 为可选）

如果希望使用登录窗体而不使用基本登录，则可以创建一个包含窗体的  ``jsp``  页。然后在<<Basic_login_config,配置登录方法>>时指定登录页和错误页。

*重要说明：*Tomcat 用户必须创建一个登录窗体。

1. 在 "Projects"（项目）窗口中，右键单击 "Web Pages"（Web 页）文件夹并选择 "New"（新建）> "JSP"。
2. 将文件命名为  ``login`` ，保留其他字段的默认值，然后单击 "Finish"（完成）。
3. 在源代码编辑器中，将以下代码插入到  ``login.jsp``  的  ``<body>``  标记之间。

[source,xml]
----

<[jsp-html-tag]#form# [jsp-html-argument]#action=#[jsp-xml-value]#"j_security_check"# [jsp-html-argument]#method=#[jsp-xml-value]#"POST"#[jsp-html-tag]#>#
   Username:[jsp-html-tag]#<input# [jsp-html-argument]#type=#[jsp-xml-value]#"text"# [jsp-html-argument]#name=#[jsp-xml-value]#"j_username"#[jsp-html-tag]#><br>#
   Password:[jsp-html-tag]#<input# [jsp-html-argument]#type=#[jsp-xml-value]#"password"# [jsp-html-argument]#name=#[jsp-xml-value]#"j_password"#[jsp-html-tag]#>
   <input# [jsp-html-argument]#type=#[jsp-xml-value]#"submit"# [jsp-html-argument]#value=#[jsp-xml-value]#"Login"#[jsp-html-tag]#>
</form>#
----

[start=4]
. 在 "Web Pages"（Web 页）文件夹中创建一个新的名为  ``loginError.html``  的  ``html``  文件。这是一个简单的错误页。

[start=5]
. 在源代码编辑器中，将  ``loginError.html``  中的现有代码替换为以下代码。[html-tag]#<html>
    <head>
        <title>#

[source,xml]
----

Login Test: Error logging in[html-tag]#</title>
    </head>
    <body>
        <h1>#Error Logging In[html-tag]#</h1>
        <br/>
    </body>
</html>#
----


== 在目标服务器上创建用户

要能够在 Web 应用程序中使用用户/口令验证（基本登录或基于窗体的登录）安全功能，必须为目标服务器定义用户及其相应角色。要登录到服务器，该服务器上必须存在用户帐户。

定义用户和角色的方式因指定的目标服务器而异。在本教程中，用户  ``admin``  和  ``user``  用于测试安全设置。您需要确认在相应的服务器上存在这些用户，并为这些用户指定了相应的角色。


=== 在 GlassFish Server 上定义用户

对于本方案，需要使用 GlassFish Server 的管理控制台创建两个分别名为  ``user``  和  ``admin``  的新用户。名为  ``user``  的用户对应用程序具有有限的访问权限，名为  ``admin``  的用户具有管理权限。

1. 通过转至 IDE 的 "Services"（服务）窗口并右键单击 "Servers"（服务器）> "GlassFish Server" > "View Domain Admin Console"（查看域管理控制台）打开 "Admin Console"（管理控制台）。GlassFish Server 的登录页将在浏览器窗口中打开。您需要使用管理员用户名和口令进行登录才能访问管理控制台。

*注：*必须运行应用服务器才能访问管理控制台。要启动服务器，请右键单击 GlassFish Server 节点并选择 "Start"（启动）。


[start=2]
. 在 "Admin Console"（管理控制台）中，导航至 "Configurations"（配置）> "server-config" > "Security"（安全性）> "Realms"（领域）> "File"（文件）。"Edit Realm"（编辑领域）面板将会打开。

image::images/edit-realm.png[]

[start=3]
. 单击 "Edit Realm"（编辑领域）面板顶部的 "Manage Users"（管理用户）按钮。将打开 "File Users"（文件用户）面板。

image::images/file-users.png[]

[start=4]
. 单击 "New"（新建）。将打开 "New File Realm User"（新建文件领域用户）面板。键入  ``user``  作为用户 ID，键入  ``userpw01``  作为口令。单击 "OK"（确定）。

[start=5]
. 按照前面的步骤在  ``file``  领域中创建名为  ``admin`` 、口令为  ``adminpw1``  的用户。


=== 在 Tomcat Web 服务器上定义角色和用户

对于 Tomcat 7，在 NetBeans IDE 中注册服务器时，将创建一个角色为 manager-script 的用户，并为该用户创建一个口令。

Tomcat 服务器的基本用户和角色在  ``tomcat-users.xml``  中。可以在  ``_<CATALINA_BASE>_\conf``  目录中找到  ``tomcat-users.xml`` 。

*注：*通过在 "Services"（服务）窗口中右键单击 Tomcat 服务器节点并选择 "Properties"（属性）可以查找 CATALINA_BASE 位置。"Server Properties"（服务器属性）将打开。CATALINA_BASE 的位置在 "Connection"（连接）标签中。

image::images/tomcat-properties.png[] image::images/catalina-base.png[]

*注：*如果使用早期版本的 IDE 捆绑的 Tomcat 6，该服务器将定义具有口令以及 administrator 和 manager 角色的  ``ide``  用户。用户  ``ide``  的口令是在安装 Tomcat 6 时生成的。可以更改用户  ``ide``  的口令，或者将该口令复制到  ``tomcat-users.xml``  中。

*将用户添加到 Tomcat 中：*

1. 在编辑器中打开  ``_<CATALINA_BASE>_/conf/tomcat-users.xml`` 。
2. 添加一个名为  ``AdminRole``  的角色。

[source,java]
----

<role rolename="AdminRole"/>
----

[start=3]
. 添加一个名为  ``UserRole``  的角色。

[source,java]
----

<role rolename="UserRole"/>
----

[start=4]
. 添加一个名为  ``admin``  并具有  ``adminpw1``  口令和  ``AdminRole``  角色的用户。

[source,java]
----

<user username="admin" password="adminpw1" roles="AdminRole"/>
----

[start=5]
. 添加一个名为  ``user``  并具有  ``userpw01``  口令和  ``UserRole``  角色的用户。

[source,java]
----

<user username="user" password="userpw01" roles="UserRole"/>
----

现在， ``tomcat-users.xml``  文件显示如下：


[source,xml]
----

<tomcat-users>
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
...
<role rolename="AdminRole"/>
<role rolename="UserRole"/>
<user username="user" password="userpw01" roles="UserRole"/>
<user username="admin" password="adminpw1" roles="AdminRole"/>
[User with manager-script role, defined when Tomcat 7 was registered with the IDE]
...
</tomcat-users>
----


=== 在 WebLogic Server 上定义用户和组

对于本方案，首先需要使用 WebLogic Server 的管理控制台创建两个分别名为  ``user``  和  ``admin``  的新用户。将这些用户分别添加到  ``userGroup``  和  ``adminGroup``  组中。稍后，将要为这些组指定安全角色。 ``userGroup``  将对应用程序具有有限的访问权限，而  ``adminGroup``  将具有管理权限。

WebLogic link:http://download.oracle.com/docs/cd/E21764_01/apirefs.1111/e13952/taskhelp/security/ManageUsersAndGroups.html[+管理控制台联机帮助+]中提供了有关向 Web Logic 服务器添加用户和组的一般说明。

*将 "user" 和 "admin" 用户和组添加到 WebLogic 中：*

1. 通过转至 IDE 的 "Services"（服务）窗口并右键单击 "Servers"（服务器）> "WebLogic Server" > "View Admin Console"（查看管理控制台）打开 "Admin Console"（管理控制台）。GlassFish Server 的登录页将在浏览器窗口中打开。您需要使用管理员用户名和口令进行登录才能访问管理控制台。

*注：*必须运行应用服务器才能访问管理控制台。要启动服务器，请右键单击 WebLogic Server 节点并选择 "Start"（启动）。


[start=2]
. 在左面板中，选择 "Security Realms"（安全领域）。"Summary of Security Realms"（安全领域概要）页将会打开。

[start=3]
. 在 "Summary of Security Realms"（安全领域概要）页中，选择领域的名称（默认领域为 "myrealm"）。"Settings for Realm Name"（领域名称设置）页将会打开。

[start=4]
. 在 "Settings for Realm Name"（领域名称设置）页中，选择 "Users and Groups"（用户和组）> "Users"（用户）。将显示 "Users"（用户）表。

[start=5]
. 在 "Users"（用户）表中，单击 "New"（新建）。"Create New User"（创建新用户）页将会打开。

[start=6]
. 键入名称 "user" 和口令 "userpw01"。还可以键入说明。接受默认的 "Authentication Provider"（验证提供器）。 

image::images/wl-admin-newuser.png[]

[start=7]
. 单击 "OK"（确定）。您将返回到 "Users"（用户）表。

[start=8]
. 单击 "New"（新建）并添加一个具有名称 "admin" 和口令 "admin1" 的用户。

[start=9]
. 打开 "Groups"（组）标签。将显示 "Groups"（组）表。

[start=10]
. 单击 "New"（新建）。"Create a New Group"（创建新组）窗口将会打开。

[start=11]
. 将组命名为 userGroup。接受默认提供器并单击 "OK"（确定）。您将返回到 "Groups"（组）表。

[start=12]
. 单击 "New"（新建）并创建组 adminGroup。

[start=13]
. 为下一过程打开 "Users"（用户）标签。

现在，将  ``admin``  用户添加至  ``adminGroup`` ，并将  ``user``  用户添加至  ``userGroup`` 。

*将用户添加到组中：*

1. 在 "Users"（用户）标签中，单击  ``admin``  用户。用户的 "Settings"（设置）页将会打开。
2. 在 "Settings"（设置）页中，打开 "Groups"（组）标签。
3. 在 "Parent Groups: Available:"（父组：可用：）表中，选择  ``adminGroup`` 。
4. 单击向右箭头 >。 ``adminGroup``  将出现在 "Parent Groups: Chosen:"（父组: 选定:）表中。 

image::images/wl-admin-usersettings.png[]

[start=5]
. 单击 "Save"（保存）。

[start=6]
. 返回到 "Users"（用户）标签。

[start=7]
. 单击  ``user``  用户并将其添加至  ``userGroup`` 。


== 配置登录方法

在为应用程序配置登录方法时，可以使用浏览器提供的登录窗口进行基本登录验证。另外，还可以创建具有登录窗体的 Web 页。这两种登录配置都是基于用户/口令验证的。

要配置登录，需创建_安全约束_并为这些安全约束指定角色。安全约束定义一组文件。将角色指定给约束时，拥有该角色的用户可以访问约束定义的文件集。例如，在本教程中，您将 AdminRole 指定给 AdminConstraint，将 UserRole 和 AdminRole 指定给 UserConstraint。这意味着，具有 AdminRole 角色的用户有权访问 Admin 文件和 User 文件，但具有 UserRole 角色的用户只有权访问 User 文件。

*注：*向单独的管理员角色提供对用户文件的访问权限不是常规用例。替代方法是只将 UserRole 指定给 UserConstraint，并且在服务器端将 AdminRole 赋予也是管理员的特定 *用户*。您应决定如何按用例授予访问权限。

通过配置  ``web.xml`` ，可以为应用程序配置登录方法。可以在 "Projects"（项目）窗口的 "Configuration Files"（配置文件）目录中找到  ``web.xml``  文件。


=== 基本登录

在使用基本登录配置时，登录窗口由浏览器提供。访问安全内容需要有效的用户名和口令。

以下步骤介绍了如何为 GlassFish 和 WebLogic Server 配置基本登录。Tomcat 用户需要使用<<form-login,窗体登录>>。

*配置基本登录：*

1. 在 "Projects"（项目）窗口中，展开项目的 "Configuration Files"（配置文件）节点，然后双击  ``web.xml`` 。将在可视编辑器中打开  ``web.xml``  文件。
2. 单击工具栏中的 "Security"（安全），在 "Security"（安全）视图中打开该文件。
3. 展开 "Login Configuration"（登录配置）节点，然后将 "Login Configuration"（登录配置）设置为 "Basic"（基本）。

*注：*如果希望使用窗体，请选择 "Form"（窗体）而不是 "basic"（基本），并指定登录页和登录错误页。


[start=4]
. 根据服务器输入领域名称。
* *GlassFish：*输入  ``file``  作为领域名称。这是在 GlassFish Server 上创建用户所在的默认领域名称。
* *Tomcat：*请勿输入领域名称。
* *WebLogic：*输入您的领域名称。默认领域是  ``myrealm`` 。

image::images/security-roles.png[]

[start=5]
. 展开 "Security Roles "（安全角色）节点，然后单击 "Add"（添加）可添加角色名称。

[start=6]
. 添加以下安全角色：
*  ``AdminRole`` 。添加到此角色的用户将有权访问服务器的  ``secureAdmin``  目录。
*  ``UserRole`` 。添加到此角色的用户将有权访问服务器的  ``secureUser``  目录。

*注：*GlassFish 角色名称必须以大写字母开头。


[start=7]
. 通过执行以下操作，创建和配置名为  ``AdminConstraint``  的安全约束：
1. 单击 "Add Security Constraint"（添加安全约束）。将显示新安全约束部分。
2. 输入  ``AdminConstraint``  作为新安全约束的显示名称。

image::images/admin-constraint.png[]

[start=3]
. 单击 "ADD"（添加）。将打开 "Add Web Resource"（增加 Web 资源）对话框。

[start=4]
. 
在 "Add Web Resource"（增加 Web 资源）对话框中，将 "Resource Name"（资源名称）设置为  ``Admin`` ，将 "URL Pattern"（URL 模式）设置为  ``/secureAdmin/*`` ，然后单击 "OK"（确定）。对话框将关闭。

*注：*如果使用星号 (*)，则会授予用户访问该文件夹中所有文件的权限。

image::images/addwebresource.png[]

[start=5]
. 选中 "Enable Authentication Constraint"（启用验证约束），然后单击 "Edit"（编辑）。"Edit Role Names"（编辑角色名称）对话框将会打开。

[start=6]
. 在 "Edit Role Names"（编辑角色名称）对话框中，在左窗格中选择 AdminRole，单击 "Add"（添加），然后单击 "OK"（确定）。

在完成上述步骤之后，结果应如下图所示：

image::images/constraints.png[]

[start=8]
. 通过执行以下操作，创建和配置名为  ``UserConstraint``  的安全约束：
1. 单击 "Add Security Constraint"（添加安全约束），创建新的安全约束。
2. 输入  ``UserConstraint``  作为新安全约束的显示名称。
3. 单击 "Add"（添加），添加 "Web Resource Collection"（Web 资源集合）。
4. 在 "Add Web Resource"（增加 Web 资源）对话框中，将 "Resource Name"（资源名称）设置为  ``User`` ，将 URL 模式设置为  ``/secureUser/*`` ，然后单击 "OK"（确定）。
5. 选中 "Enable Authentication Constraint"（启用验证约束），然后单击 "Edit"（编辑）以编辑 "Role Name"（角色名称）字段。
6. 在 "Edit Role Names"（编辑角色名称）对话框中，在左窗格中选择 AdminRole 和 UserRole，单击 "Add"（添加），然后单击 "OK"（确定）。
注：还可以在 web.xml 中设置会话的超时时间。要设置超时，请单击可视编辑器的 "General"（常规）标签，然后指定希望会话持续的时间。默认值为 30 分钟。 
 


=== 窗体登录

使用窗体进行登录可以定制登录页和错误页的内容。使用窗体配置验证的步骤与基本登录配置相同，但需要指定您创建的<<loginform,登录页和错误页>>。

以下步骤演示如何配置登录窗体

1. 在 "Projects"（项目）窗口中，双击位于  ``Web 页/WEB-INF``  目录中的  ``web.xml`` ，在可视编辑器中打开该文件。
2. 单击工具栏中的 "Security"（安全），在 "Security"（安全）视图中打开该文件，并展开 "Login Configuration"（登录配置）节点。
3. 将 "Login Configuration"（登录配置）设置为 "Form"（窗体）。
4. 通过单击 "Browse"（浏览）并找到  ``login.jsp``  设置“窗体登录页”。
5. 
通过单击 "Browse"（浏览）并找到  ``loginError.html``  设置“窗体错误页”。

image::images/login-forms.png[]

[start=6]
. 根据服务器输入领域名称。
* *GlassFish：*输入  ``file``  作为领域名称。这是在 GlassFish Server 上创建用户所在的默认领域名称。
* *Tomcat：*请勿输入领域名称。
* *WebLogic：*输入您的领域名称。默认领域是  ``myrealm`` 。

[start=7]
. 展开 "Security Roles "（安全角色）节点，然后单击 "Add"（添加）可添加角色名称。

[start=8]
. 添加以下安全角色：
|===

|服务器角色 |描述 

|AdminRole |添加到此角色的用户将有权访问服务器的  ``secureAdmin``  目录。 

|UserRole |添加到此角色的用户将有权访问服务器的  ``secureUser``  目录。 
|===

[start=9]
. 通过执行以下操作，创建和配置名为  ``AdminConstraint``  的安全约束：
1. 单击 "Add Security Constraint"（添加安全约束），创建新的安全约束。
2. 输入  ``AdminConstraint``  作为新安全约束的显示名称。
3. 单击 "Add"（添加），添加 "Web Resource Collection"（Web 资源集合）。
4. 
在 "Add Web Resource"（增加 Web 资源）对话框中，将 "Resource Name"（资源名称）设置为  ``Admin`` ，将“URL 模式”设置为  ``/secureAdmin/*`` ，然后单击 "OK"（确定）。

*注：*如果使用星号 (*)，则会授予用户访问该文件夹中所有文件的权限。

image::images/addwebresource.png[]

[start=5]
. 选中 "Enable Authentication Constraint"（启用验证约束），然后单击 "Edit"（编辑）。"Edit Role Names"（编辑角色名称）对话框将会打开。

[start=6]
. 在 "Edit Role Names"（编辑角色名称）对话框中，在左窗格中选择 AdminRole，单击 "Add"（添加），然后单击 "OK"（确定）。

在完成上述步骤之后，结果应如下图所示：

image::images/constraints.png[]

[start=10]
. 通过执行以下操作，创建和配置名为  ``UserConstraint``  的安全约束：
1. 单击 "Add Security Constraint"（添加安全约束），创建新的安全约束。
2. 输入  ``UserConstraint``  作为新安全约束的显示名称。
3. 单击 "Add"（添加），添加 "Web Resource Collection"（Web 资源集合）。
4. 在 "Add Web Resource"（增加 Web 资源）对话框中，将 "Resource Name"（资源名称）设置为  ``User`` ，将 URL 模式设置为  ``/secureUser/*`` ，然后单击 "OK"（确定）。
5. 选中 "Enable Authentication Constraint"（启用验证约束），然后单击 "Edit"（编辑）以编辑 "Role Name"（角色名称）字段。
6. 在 "Edit Role Names"（编辑角色名称）对话框中，在左窗格中选择 AdminRole 和 UserRole，单击 "Add"（添加），然后单击 "OK"（确定）。
注：还可以在 web.xml 中设置会话的超时时间。要设置超时，请单击可视编辑器的 "General"（常规）标签，然后指定希望会话持续的时间。默认值为 30 分钟。


== 配置服务器部署描述符

如果要将应用程序部署到 GlassFish 或 WebLogic Server，则需配置服务器部署描述符，以映射在  ``web.xml``  中定义的安全角色。服务器部署描述符列在 "Projects"（项目）窗口中项目的 "Configuration Files"（配置文件）节点下。


=== 配置 GlassFish Server 部署描述符

GlassFish Server 部署描述符名为  ``glassfish-web.xml`` 。服务器部署描述符在 "Configuration Files"（配置文件）文件夹中。如果它不在此处，可通过右键单击项目的节点并转至 "New"（新建）> "Other"（其他）> "GlassFish" > "GlassFish Deployment Descriptor"（GlassFish 部署描述符）来创建。接受所有默认设置。

请注意，在  ``web.xml``  中输入的值将显示在  ``glassfish-web.xml``  中。IDE 会从  ``web.xml``  中提取这些值。

*配置 GlassFish 部署描述符：*

1. 在 "Projects"（项目）窗口中，展开项目的 "Configuration Files"（配置文件）节点，然后双击  ``glassfish-web.xml`` 。 ``glassfish-web.xml``  部署描述符将在 GlassFish 部署描述符的特殊标签化编辑器中打开。

*注：*对于早于 3.1 的 GlassFish Server 版本，此文件名为  ``sun-web.xml`` 。


[start=2]
. 选择 "Security"（安全）标签以显示安全角色。

[start=3]
. 选择 AdminRole 安全角色节点以打开 "Security Role Mapping"（安全角色映射）窗格。

[start=4]
. 
单击 "Add Principal"（添加主用户），并为主用户名称输入  ``admin`` 。单击 "OK"（确定）。

image::images/add-principal.png[]

[start=5]
. 选择 UserRole 安全角色节点以打开 "Security Role Mapping"（安全角色映射）窗格。

[start=6]
. 单击 "Add Principal"（添加主用户），并为主用户名称输入  ``user`` 。单击 "OK"（确定）。

[start=7]
. 将更改保存到  ``glassfish-web.xml`` 。

此外，也可以通过单击 "XML" 标签，在 XML 编辑器中查看和编辑  ``glassfish-web.xml`` 。如果在 XML 编辑器中打开  ``glassfish-web.xml`` ，则可以看到  ``glassfish-web.xml``  具有以下安全角色映射信息：

[xml-tag]#<security-role-mapping>
    <role-name>#

[source,xml]
----

AdminRole[xml-tag]#</role-name>
    <principal-name>#admin[xml-tag]#</principal-name>
</security-role-mapping>
<security-role-mapping>
    <role-name>#UserRole[xml-tag]#</role-name>
    <principal-name>#user[xml-tag]#</principal-name>
</security-role-mapping>#
----


=== 配置 WebLogic Server 部署描述符

WebLogic 部署描述符名为  ``weblogic.xml`` 。目前，IDE <<gf-dd,对 GlassFish 部署描述符的支持>>未扩展至 WebLogic 部署描述符。因此，您需要手动对  ``weblogic.xml``  进行所有更改。

WebLogic Server 部署描述符在 "Configuration Files"（配置文件）文件夹中。如果它不在此处，可通过右键单击项目的节点并转至 "New"（新建）> "Other"（其他）> "WebLogic" > "WebLogic Deployment Descriptor"（WebLogic 部署描述符）来创建。接受所有默认设置。

*注：*有关确保 WebLogic 中 web 应用程序安全（包括声明和编程安全）的详细信息，请参见link:http://download.oracle.com/docs/cd/E21764_01/web.1111/e13711/thin_client.htm[+针对 Oracle WebLogic Server 的 Oracle Fusion Middleware 编程安全+]。

*配置 WebLogic 部署描述符：*

1. 在 "Projects"（项目）窗口中，展开项目的 "Configuration Files"（配置文件）节点，然后双击  ``weblogic.xml`` 。 ``weblogic.xml``  部署描述符在编辑器中打开。
2. 在  ``<weblogic-web-app>``  元素内，键入或粘贴以下安全角色指定元素：[xml-tag]#<security-role-assignment>
    <role-name>#

[source,xml]
----

AdminRole[xml-tag]#</role-name>
    <principal-name>#adminGroup[xml-tag]#</principal-name>
</security-role-assignment>
<security-role-assignment>
    <role-name>#UserRole[xml-tag]#</role-name>
    <principal-name>#userGroup[xml-tag]#</principal-name>
</security-role-assignment>#
----

[start=3]
. 将更改保存到  ``weblogic.xml`` 。


== 部署并运行应用程序

在 "Projects"（项目）窗口中，右键单击该项目节点并选择 "Run"（运行）。

*注：*默认情况下，将在启用“在保存时编译”功能的情况下创建项目，因此无需先编译代码即可在 IDE 中运行应用程序。有关“在保存时编译”功能的详细信息，请参见 _Developing Applications with NetBeans IDE User's Guide_ 中的 link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG510[+Building Java Projects+]。

在构建应用程序并将其部署到服务器之后，将在 Web 浏览器中打开起始页。通过单击 *admin* 或 *user* 选择您要访问的安全区域。

image::images/deploy1.png[]

在提供用户和口令之后，共有三个可能的结果：

* 此用户的口令正确并且用户具有访问安全内容的权限 -> 显示安全内容页

image::images/deploy2.png[]

* 
此用户的口令不正确 -> 显示错误页

image::images/deploy3.png[]

* 
此用户的口令正确，但用户没有访问安全内容的权限 -> 浏览器显示 "Error 403 Access to the requested resource has been denied"

image::images/deploy4.png[]


== 小结

在本教程中，您创建了一个安全 Web 应用程序。您已经通过使用 web.xml 和 glassfish-web.xml 描述符编辑器，以及创建具有安全登录和多个身份标识的 Web 页，编辑了安全设置。



== 另请参见

* link:quickstart-webapps.html[+Web 应用程序开发简介+]
* link:../../trails/java-ee.html[+Java EE 和 Java Web 学习资源+]


|===
|
link:/about/contact_form.html?to=3&subject=Feedback: Securing a Web Application[+发送有关此教程的反馈意见+]

 
|===
