当前位置: 首页 > news >正文

演练:根据安全角色筛选站点地图节点

网站的一个常见要求是限制对某些页的访问。ASP.NET 角色管理和 ASP.NET URL 授权的组合提供了根据安全角色限制对 Web 文件的访问的方法。站点地图使用一种称为“安全修整”的功能隐藏指向那些受限制的文件的导航链接(也基于角色),从而实现这个目的。

角色是用户组的名称。在建立角色之后,可以将各个用户帐户分配到角色。可以根据角色限制对站点地图中的 Web 文件和节点的访问。

通过此演练,您将学会如何执行以下任务:

  • 创建具有成员资格和用户登录功能的网站。

  • 为网站建立角色并将用户帐户分配到建立的角色。

  • 创建 URL 授权规则,这些规则有选择地授予或拒绝对页的访问。

  • 创建站点地图并启用安全修整。

  • 在网页上创建导航菜单。

为了完成本演练,您需要:

  • Microsoft Visual Web Developer。

  • .NET Framework。

  • 计算机上本地安装的 Internet 信息服务 (IIS)。

  • 本演练还需要一种标识各个用户帐户的方法。在工作应用程序中,可以通过各种方法标识用户,例如通过他们的 Windows 用户帐户进行标识。但是在本演练中,用户将通过登录站点标识他们自身。因此,本演练要求有一个已配置为使用 ASP.NET 成员资格和 Forms 身份验证的站点。如果有一个已经配置了成员资格的站点,可以使用该站点作为本演练的起点。

在使用 ASP.NET 成员资格和角色之前,必须有一个可用的网站,然后需要配置该网站以启用成员资格和设置角色。如果已经完成演练:使用成员资格和用户登录创建网站 (Visual Studio),则可以使用在该演练中配置的网站。

创建网站

如果已经在 Visual Web Developer 中创建了网站(例如,按照演练:在 Visual Web Developer 中创建基本网页中的步骤),则可以使用该网站并跳到下一节。否则,按照下面的步骤创建一个新的网站和网页。

创建本地 IIS 网站

  1. 打开 Visual Web Developer。

  2. 在“文件”菜单上单击“新建网站”。

    出现“新建网站”对话框。

  3. 在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。

  4. 在“语言”下拉列表中,单击您想使用的编程语言。

  5. 在“位置”下拉列表中,选择“HTTP”。

    或者,如果没有可用的 IIS 服务器,可以选择“文件系统”。但是,使用“HTTP”与实际部署方案相似,并允许通过在浏览器中查看页来进行测试。

  6. 单击“浏览”。

    出现“选择位置”对话框。如果在前一步中选择了“HTTP”,则“本地 IIS”按钮应该是已选定的。如未选定,请单击“本地 IIS”。

  7. 选择“默认网站”节点。

  8. 单击“创建新 Web 应用程序”图标(在右上角),然后将新网站命名为“站点导航”

  9. 单击“打开”,然后单击“确定”。

    Visual Web Developer 创建该网站并打开一个名为 Default.aspx 的新页。默认情况下,Visual Web Developer 创建的新页带有匹配的代码隐藏文件,在本例中为 Default.aspx.cs。在使用“添加新项”向导创建后续的新页时可以更改此行为。

    Note注意

    有时,如果在 Visual Web Developer 之前安装了以前版本的 .NET Framework,您可能会获得关于配置网站使用最新版本的 .NET Framework 的错误。为更正此错误,可以在出现的对话框上单击“是”,以便在服务器上启用 ASP.NET 2.0 版,或者,可以使用 IIS 管理器更正此错误。在 IIS 管理器中,右击应用程序,单击“属性”,然后单击“ASP.NET”选项卡。在“ASP.NET 版本”旁边,请选择随 Visual Web Developer 安装的 .NET Framework 版本。

启用成员资格和创建用户

如果还没有启用成员资格,请使用以下过程启用它。否则,请转到下一节。

