


SSL 虚拟私有网络是通过SSL协议实现远程安全接入的虚拟私有网络技术。
安全套接层俗称secure socket layer(SSL)是网景公司1990年开发,用于保障www通讯的安全。主要任务是提供私密性、信息完整性和身份认证。1994年改版为sslv2,1995年改版为sslv3
TLS全称是transport layer security,传输层安全协议。1999年由IETF发布,整体来说TLS非常类似于SSLV3,只是对SSLV3做了些增加和修改。
SSL是一个不依赖于平台和应用程序的协议,用于保障TCP-based应用安全,SSL在TCP层和应用层之间,可以理解为其是应用层连接到TCP连接的一个插口。
企业出差员工,需要在外地远程办公,并期望能够通过internet随时随地的远程访问企业内部资源。同时企业为了保证内网资源的安全性,希望能对移动办公用户进行多种形式的身份认证,并对移动办公用户可访问内网资源的权限做精细化控制。

能实现与ipsec、l2tp相同的功能:通过internet远程访问企业内网资源
与ipsec、l2tp相比的优点:
1、企业通过多种方式实现对接入用户的身份认证
2、企业基于接入用户的身份精细化控制可访问资源
3、免安装客户端软件
4、组网灵活
5、部署和维护简单
SSL 虚拟私有网络为了更精细的控制移动办公用户的资源访问权限,将内网资源划分为了Web资源、文件资源、端口资源和IP资源这4种类型。每一类资源有与之对应的访问方式,例如移动办公用户想访问企业内部的Web服务器,就需要使用SSL 虚拟私有网络提供的Web代理业务;想访问内网文件服务器,就需要使用文件共享业务。
访问内网web资源(属于IP资源)时使用web代理业务
直接通过浏览器访问内网文件服务器(属于IP资源),如基于smb协议的windows共享文件夹、基于nfs协议的linux共享目录等。可以在浏览器上创建和浏览目录,进行下载、上传、改名、删除等文件操作。
适用于基于TCP端口的应用服务(属于IP资源),包括telnet、远程桌面、FTP、Email等。提供了一种端口级的安全访问内网资源的方式。
通常在不区分用户访问的资源类型时为对应用户开通此业务。
虚拟网关是公网用户通过SSL 虚拟私有网络访问企业内网资源的统一入口。(通常是防火墙的公网出口)
虚拟网关可以创建多个,相互独立,基于不同的虚拟网关可以配置各自的用户和资源。
虚拟网关的配置由fw的系统管理员完成。

在浏览器中输入SSL 虚拟私有网络虚拟网关的IP地址或域名,请求建立SSL连接。虚拟网关向远程用户发送自己的证书,远程用户对虚拟网关的证书进行身份认证。认证通过后,远程用户与虚拟网关成功建立SSL连接,进入SSL 虚拟私有网络虚拟网关时的登录页面。
在登录页面输入用户名和口令,虚拟网关对该用户进行身份认证。方式包括:本地认证、服务器认证、证书匿名认证、证书挑战认证等。
本地认证

远程接入用户的用户名、密码等身份信息保存在fw本地,由fw自身完成用户身份认证。
如果该虚拟网关中指定了认证域,则用户信息被发送到指定的认证域进行验证。如果虚拟网关没有指定认证域,则虚拟网关会根据用户名中携带的“@”后的字符串(该字符串代表认证域的名称)来决定送往哪个认证域进行认证。用户名中不携带“@”时,默认由default认证域进行认证。
认证域中存放有用户身份信息及其用户所属的组信息。用户身份信息包括该用户的用户名、密码、描述等。另外,身份认证方式也是在认证域下指定的。认证域依据指定的认证方式决定采用本地认证还是服务器认证,此处以本地认证方式为例。
如果身份认证通过,则继续下一步。如果身份认证不通过,则用户会在虚拟网关登录页面看到“认证失败”的提示。
虚拟网关会从角色授权列表中查找该用户所属的角色信息,并将该角色对应的资源链接推送给用户。
服务器认证

