用于访问服务的方法、设备和计算机程序产品与流程

文档序号:20618026发布日期:2020-05-06 20:24阅读:203来源:国知局
用于访问服务的方法、设备和计算机程序产品与流程

本公开的实施例涉及服务的管理领域,具体地涉及用于访问服务的方法、设备和计算机程序产品。



背景技术:

随着计算机技术的快速发展,在各个领域中都会使用计算机来实现各种不同的任务。为了实现各种任务,开发人员设计了许多不同功能的服务。因此服务的执行过程中,多个不同的服务会经常一起使用。此外,随着计算机程序的扩展,计算机程序变得越来越复杂,这导致了运行的服务的数目变得越来越多。因此,服务的管理变得越来越重要。

由于服务的重要程度且安全级别不同,存在使用服务时需要对用户进行验证以确保服务安全的问题。例如,在使用不同的网络服务时通常需要对用户进行验证,比如需要输入用户名和密码才可以使用某些网络服务。因此,对于使用多个不同服务的情况,如何保证服务使用时的安全性已经成为需要解决的问题。



技术实现要素:

本公开的实施例提供一种用于访问服务的方法、设备和计算机程序产品。

根据本公开的第一方面,提供了一种用于访问服务的方法。该方法包括从请求方接收用于访问多个服务中的第一服务的第一功能接口的请求。该方法还包括响应于该请求,确定该请求方访问该多个服务的多个功能接口的第一组合权限。该方法还包括确定第一服务访问多个服务的多个功能接口的第二组合权限。该方法还包括基于第一组合权限和第二组合权限,控制请求方对第一功能接口的访问。

根据本公开的第二方面,提供了一种用于访问服务的电子设备。该电子设备包括:处理器;以及存储器,存储有计算机程序指令,处理器运行存储器中的计算机程序指令控制电子设备执行动作,该动作包括:从请求方接收用于访问多个服务中的第一服务的第一功能接口的请求。该动作还包括响应于请求,确定请求方访问多个服务的多个功能接口的第一组合权限。该动作还包括确定第一服务访问多个服务的多个功能接口的第二组合权限。该动作还包括基于第一组合权限和第二组合权限,控制请求方对第一功能接口的访问。

根据本公开的第三方面,提供了一种计算机程序产品,该计算机程序产品被有形地存储在非易失性计算机可读介质上并且包括机器可执行指令,该机器可执行指令在被执行时使机器执行本公开的第一方面中的方法的步骤。

附图说明

通过结合附图对本公开示例性实施例进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施例中,相同的参考标号通常代表相同部件。

图1图示了根据本公开的实施例的设备和/或方法可以在其中被实施的示例环境100的示意图;

图2图示了根据本公开的实施例的用于访问服务的方法200的流程图;

图3图示了根据本公开的实施例的用于访问接口的方法300的流程图;

图4a图示了根据本公开的实施例的用于确定访问权限的示意图;

图4b图示了根据本公开的实施例的用于确定访问权限的示意图

图5图示了适于用来实施本公开内容的实施例的示例设备500的示意性框图。

在各个附图中,相同或对应的标号表示相同或对应的部分。

具体实施方式

下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。

在本公开的实施例的描述中,术语“包括”及其类似用语应当理解为开放性包含,即“包括但不限于”。术语“基于”应当理解为“至少部分地基于”。术语“一个实施例”或“该实施例”应当理解为“至少一个实施例”。术语“第一”、“第二”等等可以指代不同的或相同的对象。下文还可能包括其他明确的和隐含的定义。

下面将参考附图中示出的若干示例实施例来描述本公开的原理。虽然附图中显示了本公开的优选实施例,但应当理解,描述这些实施例仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。