启用成员资格

  1. 在 Visual Web Developer 中的“网站”菜单上,单击“ASP.NET 配置”。

    出现“网站管理工具”。

  2. 单击“安全”选项卡,在“用户”之下单击“选择身份验证类型”,再单击“通过 Internet”,然后单击“完成”。

    此选项指定应用程序将使用 Forms 身份验证,其中用户将使用在本演练中稍后创建的登录页登录到应用程序。

  3. 在“安全”选项卡上单击“创建用户”。

    下面将为应用程序创建两个用户帐户。

  4. 在“创建用户”框中,键入定义应用程序的用户的信息。请使用下面的值作为参考。可以使用自己喜欢的任何值,但是要确保记下该条目以供本演练稍后使用。

    • 用户名   使用名称“Customer01”,这是第一个用户帐户的名称。

    • 密码   使用自己选择的密码,最好是强密码,即至少包含八个字符并包含大写字母和小写字母以及标点符号的密码。

    • 电子邮件   使用格式正确的电子邮件地址。也可以使用不存在的电子邮件地址,因为本演练不发送电子邮件。

    • 安全问题和安全答案   键入可在以后需要恢复密码时使用的问题和答案。

  5. 选择“活动用户”复选框,然后单击“创建用户”。

  6. 在确认页上单击“继续”。

  7. 重复上面的三个步骤创建另外一个名为“Employee01”的用户帐户。(在为这些用户帐户创建角色时,将使用全部为小写字母的名称。)

  8. 单击该页右下角的“上一步”按钮返回到“安全”起始页。

创建用户登录页

若要测试将在本演练中稍后配置的成员资格和角色设置,需要为用户创建登录方法,以便能够标识他们。

为所有用户创建显示登录状态的默认页

  1. 打开 Default.aspx 页,然后切换到“设计”视图。

    如果没有 Default.aspx 页,请向网站的根目录添加一个 Default.aspx 页。

    Note注意

    确保将该页命名为 Default.aspx;此名称稍后将在本演练中使用。

  2. 在工具箱中,从“登录”组中将“LoginStatus”控件拖动到页上。

    如果用户尚未登录,LoginStatus 控件会自动将用户定向到 Login.aspx 页。

  3. 将光标放在 LoginStatus 控件右侧,按 Enter,然后键入以下内容,包括额外的空白:“Hello ”

  4. 在工具箱中,从“登录”组中将“LoginName”控件拖动到页上。

    如果用户已登录,LoginName 控件将显示用户的名称。

  5. 保存该页,然后将其关闭。

现在您有了一个对所有用户可用的主页。下一步是创建一个简单的登录页。

创建登录页

  1. 向网站的根目录添加一个名为 Login.aspx 的页。

  2. 打开 Login.aspx 页,然后切换到“设计”视图。

  3. 在工具箱中,从“登录”组中将“Login”控件拖动到页上。

  4. 右击“Login”控件,单击“属性”,然后将“DestinationPageUrl”设置为“Default.aspx”。

  5. 保存该页,然后将其关闭。

在使用安全修整之前,必须设置用户角色。

启用角色

为了使安全修整工作,必须启用角色。

启用角色

  1. 在 Visual Web Developer 中的“网站”菜单上,单击“ASP.NET 配置”。

    出现“网站管理工具”。

  2. 单击“安全”选项卡,然后单击“启用角色”。

创建角色并将用户帐户分配到创建的角色

现在已启用了角色,但是在创建角色并将用户帐户分配到角色之前,您不能创建访问规则。