远程接入用户的用户名、密码等身份信息保存在认证服务器上,由认证服务器完成用户身份认证。认证服务器类型包括:RADIUS服务器、HWTACACS服务器、AD服务器和LDAP服务器。
如果该虚拟网关中指定了认证域,则用户信息被发送到指定的认证域进行验证。如果虚拟网关没有指定认证域,则虚拟网关会根据用户名中携带的“@”后的字符串(该字符串代表认证域的名称)来决定的送往哪个认证域进行认证。用户名中不携带“@”时,默认由default认证域进行认证。
如果身份认证通过,则继续下一步。如果身份认证不通过,则用户会在虚拟网关登录页面看到“认证失败”的提示。
虚拟网关会从角色授权列表中查找该用户所属的角色信息,并将该角色对应的资源链接推送给用户。虚拟网关会在本地查找用户所属的角色信息,因此需要提前将用户信息从认证服务器导入到认证域中。此处用户信息的作用不是认证,而是授权。
证书认证
远程接入用户以数字证书作为登录虚拟网关的身份凭证。虚拟网关针对证书提供了两种认证方式,一种是证书匿名,一种是证书挑战。
证书匿名认证

证书匿名方式下,虚拟网关只是检查用户所持证书的有效性,比如证书的有效期是否逾期,证书是否由合法CA颁发等),不检查用户的登录密码等身份信息。
对于使用证书认证的双方(远程接入用户和防火墙),首先需要FW管理员从CA中心获取所需的证书。管理员需要从CA中心获取CA证书和客户端证书,CA中心审核通过后,会把CA证书和客户端证书发放给管理员,FW管理员将获取到的CA证书导入到FW,该CA证书用来验证移动办公用户客户端证书的有效性。管理员将客户端证书发放给移动办公用户,由移动办公用户将客户端证书导入个人设备,该客户端证书作为移动办公用户的身份凭证。
证书模块会根据虚拟网关引用的CA证书检查用户提供的客户端证书是否可信。
虚拟网关从用户客户端证书中提取用户名,并从角色授权列表中查找该用户所属的角色信息,并将该角色对应的资源链接推送给用户。
认证挑战认证

证书挑战方式下,虚拟网关不仅检查用户证书是否是可信证书以及证书是否在有效期内,还要检查用户的登录密码。检查用户登录密码的方式可以选择本地认证或者服务器认证。
对于使用证书认证的双方(远程接入用户和防火墙),首先需要从CA中心获取各自所需的证书。移动办公用户需要先向CA中心申请客户端证书作为自己的身份凭证,CA中心审核通过后,会把客户端证书发放给申请人。申请人再将申请到的客户端证书导入个人设备。FW管理员需要从CA中心获取CA证书,并将获取到的CA证书导入到FW。该CA证书用来验证移动办公用户客户端证书的有效性。
证书模块会根据虚拟网关引用的CA证书检查用户提供的客户端证书是否可信。
虚拟网关会根据用户过滤字段的设置从用户客户端证书中提取用户名,密码是用户登录虚拟网关时输入的密码。
如果该虚拟网关中指定了认证域,则用户信息被发送到指定的认证域进行验证。如果虚拟网关没有指定认证域,则虚拟网关会根据用户名中携带的“@”后的字符串(该字符串代表认证域的名称)来决定送往哪个认证域进行认证。用户名中不携带“@”时,默认由default认证域进行认证。
虚拟网关从用户客户端证书中提取用户名,并从角色授权列表中查找该用户所属的角色信息,并将该角色对应的资源链接推送给用户。
认证通过后,基于用户角色进行授权,根据角色推送相应服务和资源。
虚拟网关有两种授权方式,一种是本地授权,另一种是服务器授权。
本地授权
是以FW本地存放的用户信息为准,来确定用户所属的角色信息。
服务器授权
是以第三方服务器上存放的用户信息为准,来确定用户所属的角色信息。FW将用户信息发送给服务器,服务器从存放的用户信息中查找用户所属的组,并将用户所属组信息发回给FW,FW依据用户所属组对应的角色权限为该用户授权。
点击虚拟网关资源列表中的连接就可以访问对应资源。

sys FW1
int g0/0/2
ip add 202.100.1.10 24
int g0/0/3
ip add 192.168.1.10 24
fire zone trust
add int g0/0/3
fire zone untrust
add int g0/0/2
#配置路由
ip rou 0.0.0.0 0 202.100.1.254