如果请求方访问一个服务,并且该服务不调用其他服务,则直接验证该请求方即可。这种情况通常不存在服务的安全性问题。然而,在请求方具有访问第一服务的功能接口(例如应用编程接口(api))的权限,而不具有访问第二服务的功能接口的权限,并且第一服务具有访问第二服务的功能接口的权限的情况下,如果请求方直接访问第二服务的功能接口,则第二服务会拒绝请求方的访问。此时,第二服务不会产生安全性问题。然而,如果第一服务通过了请求方的验证,而第一服务调用了第二服务的功能接口,则这时请求方便可以通过第一服务访问第二服务的功能接口。此时,第二服务会产生安全问题。因为,不被允许的请求方访问了第二服务的功能接口。

为了解决服务间的这种安全性问题,一般采用在请求方访问第一服务的功能接口时,第一服务对请求方进行验证。如果第一服务的功能接口调用第二服务的功能接口,则第二服务对第一服务进行验证,同时第二服务对请求方也进行验证。即如果请求方通过第一服务访问第二服务的功能接口,则请求方需要具有访问第一服务的功能接口的权限,访问第二服务的功能接口的权限,并且第一服务还需要具有访问第二服务的功能接口的访问权限。依此类推,随着服务间调用的增多,这种验证会呈指数增加。此外,这些验证均是服务通过中央验证和授权服务来实现的,这也耗费了大量的处理能力,并且降低了安全验证的效率。

因此,为了解决上述问题,本公开提出了一种用于访问服务的方法。在该方法中,对请求方和多个服务中的每个服务设置一个访问多个服务的多个功能接口的组合权限,在访问服务的功能接口时通过对请求方和服务的组合权限进行计算来确定用户是否具有访问服务的功能接口的权限。通过采用该方法,大大减少了服务验证的次数,并且将由中央验证和授权服务来执行的验证分散到在各个服务处进行,提高了验证的效率。

下面图1图示了根据本公开的实施例的设备和/或方法可以在其中被实施的示例环境100的示意图。

在计算环境100中具有管理设备110。在该管理设备110中运行管理服务112,其用于管理访问服务的请求方和各个服务的访问权限。管理服务112运行在管理设备110上仅是示例,并不是对本公开的限制。管理服务112可以运行在该环境100任何相关的设备上。

计算环境100还包括一个或多个设备104-1,设备104-2,设备104-3……设备104-n(可统称为设备104),其中n为大于1的正整数。每个计算单元上运行一个或多个服务。作为示例,图1的每个设备上运行一个服务。备选地或附加地,相互调用的多个服务及其管理服务也可以位于相同的计算单元内。

在图1中,服务108-1、服务108-2、服务108-3……服务108-n(可统称为服务108)中的每个服务包括一个或多个功能接口。作为示例,功能接口可以为应用编程接口api,其仅是作为示例,而并非对功能接口的限定。该功能接口可以是实现预定功能的任意接口。

为了便于说明,作为示例,设置多个服务为三个服务,即n=3,在服务108-1、服务108-2、服务108-3中的每个服务上具有五个功能接口。上面的示例仅是用于说明本公开,而非对本公开的限制。可以基于实际的需要为每个服务设置任意数目的功能接口。

在本公开中,可以以任意形式表示服务的组合权限。在一个示例中,用二进制串表示服务的组合权限。例如,如果多个服务为三个服务,每个服务具有五个功能接口,则可以将第一服务的组合权限设置为“111111001101101”。在该组合权限中,1表示可以访问与其对应的功能接口,0表示不可以访问与其对应的功能接口。在组合权限的前五位,表示第一服务对其本身的功能接口的访问权限。在该组合权限的六至十位中,表示第一服务对第二服务中的五个功能接口的访问权限。在该组合权限中,第六位为1,则表示第一服务可以访问第二服务的第一个功能接口,第七位为0,表示第一服务不可以访问第二服务的第二个功能接口。在该组合权限的十一至十五位中,表示第一服务对第三服务中的五个功能接口的访问权限。