创建角色并分配用户帐户

  1. 如果网站管理工具未打开,请遵循如下步骤打开它:在 Visual Web Developer 中的“网站”菜单上,单击“ASP.NET 配置”。

    出现“网站管理工具”。

  2. 单击“安全”选项卡,然后单击“创建或管理角色”。

    下面将创建两个角色。

  3. 在“创建新角色”框中,键入“customers”,然后单击“添加角色”。

  4. 重复上面的步骤创建名为“employees”的角色。

  5. 在“角色名称”框中,单击“customers”旁的“管理”。

    此操作将打开一个页,您可在该页上从列表中选择要添加到“customers”角色的用户帐户。

  6. 在“搜索用户”框中,单击“全部”。

    这样将显示网站的所有用户帐户。如果列表太长,还可以按用户名的第一个字母搜索。

  7. 在用户名“Customer01”旁边,选择“用户属于角色”列中的框。

    用户 Customer01 现在成了 customers 角色的成员。

  8. 单击“上一步”返回到“创建新角色”页。

  9. 重复上面的两个步骤将用户 Employee01 添加到 employees 角色。

  10. 关闭 ASP.NET 应用程序管理页。

为了测试安全修整,需要为网站创建一些文件夹和页,然后设置这些文件夹和页上的安全权限。

创建用于本演练的必要的文件夹和页

网站将包含链接到一些页的站点地图结构,现在可以创建这些页。

创建必要的文件夹和页

  1. 在解决方案资源管理器中,右击网站的根目录,单击“新建文件夹”,然后将该文件夹命名为“EmployeesOnly”

    EmployeesOnly 文件夹将包含一个仅对部分用户可访问的页。

  2. 右击网站的根目录,单击“新建文件夹”,然后将该文件夹命名为“Customers”

    Customers 文件夹将包含一个仅对部分用户可访问的页。

  3. 在 EmployeesOnly 文件夹中,创建一个名为“Discounts.aspx”的新页。

  4. 在 Customers 文件夹中,创建一个名为“Support.aspx”的新页。

  5. 在网站的根目录中,创建名称分别为“Hardware.aspx”“Software.aspx”“Training.aspx”“Consulting.aspx”的四个新页。

  6. 在已创建的每个新页中,切换到“设计”视图,键入页顶部的页标题,然后将该标题格式设置为“<H1>”,以便能够在浏览该页时对该页进行标识。

  7. 保存新页,然后关闭它们。

创建访问规则

正在创建的网站将允许用户根据他们的角色获得对不同页的访问。因此需要创建一些访问规则,确定哪些角色能够访问哪些文件夹。

为 EmployeesOnly 文件夹设置访问规则

  1. 在 Visual Web Developer 中的“网站”菜单上,单击“ASP.NET 配置”。

    出现“网站管理工具”。

  2. 在“安全”选项卡上,单击“管理访问规则”,然后单击“添加新访问规则”。此操作将为您打开“添加新访问规则”页。

  3. 在“为此规则选择一个目录”下面,展开根节点,然后单击“EmployeesOnly”。

  4. 在“规则应用于”下面,单击“角色”,然后在该框中单击“employees”。

  5. 在“权限”之下选择“允许”。

    所创建的规则将向 employees 角色中的所有用户授予对 EmployeesOnly 文件夹的访问权限。

  6. 单击“确定”。

    新规则显示在“管理访问规则”表中的网格中。当用户请求 EmployeesOnly 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。如果用户不是 employees 角色的成员,则不会显示此文件夹中的页。

  7. 单击“添加新访问规则”链接。

  8. 在“规则应用于”之下选择“所有用户”。

  9. 在“权限”之下选择“拒绝”,然后单击“确定”。

    EmployeesOnly 文件夹的第二个规则确保除了 employees 角色中的用户外,其他任何用户都不能获得对该文件夹的访问。这些规则按照在该网格中的显示顺序从上到下进行处理。

    第一个规则(“允许”)向 employees 角色中的用户授予访问权限。第二个规则(“拒绝”)拒绝其他所有用户的访问权限。可以根据应用程序需要创建任意数目的“允许”和“拒绝”规则。当用户请求 EmployeesOnly 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。

下一步针对 Customers 文件夹重复上面的过程。然而,customers 和 employees 角色都能用于获得对 Customers 文件夹的访问。作为实际方案的示例,可考虑存在一家公司,该公司希望其电话支持雇员对客户能够看到的相同页拥有访问权限。