web代理是指通过FW做代理访问内网的web服务器资源,即url资源。
web代理功能的基本实现原理是将移动办公用户访问web server的过程被分成了两个阶段。首先是移动办公用户与FW虚拟网关之间建立HTTPS会话,然后FW虚拟网关再与web server 建立HTTP会话。虚拟网关在移动办公用户访问企业内网web server中起到了改写、转发web请求的作用。
(有点类似于nat server+服务器ssl)
web代理按照实现方式的不同分为了web改写和web link两种。
web改写
远程用户在点击虚拟网关资源列表中的链接时,虚拟网关会将用户要访问的真实url进行加密。如真实URL是http://website/resource.html,而经过Web改写以后URL可能会显示为http://website/D%3A/0–2+resource.html。通过web改写,起到隐藏内网web资源真实url的目的,从而保护内网web服务器的地址安全。
不同的终端设备使用不同的操作系统和浏览器,需要防火墙不仅能够将内网web资源转发给远程用户,而且还要对web资源进行“改写”,使之能够识别这些不同的终端。启用web代理功能后,fw会自动对web资源进行改写。
注意:通过对web资源页面中的元素进行改写,实现web代理功能。如果使用Web改写,由于FW与该内网Web资源之间只能使用TLS1.0协议,所以必须在内网Web资源中启用TLS1.0。
web link
不会对url进行加密和适配,只做单纯的转发。由于web link少了加密和适配的环节,因此业务处理效率较之web改写要高。而web改写由于做了加密和适配,因此在安全性方面要比web link高。
注意:内网Web资源以https方式提供服务时,通过在虚拟网关客户端页面中安装ActiveX控件,推荐使用Web Link,
转发流程