在另一个示例中,可以采用布尔值表示服务的组合权限。如果多个服务为两个服务,每个服务具有三个功能接口。在用布值表示的第一服务的组合权限中,如果第一服务的组合权限中与功能接口对应的布尔值为“真”,则表明第一服务能够访问该功能接口。如果对应的布尔值为“假”,则表明第一服务不能够访问该功能接口。

上述示例中服务的数目、服务中功能接口的数目以及组合权限的表示方式仅是用于说明本公开,而非对本公开的限制。服务的数目和功能接口数目可以基于需要而设置为任意数目,并且服务的组合权限可以基于需要以任意合适的方式表示。

服务的权限数据可以存储在与服务相关联的任意存储设备上。作为示例,与服务相关的权限数据被存储在与服务相对应的存储装置上。在图1中,计算环境100中还具有与服务108-1、108-2、108-3……108-n相对应的存储装置106-1、存储装置106-2、存储装置106-3……存储装置106-n(可统称为存储装置106),其中n为大于1的正整数。上述服务与存储装置的对应关系仅是示例,而非对本公开的限定。在其他的示例中,可以基于需要而设置服务与存储装置的任意对应关系。

在一个示例中,存储装置106-1存储与服务108-1相关联的组合权限,存储装置106-2存储与服务108-2相关联的组合权限,存储装置106-3存储与服务108-3相关联的组合权限。在一个示例中,与服务相关联的存储装置可以位于相同的存储设备上。在另一个示例中,与服务相关联的存储装置在不同的存储设备上。

请求方102是访问一组服务中的一个服务的任意对象。在一个示例中,该请求方102可以是用户,其通过输入访问请求直接访问服务。在另一个示例中,该请求方102是其他服务或应用。上述示例仅是用于描述请求方,而非对请求方的限定。

上面图1描述了用于访问服务的示例环境100。下面将结合图2的流程图描述访问服务的方法。

在请求方102要访问服务时,请求方102向服务发送请求。在框202处,从请求方102接收用于访问多个服务中的第一服务的第一功能接口的请求。

在本公开中,该多个服务包括一个或多个相关联的服务,即服务之间存在相互调用关系。在一个示例中,存在三个相关联的服务,并且设置第一服务具有五个功能接口,第二服务具有五个功能接口,第三服务具有五个功能接口。上述示例仅是为了描述本公开,而非对公开的具体限定。用户可以基于需要设置任意数目的服务以及服务具有任意数目的功能接口。在该示例中,请求方102请求访问第一服务的第一功能接口,其中该第一功能接口要调用第二服务的第五功能接口,第二服务的第五功能接口调用第三服务的第三功能接口。

在框204处,响应于该请求,确定该请求方102访问该多个服务的多个功能接口的第一组合权限。如果接收到请求,则可以通过任何合适的方式从任意能够存储组合权限的存储装置获得请求方的第一组合权限。

在一个示例中,在获得请求方的请求后,获得请求中的请求方的标识信息,然后将请求方的标识信息发送到管理设备110。管理设备110处存储有请求方的组合权限。附加地或备选地,管理设备110处还存储有每个服务的组合权限。管理设备110在接收到请求方的标识信息后查找请求方的第一组合权限。然后,管理设备向第一服务返回该第一组合权限。

第一服务从管理设备110接收基于请求方的标识而获取的第一组合权限。

在另一个示例中,在获得请求方的请求后,可以从本地存储装置或任意存储组合权限的存储装置获得第一组合权限。

在一个示例中,在多个服务为三个服务时,且每个服务具有五个功能接口的情况下,获取的请求方102的组合权限被设置为“101011000110001”。该组合权限表明请求方102可以访问第一服务中的第一、第三和第五功能接口,可以访问第二服务的第一和第五功能接口,可以访问第三服务的第一和第五功能接口。在另一个示例中,请求方的组合权限可以以布尔值表示。上述示例仅是用于说明本公开,而不是对本公开的限定。可以基于需要设置请求方的组合权限为任何合适的表示形式。