为 Customers 文件夹设置访问规则

  1. 单击“添加新访问规则”链接。

  2. 在“规则应用于”之下选择“角色”框,然后在该框中单击“customers”。

  3. 在“权限”之下选择“允许”,然后单击“确定”。

    所创建的规则将向 customers 角色中的所有用户授予对 Customers 文件夹的访问权限。

  4. 在“管理访问规则”之下单击“Customers”。

  5. 单击“添加新访问规则”链接。

  6. 在“规则应用于”之下选择“角色”框,然后在该框中单击“employees”。

  7. 在“权限”之下选择“允许”,然后单击“确定”。

    所创建的规则也向 employees 角色中的所有用户授予对 Customers 文件夹的访问权限。

  8. 在“管理访问规则”之下单击“Customers”。

  9. 单击“添加新访问规则”链接。

  10. 在“规则应用于”之下选择“所有用户”框。

  11. 在“权限”之下选择“拒绝”框,然后单击“确定”。

    Customers 文件夹的第一和第二个规则确保除了在 customers 或 employees 角色中拥有帐户的用户外,其他任何用户都不能获得对 Customers 文件夹的访问。这些规则按照在该网格中的显示顺序从上到下进行处理。

    第一个规则(“允许”)向在成员角色中拥有帐户的用户授予访问权限。第二个规则(“拒绝”)拒绝其他所有用户的访问权限。可以根据应用程序需要创建任意数目的“允许”和“拒绝”规则。当用户请求 Customers 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。

  12. 单击“完成”返回到“安全”选项卡。

在本演练的此部分,您将创建站点地图以描述网站的导航结构,然后通过编辑 Web.config 文件启用站点地图节点的安全修整。

创建站点地图

若要使用站点导航,您需要一种方式来描述站点中的页如何布局。默认方法是创建一个包含站点层次结构的 XML 文件,其中包含页标题和 URL。

每个页表示为站点地图中的一个 siteMapNode 元素。最上面的节点表示主页,子节点表示站点中更深层的页。

创建站点地图

  1. 在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。

  2. 在“添加新项”对话框中:

    1. 在“Visual Studio 已安装的模板”之下单击“站点地图”。

    2. 确保“名称”框中的名称为“Web.sitemap”

      Note注意

      该文件必须命名为 Web.sitemap,并且必须位于网站的根目录中。

    3. 单击“添加”。

  3. 将下面的 XML 内容复制到 Web.sitemap 文件中,并重写该 XML 文件的默认内容。

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
        <siteMap>
        <siteMapNode title="Home" description="Home"
        url="~/default.aspx" >
        <siteMapNode title="Products"
        description="Our products"
        roles="*">
        <siteMapNode title="Hardware"
        description="Hardware we offer"
        url="~/Hardware.aspx" />
        <siteMapNode title="Software"
        description="Software for sale"
        url="~/Software.aspx" />
        <siteMapNode title="Discounts"
        description="Employee Discounts"
        url="~/EmployeesOnly/Discounts.aspx" />
        </siteMapNode>
        <siteMapNode title="Services"
        description="Services we offer"
        roles="*">
        <siteMapNode title="Training"
        description="Training"
        url="~/Training.aspx" />
        <siteMapNode title="Consulting"
        description="Consulting"
        url="~/Consulting.aspx" />
        <siteMapNode title="Support"
        description="Support"
        url="~/Customers/Support.aspx" />
        </siteMapNode>
        </siteMapNode>
        </siteMap>

    Web.sitemap 文件包含一组三层嵌套的 siteMapNode 元素。每个元素的结构相同;它们之间的唯一区别是其在 XML 层次结构中的位置。

    该示例 XML 文件中定义的页的 URL 是非限定的,意味着所有页都将被视为具有相对于应用程序根目录的 URL。然而,您可以为给定的页指定任何 URL——站点地图中定义的逻辑结构不必对应于文件夹中的页的物理布局。

    站点地图中仅有两个节点上设置了 roles 属性:Products 和 Services。这两个节点没有 url 属性。ASP.NET 使用 .aspx 页的访问规则验证站点地图节点是否应该对用户可见。在没有 url 属性的情况下,如果启用安全修整,则没有用户能够查看该页。将 roles 属性设置为星号 (*) 或通配符可将访问扩展到所有人。

  4. 保存文件,然后将其关闭。