1、远程用户通过域名(如:https://100.1.1.1)访问虚拟网关。
2、登录虚拟网关成功后,在页面上看到自己被授权可以访问的资源列表。
3、远程用户点击自己要访问的资源链接,该链接的url为http://website/resource.html,fw根据此url请求内网真实的服务器。内网服务器根据url返回资源,fw转换成公网url,这个url实际上是两个url拼接起来的(即https://100.1.1.1+website/resource.html)。返回给远程用户。
4、fw收到上述url后,会向web server重新发起一个http请求,这个http请求就是web资源实际的url(http://website/resource.html)
5、web server以http方式向fw返回资源页面。
6、虚拟网关将web server返回的资源页面,再经过https方式转发给移动办公用户。
报文封装原理
远程用户的访问过程本质上是由HTTPs和HTTP这两个会话衔接而成。其中,远程用户与虚拟网关建立HTTPS会话时,使用的源端口为随机端口,目的端口是443.虚拟网关与web server建立HTTP会话时,源端口随机,目的端口是80.

安全策略

远程用户与FW间的SSL 虚拟私有网络加密报文。此处的SSL 虚拟私有网络加密报文会经过untrust-->local区域。
远程用户访问企业web server的业务报文。这些解密以后的业务报文经过的安全区域为lobal-->trust。
配置

通过网络拓展业务,在虚拟网关与移动办公用户之间建立安全的ssl 虚拟私有网络隧道,将用户连接到企业内网,实现对企业IP业务的全面访问。
交互流程

启动网络扩展功能,会触发以下几个动作:
虚拟网关会根据网络扩展业务中的配置,向移动办公用户下发不同的路由信息。
移动办公用户收到业务响应报文后进行解封装,取出其中的业务响应报文。
报文封装过程
网络拓展功能建立ssl 虚拟私有网络隧道的方法有两种:可靠传输模式和快速传输模式。
可靠传输模式中,以tcp协议作为传输协议。在网络不稳定的环境下推荐使用。
快速传输模式中,以udp协议作为传输协议。在网络稳定的环境下推荐使用。
可靠传输模式

远程用户和fw之间使用真实的源目地址,随机的源端口和443的目的端口(基于TCP协议)建立ssl连接,携带加密的ssl数据(6.6.6.6:随机---->1.1.1.1:443【ssl加密数据】)
fw收到后进行对ssl加密数据进行解密,得到拓展的源目地址、传输层协议TCP和源目端口(192.168.1.1:随机------>10.1.1.2:随机)
快速传输模式
远程用户和fw之间使用真实的源目地址,随机的源端口和443的目的端口(基于TCP协议)建立ssl连接,携带加密的ssl数据(6.6.6.6:随机---->1.1.1.1:443【ssl加密数据】)
fw收到后进行对ssl加密数据进行解密,得到拓展的源目地址、传输层协议UDP和源目端口(192.168.1.1:随机------>10.1.1.2:随机)

配置
保持连接:启用网络扩展的保持连接功能后,客户端会定时向FW发送报文,客户端和服务器端的网络扩展连接不会因为在SSL会话超时时间内没有流量通过而断开。
隧道保活间隔:发送保活报文的时间间隔
可分配IP地址池范围:SSL 虚拟私有网络网关分配给用户的虚拟IP地址的范围,每行一个地址段范围。
增加网络扩展地址池时,在线用户不会下线。
修改网络扩展地址池时,获取该地址池IP地址的在线用户会被强制下线。
删除网络扩展地址池时,如果在线用户所使用的IP地址对应的地址池被删除,则用户会被强制下线;否则,用户不会下线。
路由模式
分离路由模式:访问本地子网的数据,交由真实网卡转发,即使用真实的本机IP地址。访问其他网络的数据,交由虚拟网卡转发,即使用虚拟网关分配的地址。
全路由模式:无论是访问什么资源,数据一概被虚拟网卡截获,转发给虚拟网关处理。
手动路由模式:必须手动配置可访问内网网段列表,从而为其配置静态路由,然后客户端识别前往该网段的数据,交由虚拟网卡转发。只有选择手动路由模式时才需要配置可访问内网网段列表。

通过将文件共享协议(SMB、NFS)转换成基于SSL的超文本传输协议(https),实现对内网文件服务器的web方式访问。移动办公用户通过文件共享业务可以在文件服务器的共享目录中上传/下载文件、删除文件/目录、重命名文件/目录以及新建目录。企业内网文件服务器可以是基于SMB(Server Message Block)协议的Windows系统或者基于NFS(Network File System)协议的Linux系统。
业务交互流程

1、远程用户发起访问文件的https格式请求到fw
2、fw将https格式的请求报文转换为smb格式的报文到文件服务器
3、文件服务器发送smb格式的应答报文给fw
4、fw将smb格式的应答报文转换为https格式返回给远程用户。
安全策略

远程用户与fw间的ssl 虚拟私有网络加密报文,此处的ssl 虚拟私有网络加密报文会经过untrust---->local区域
远程用户访问企业文件服务器的业务报文。解密后的业务报文经过的安全区域为local---->trust区域
配置

通过在客户端上获取指定目的IP地址和端口的tcp报文,实现对内网指定资源的访问。
tcp资源是指基于tcp的上层有端口应用,比如telnet(23)、rdp(3389)、ftp(21、20)等。以远程用户通过telnet客户端访问企业内网telnet服务器为例,介绍端口转发业务的工作过程。
转发流程

登录成功后,移动办公用户在虚拟网关页面启用端口转发业务。随后,虚拟网关向移动办公用户的浏览器下发监控Telnet服务的指令,浏览器的Active控件开始实时监控本地的Telnet访问请求。
为了能让Telnet请求通过端口转发业务发送到虚拟网关,浏览器的ActiveX控件就需要先捕获到Telnet连接请求。具体做法是ActiveX控件会一直监控Telnet服务,一旦发现Telnet客户端发起Telnet请求,它就会修改这个Telnet请求的目的地址和端口,将真实的目的地址修改为自身的环回地址。例如,Telnet客户端要访问的真实Telnet服务器IP地址是10.1.1.1,端口是23,ActiveX控件就会把真实的目的地址修改成环回地址127.0.0.1,目的端口修改为1047(1024+23),这样就达到了捕获Telnet连接请求的目的。捕获到Telnet请求以后,再将真实的Telnet请求经过SSL加密隧道传送到虚拟网关。
浏览器的ActiveX控件会解密Telnet响应消息。
安全策略

以远程用户访问内网telnet服务器的过程为例,经过fw的流量分为两类。
远程用户与fw间的ssl 虚拟私有网络加密报文,此处的ssl 虚拟私有网络加密报文会经过untrust---->local区域
远程用户访问企业telnet服务器的业务报文,这些解密以后的业务报文经过的安全区域为local---->trust。
配置


注意如果是新增的功能,一定要在角色授权中再次进行添加。

用于检查接入虚拟网关的主机是否符合安全要求,可配置检查的包括:操作系统、端口、进程、杀毒软件、防火墙软件、注册表以及是否存在指定软件。还可以配置防二次跳转和防截屏。
防二次跳转:检查客户端是否开启远程共享程序,防止客户端被其他pc远程控制。
防截屏:检查客户端是否开启截屏程序,避免机密信息泄露。





主机检查策略通过条件中,所有策略都满足表示角色内用户需要通过关联的所有主机检查策略的检查,才能接入虚拟网关。任意策略满足表示角色内用户只要通过关联的主机检查策略中的任意策略的检查,就能接入虚拟网关。
default是虚拟网关的缺省角色,只能编辑不能删除。缺省情况下default内用户不可以访问内网任何资源。如果用户/用户组没有加入任何自定义角色,则缺省属于default角色,如果加入自定义角色,则不再属于default角色。

security-policy
default action permit
rule name rule_cloud_default
source-zone local
destination-zone untrust
action permit
rule name SSL
source-zone untrust
destination-zone local
destination-address 202.100.1.10 mask 255.255.255.255
service https
action permit
rule name Proxy
source-zone local
destination-zone trust
source-address 192.168.1.10 mask 255.255.255.255
destination-address 192.168.1.1 mask 255.255.255.255
service http
service netbios-session
service smb
action permit

在untrust pc(202.100.2.1)上,使用ie浏览器登录ssl 网关(202.100.1.10)
安装activeX控件。

如果出现无法显示网页的故障。从一下几个方面进行分析:
1、用户pc与ssl 虚拟私有网络网关路由不可达
在pc上ping虚拟网关的IP地址,前提是虚拟网关的对外接口打开ping功能(server-manager ping permit),如果不能ping通,表示路由不可达,检查网络状况,并确保路由配置正确。
2、ssl 虚拟私有网络网关的地址或端口号已经被更改
端口号可能被修改为非443,就不能使用https协议进行,就需要指定端口比如http://1.1.1.1:xxxx.
3、安全策略配置错误
可以先配置default action permit访问成功后检查display firewall session table再根据实际情况放开需要的安全策略。
输入账号密码登录到ssl网关

由于没有开启防火墙,所以安全检查失败

打开windows防火墙

登陆成功

如果用户无法访问虚拟网关页面上看到的web代理资源,可能有以下原因:
网关和内网服务器之间的网络故障
在fw上对内网服务器进行ping测试,前提是放开了local---->trust的icmp报文的安全策略。
内网服务器没有web服务
内网服务器没有开启web服务,在内网服务器上访问http://127.0.0.1进行测试。
安全策略配置错误
检查fw的安全策略配置情况。

输入账号密码(是文件共享配置的账号密码,不是fw上配置的)


测试远程桌面服务(3389)
前提是内网终端打开了远程桌面

注意远程桌面地址要写实际的内网地址


访问成功

测试telnet服务(23)

点击安装相应软件

检查网卡发现多一块网卡

检查主机本地路由表

ping测试


dis fire se ta ver sour inside 192.168.1.10
2022-08-02 00:13:46.460
Current Total Sessions : 2
http 虚拟私有网络: public --> public ID: a38f33e426c58f7662e86c31
Zone: local --> trust TTL: 00:00:10 Left: 00:00:07
Recv Interface: InLoopBack0
Interface: GigabitEthernet0/0/3 NextHop: 192.168.1.1 MAC: 000c-2933-e814
packets: 7 bytes: 518
192.168.1.10:10012 --> 192.168.1.1:80 PolicyName: Proxy
TCP State: close
smb 虚拟私有网络: public --> public ID: a48f33e426d40700d62e86c36
Zone: local --> trust TTL: 00:20:00 Left: 00:19:56
Recv Interface: InLoopBack0
Interface: GigabitEthernet0/0/3 NextHop: 192.168.1.1 MAC: 000c-2933-e814
packets: 7 bytes: 698
192.168.1.10:10013 --> 192.168.1.1:445 PolicyName: Proxy
TCP State: established
dis fire se ta
2022-08-20 15:18:46.880 +08:00
Current Total Sessions : 12
netbios-session 虚拟私有网络: public --> public 192.168.1.10:10016 --> 192.168.1.1:139
https 虚拟私有网络: public --> public 202.100.2.1:49250 --> 202.100.1.10:443
https 虚拟私有网络: public --> public 202.100.2.1:49249 --> 202.100.1.10:443
https 虚拟私有网络: public --> public 202.100.2.1:49251 --> 202.100.1.10:443
https 虚拟私有网络: public --> public 202.100.2.1:49239 --> 202.100.1.10:443
https 虚拟私有网络: public --> public 202.100.2.1:49238 --> 202.100.1.10:443
telnet 虚拟私有网络: public --> public 192.168.1.10:10018 --> 192.168.1.1:23
smb 虚拟私有网络: public --> public 192.168.1.10:10017 --> 192.168.1.1:445
rdp-tcp 虚拟私有网络: public --> public 192.168.1.10:10015 --> 192.168.1.1:3389
icmp 虚拟私有网络: public --> public 202.100.2.1:1 --> 192.168.1.1:2048
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“