在框206处,确定第一服务访问多个服务的多个功能接口的第二组合权限。在一个示例中,获取第一服务的组合权限,其可用二进制串表示为“111111001101101”。上述示例仅是用于说明组合权限,而非对组合权限的限定,组合权限可以基于需要表示为任意合适的形式。

在一个示例中,服务访问多个功能接口的组合权限是被预先确定好。例如,相关联的三个服务具有十五个功能接口,第一服务的访问权限被表示为“111111001101101”。第二服务的访问权限被表示为“101011111100101”。第三服务的访问权限被表示为“001011000111111”。其中1表示可以访问与其对应的功能接口,0表示不可以访问与其对应的功能接口。上述设置仅是示例,并不表示对本公开的限制。可以以任意形式设置服务的组合权限,并且可以根据需要设置服务的数目以及服务的功能接口的数目。

在框208处,基于第一组合权限和第二组合权限,确定控制请求方102对第一功能接口的访问。在一个示例中,通过第一组合权限和第二组合权限来确定请求方102对第一服务的第一功能接口的访问。在另一个示例中,直接通过第一组合权限确定请求方102是否能够访问第一功能接口。

通过利用组合权限来确定请求方对服务的功能接口的访问,减少了在调用多个服务的功能接口中的验证的次数,同时也减少了管理设备处的访问次数,并降低了管理设备处的处理量。提高了服务之间的验证效率和速度。

下面结合图3详细描述用于访问接口的方法300的流程图。方法300可以被认为是上文参考图2描述的方法200中的框208的一种示例实现。

在框302处,基于第一组合权限和第二组合权限,确定请求方和第一服务针对多个服务的访问的第三组合权限。在一个示例中,可以通过对第一组合权限和第二组合权限进行逻辑与操作来获得第三组合权限。

在一个示例中,采用二进制串表示第一组合权限和第二组合权限。例如,第一组合权限被表示为“101011000110001”,第二组合权限被表示为“111111001101101”。因此,通过将请求方的第一组合权限和第一服务的第二组合权限进行逻辑与操作来确定请求方通过第一服务访问功能接口的权限。

参见图4a,二进制串402表示第一服务的第二组合权限,二进制串404表示请求方的第一组合权限。二进制串402和二进制串404逻辑与的结果为二进制串406“101011000100001”,其表示请求方通过第一服务访问功能接口的第三组合权限。上述示例仅是用于描述本公开,而并非对公开的限定。其他通过第一组合权限和第二组合权限获得第三组合权限的方式均可以采用。

在框304处,基于第三组合权限来控制请求方102对第一功能接口的访问。在一个示例中,第三组合权限也是由二进制串表示,其每一位表示了请求方通过第一服务访问多个功能接口的权限。例如,上面计算的结果“101011000100001”为第三组合权限,其指示用户可以访问第一服务的第一功能接口。

在框306处,确定所访问的第一功能接口是否要调用多个服务中的第二服务的第二功能接口。如果所访问的第一功能接口调用第二功能接口,则在框308处确定请求方是否能够访问第二功能接口。在一个示例中,基于由第一组合权限和第二组合权限获得的第三组合权限来确定请求方是否可以通过第一服务访问第二服务的第二功能接口。

在一个示例中,第一组合权限和第二组合权限进行逻辑与结果为“101011000100001”。由于与第二服务的第五功能接口对应的二进制值为1,因此请求方102可以通过第一服务的第一功能接口访问第二服务的第五功能接口。

响应于确定请求方能够访问第二功能接口,在框310处,向第二服务发送与第一组合权限和第二组合权限相关联的指示。在一个示例中,将由第一组合权限和第二组合权限获得的第三组合权限发送给第二服务,以便于第二服务来确定对第三服务中的功能接口的访问权限。

例如,第一服务的第一功能接口调用第二服务的第五功能接口时,将前面计算得到第三组合权限“101011000100001”发送到第二服务。