启用安全性调整

所创建的站点地图使用默认站点地图提供程序 XmlSiteMapProvider。由于这个原因,Web.config 文件不需要包含 siteMap 元素(ASP.NET 设置架构)元素,因为 ASP.NET 具有用于默认站点地图的内部配置。但是,安全修整默认是未启用的,因此必须设置 siteMap 元素(ASP.NET 设置架构)元素。

启用安全修整

  1. 在 Visual Web Developer 中,右击网站的根目录,然后单击“刷新文件夹”。

    此操作将使 Web.config 文件显示在解决方案资源管理器中。通过选择“添加新项”或使用“ASP.NET 配置”工具可以创建 Web.config 文件,就像我们在本演练中前面所做的那样。

  2. 打开 Web.config 文件。

  3. 查找 siteMap 元素(ASP.NET 设置架构)元素,以防它已经存在。

    如果 siteMap 元素(ASP.NET 设置架构)元素不存在,请将下面的代码粘贴到 system.web 元素(ASP.NET 设置架构)元素内,小心不要将它粘贴到其他任何元素内。

    复制代码
    <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
        <providers>
        <add name="XmlSiteMapProvider"
        description="Default SiteMap provider."
        type="System.Web.XmlSiteMapProvider"
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
        </providers>
        </siteMap>
  4. 保存并关闭 Web.config 文件。

安全性调整功能对每个请求使用 URL 授权,以确定用户是否能访问与 siteMapNode 元素关联的 URL。这种额外的工作会使性能下降,下降的程度取决于要进行授权的节点的数目。如果启用了安全性调整,您可以使用下面的方法提高性能:

  • 限制站点地图文件中的节点数   节点数超过 150 的站点地图文件执行安全性调整操作所耗费的时间明显变长。

  • 显式设置 siteMapNode 元素上的角色属性   注意,应对可安全显示给任何客户端的节点将 roles 属性设置为星号 (*)。当用户属于 roles 属性中列出的某一角色时,使用该属性后,ASP.NET 可避开与 siteMapNode 关联的 URL 的 URL 授权限制。

现在您有了一个站点地图和一些页,接下来可向站点添加导航。

使用 SiteMapPathMenu 控件也可以显示站点导航。有关更多信息,请参见 ASP.NET 导航控件或演练:向网站添加站点导航。

使用 TreeView 控件创建导航菜单

您将使用 TreeView 控件作为可折叠的导航菜单。

添加导航菜单

  1. 打开 Default.aspx 页,然后切换到“设计”视图。

  2. 在工具箱中,从“数据”组中将“SiteMapDataSource”控件拖动到页上。

    在默认配置中,SiteMapDataSource 控件从前面创建的 Web.sitemap 文件获取信息,因此不需要为该控件指定任何附加信息。

  3. 在工具箱中,从“导航”组中将“TreeView”控件拖动到页上。

    出现“TreeView 任务”菜单。

  4. 在“TreeView 任务”菜单上,在“选择数据源”框中单击“SiteMapDataSource1”。

  5. 保存页。

使用 SiteMapPath 控件创建导航菜单

您将使用 SiteMapPath 控件作为面包屑样式的导航显示,向用户显示返回根页的路径。

添加导航菜单

  1. 打开 Hardware.aspx 页,然后切换到“设计”视图。

    若要演示 SiteMapPath 控件如何工作,请将该控件放在一个深层嵌套的页上。

  2. 如果在此页上的 <H1> 标记内添加了标题,请将光标放在右侧并按 Enter。

  3. 在工具箱中,从“导航”组中将“SiteMapPath”控件拖动到页上。

    出现“SiteMapPath 任务”菜单,但是不需要配置数据源。

  4. 保存页。

现在可以对站点进行测试了。

测试安全修整

  1. 切换到“Default.aspx”页,然后按 Ctrl+F5 运行该页。

    TreeView 控件中,您应当看不到“Discounts”和“Support”链接。

  2. 单击“Login”。

  3. 作为“Customer01”登录(这是 customers 角色中的一个用户帐户)。

    TreeView 控件中,您现在应该看得到“Support”链接。

  4. 单击“Logout”,然后单击“Login”。

  5. 作为“Employee01”登录(这是 employees 角色中的一个用户帐户)。

    TreeView 控件中,您现在应该看得到“Discounts”链接和“Support”链接。作为雇员,您应该看得到所有可用的链接,因为其中没有任何链接对雇员是受限制的。

  6. 在 Default.aspx 页上,单击“Hardware”,以便能够看到 SiteMapPath 控件。

    SiteMapPath 控件应该显示从主页到“Hardware”页的路径。

在该网站的当前状态下,导航树只出现在主页上。可以向应用程序中的每个页添加相同的 SiteMapDataSourceTreeView 控件,以便在每个页上都显示导航菜单。或者,可以将导航树放在母版页上,以便它自动出现引用母版页文件的每个页上。

本演练演示了 ASP.NET 站点导航的基本功能:导航控件、角色管理和安全修整。您可能还想试验导航的其他功能。例如,您可能想要将导航控件放在母版页中,以便它们出现在引用母版页的所有页上。有关详细信息,请参见演练:在 Visual Web Developer 中创建和使用 ASP.NET 母版页

任务

演练:向网站添加站点导航

概念

ASP.NET 站点导航概述
ASP.NET 站点地图安全性调整
保证 ASP.NET 站点导航的安全
保证数据访问的安全
创建自己的代码访问权限

其他资源

寄宿环境中的 ASP.NET 应用程序安全性

转载于:https://www.cnblogs.com/whitetiger/archive/2008/02/22/1077583.html

相关文章:

  • [导入]ASP常用函数:WriteLn() PrintLn()
  • 华为固件文件
  • 妻是上帝恩赐的礼物
  • 技术课题研究工作正式启动
  • C#程序员参考手册—知识点精选
  • Object内存核心结构及实现完全剖析(MethodTable、EEClass与MethodDescChunk)
  • linux下net-snmp 已经安装,为什么没有 snmpwalk和snmpget
  • [第7天]继续讲,从克隆帐号 讲起
  • 只要讲信义,就有做不完的生意
  • Phoenix OS 最新更新 4/3/2008
  • 什麼是SOAP?
  • 最经典的***入门教材
  • 工控项目开发框架介绍
  • c#获取文件路径
  • 条款二 : 运行时常量(readonly)优于编译时常量(const)
  • @jsonView过滤属性
  • 2019.2.20 c++ 知识梳理
  • Java教程_软件开发基础
  • MySQL QA
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Objective-C 中关联引用的概念
  • SpringCloud集成分布式事务LCN (一)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • XML已死 ?
  • 高性能JavaScript阅读简记(三)
  • 猴子数据域名防封接口降低小说被封的风险
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 蓝海存储开关机注意事项总结
  • 系统认识JavaScript正则表达式
  • 携程小程序初体验
  • 在weex里面使用chart图表
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (day 12)JavaScript学习笔记(数组3)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (九)信息融合方式简介
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net MySql
  • .NET 设计模式初探
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net分布式压力测试工具(Beetle.DT)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET企业级应用架构设计系列之开场白
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net中间语言BeforeFieldInit
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [2021 蓝帽杯] One Pointer PHP