第二服务在接收到第三组合权限时,还会获取第二服务对多个功能接口访问的第四组合权限,通过对第三组合权限与第四组合权限进行逻辑与操作以确定第五组合权限。该第五组合权限表示请求方102通过第一服务和第二服务访问多个多功能接口的权限。如图4b所示,二进制串410表示从第一服务接收的组合权限,二进制串408表示第二服务的组合权限,二进制串410“101011000100001”与二进制串408“101011111100101”进行与操作,便可以确定请求方102通过第一服务和第二服务进行访问的组合权限,如二进制串412“101011000100001”。

通过上述计算可以确定此时请求方102通过第一服务和第二服务对多个功能接口的访问权限。因此,在第二服务的第二功能接口访问第三服务的第三功能接口时,需要通过第五权限数据确定是否具有对第三功能接口访问的权限。例如,第二服务的第五功能接口访问第三服务的第三功能接口时,如果与该功能接口对应的值为0,则请求方不能通过第一服务和第二服务访问第三服务的第三功能接口。因此,返回访问失败的结果。相反,如果第二服务的功能接口访问的是第三服务的第五功能接口,由于与该功能接口对应的值为1,因此请求方可以实现成功访问服务的功能接口。

通过采用将请求方与服务或者服务与服务之间的组合权限进行操作来获得合成的组合权限,这样可以将前面确定的权限用于后面的验证过程,通过这种方式能够大量的减少验证的过程,同时也保证服务访问的安全性。

此外,服务的访问权限以及服务的功能接口的数目还可以动态调整。

在一个示例中,如果服务的管理人员通过管理设备110调整了服务的功能接口访问其他服务的功能接口的权限,则管理设备110中的管理服务112则会将调整后的服务的组合权限发送给该服务。该服务将调整后的组合权限存储在与该服务相关联的存储装置中。

在另一个示例中,如果服务的编程人员针对服务增加了或减少了服务的功能接口,则管理设备110中的管理服务112则会相应的调整与该服务相关联的所有服务的组合权限,并将调整后的每个服务的组合权限发送给相应的服务。例如,如果第一服务对多个服务的多个功能接口的访问权限为“111111000110101”,如对第二服务的多个功能接口的访问权限为“10001”,即第二服务中有五个功能接口,如果第二服务中增加了一个功能接口变成六个功能接口,则管理服务112则会通将多个服务的中每个服务中针对第二服务的功能接口的权限位数增加一,并将调整后的组合权限发送给相应的服务以更新原来的组合权限,例如,第一服务的访问权限将变为“1111110001010101”。

通过调整组合权限和功能接口的数目,使得对接口的管理变得更容易,并且可以动态地满足用户的需求,提高了服务间调用的效率。

图5示出了可以用来实施本公开内容的实施例的示例设备500的示意性框图。例如,如图1所示的104、110的任一项可以由设备500来实施。如图所示,设备500包括中央处理单元(cpu)501,其可以根据存储在只读存储器(rom)502中的计算机程序指令或者从存储单元508加载到随机访问存储器(ram)503中的计算机程序指令,来执行各种适当的动作和处理。在ram503中,还可存储设备500操作所需的各种程序和数据。cpu501、rom502以及ram503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。

设备500中的多个部件连接至i/o接口505,包括:输入单元506,例如键盘、鼠标等;输出单元507,例如各种类型的显示器、扬声器等;存储单元508,例如磁盘、光盘等;以及通信单元509,例如网卡、调制解调器、无线通信收发机等。通信单元509允许设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。

上文所描述的各个过程和处理,例如方法200和300可由处理单元501执行。例如,在一些实施例中,方法200和300可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由rom502和/或通信单元509而被载入和/或安装到设备500上。当计算机程序被加载到ram503并由cpu501执行时,可以执行上文描述的方法200和300的一个或多个动作。

本公开可以是方法、装置、系统和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。

这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理单元,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1