mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	增加“极验-行为验”验证码集成支持
This commit is contained in:
		@@ -31,8 +31,8 @@ func (this *IndexAction) RunGet(params struct {
 | 
				
			|||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	count := countResp.Count
 | 
						var count = countResp.Count
 | 
				
			||||||
	page := this.NewPage(count)
 | 
						var page = this.NewPage(count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	listResp, err := this.RPC().HTTPFirewallPolicyRPC().ListEnabledHTTPFirewallPolicies(this.AdminContext(), &pb.ListEnabledHTTPFirewallPoliciesRequest{
 | 
						listResp, err := this.RPC().HTTPFirewallPolicyRPC().ListEnabledHTTPFirewallPolicies(this.AdminContext(), &pb.ListEnabledHTTPFirewallPoliciesRequest{
 | 
				
			||||||
		NodeClusterId: params.ClusterId,
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
@@ -44,10 +44,10 @@ func (this *IndexAction) RunGet(params struct {
 | 
				
			|||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	policyMaps := []maps.Map{}
 | 
						var policyMaps = []maps.Map{}
 | 
				
			||||||
	for _, policy := range listResp.HttpFirewallPolicies {
 | 
						for _, policy := range listResp.HttpFirewallPolicies {
 | 
				
			||||||
		countInbound := 0
 | 
							var countInbound = 0
 | 
				
			||||||
		countOutbound := 0
 | 
							var countOutbound = 0
 | 
				
			||||||
		if len(policy.InboundJSON) > 0 {
 | 
							if len(policy.InboundJSON) > 0 {
 | 
				
			||||||
			inboundConfig := &firewallconfigs.HTTPFirewallInboundConfig{}
 | 
								inboundConfig := &firewallconfigs.HTTPFirewallInboundConfig{}
 | 
				
			||||||
			err = json.Unmarshal(policy.InboundJSON, inboundConfig)
 | 
								err = json.Unmarshal(policy.InboundJSON, inboundConfig)
 | 
				
			||||||
@@ -72,7 +72,7 @@ func (this *IndexAction) RunGet(params struct {
 | 
				
			|||||||
			this.ErrorPage(err)
 | 
								this.ErrorPage(err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		countClusters := countClustersResp.Count
 | 
							var countClusters = countClustersResp.Count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// mode
 | 
							// mode
 | 
				
			||||||
		if len(policy.Mode) == 0 {
 | 
							if len(policy.Mode) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,6 +141,23 @@ func (this *UpdateAction) RunPost(params struct {
 | 
				
			|||||||
		this.Fail("验证码动作参数校验失败:" + err.Error())
 | 
							this.Fail("验证码动作参数校验失败:" + err.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查极验配置
 | 
				
			||||||
 | 
						if captchaOptions.CaptchaType == firewallconfigs.CaptchaTypeGeeTest || captchaOptions.GeeTestConfig.IsOn {
 | 
				
			||||||
 | 
							if captchaOptions.CaptchaType == firewallconfigs.CaptchaTypeGeeTest && !captchaOptions.GeeTestConfig.IsOn {
 | 
				
			||||||
 | 
								this.Fail("人机识别动作配置的默认验证方式为极验-行为验,所以需要选择允许用户使用极验")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(captchaOptions.GeeTestConfig.CaptchaId) == 0 {
 | 
				
			||||||
 | 
								this.FailField("geetestCaptchaId", "请输入极验-验证ID")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(captchaOptions.GeeTestConfig.CaptchaKey) == 0 {
 | 
				
			||||||
 | 
								this.FailField("geetestCaptchaKey", "请输入极验-验证Key")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 最大内容尺寸
 | 
						// 最大内容尺寸
 | 
				
			||||||
	if params.MaxRequestBodySize < 0 {
 | 
						if params.MaxRequestBodySize < 0 {
 | 
				
			||||||
		params.MaxRequestBodySize = 0
 | 
							params.MaxRequestBodySize = 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package waf
 | 
					package waf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
				
			||||||
@@ -37,12 +38,23 @@ func (this *IndexAction) RunGet(params struct {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if firewallPolicy != nil {
 | 
						if firewallPolicy != nil {
 | 
				
			||||||
 | 
							// captcha action
 | 
				
			||||||
 | 
							var captchaOptions = firewallconfigs.DefaultHTTPFirewallCaptchaAction()
 | 
				
			||||||
 | 
							if len(firewallPolicy.CaptchaOptionsJSON) > 0 {
 | 
				
			||||||
 | 
								err = json.Unmarshal(firewallPolicy.CaptchaOptionsJSON, captchaOptions)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									this.ErrorPage(err)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.Data["firewallPolicy"] = maps.Map{
 | 
							this.Data["firewallPolicy"] = maps.Map{
 | 
				
			||||||
			"id":       firewallPolicy.Id,
 | 
								"id":             firewallPolicy.Id,
 | 
				
			||||||
			"name":     firewallPolicy.Name,
 | 
								"name":           firewallPolicy.Name,
 | 
				
			||||||
			"isOn":     firewallPolicy.IsOn,
 | 
								"isOn":           firewallPolicy.IsOn,
 | 
				
			||||||
			"mode":     firewallPolicy.Mode,
 | 
								"mode":           firewallPolicy.Mode,
 | 
				
			||||||
			"modeInfo": firewallconfigs.FindFirewallMode(firewallPolicy.Mode),
 | 
								"modeInfo":       firewallconfigs.FindFirewallMode(firewallPolicy.Mode),
 | 
				
			||||||
 | 
								"captchaOptions": captchaOptions,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		this.Data["firewallPolicy"] = nil
 | 
							this.Data["firewallPolicy"] = nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package waf
 | 
					package waf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
				
			||||||
@@ -50,12 +51,23 @@ func (this *IndexAction) RunGet(params struct {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if firewallPolicy != nil {
 | 
						if firewallPolicy != nil {
 | 
				
			||||||
 | 
							// captcha action
 | 
				
			||||||
 | 
							var captchaOptions = firewallconfigs.DefaultHTTPFirewallCaptchaAction()
 | 
				
			||||||
 | 
							if len(firewallPolicy.CaptchaOptionsJSON) > 0 {
 | 
				
			||||||
 | 
								err = json.Unmarshal(firewallPolicy.CaptchaOptionsJSON, captchaOptions)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									this.ErrorPage(err)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.Data["firewallPolicy"] = maps.Map{
 | 
							this.Data["firewallPolicy"] = maps.Map{
 | 
				
			||||||
			"id":       firewallPolicy.Id,
 | 
								"id":            firewallPolicy.Id,
 | 
				
			||||||
			"name":     firewallPolicy.Name,
 | 
								"name":          firewallPolicy.Name,
 | 
				
			||||||
			"isOn":     firewallPolicy.IsOn,
 | 
								"isOn":          firewallPolicy.IsOn,
 | 
				
			||||||
			"mode":     firewallPolicy.Mode,
 | 
								"mode":          firewallPolicy.Mode,
 | 
				
			||||||
			"modeInfo": firewallconfigs.FindFirewallMode(firewallPolicy.Mode),
 | 
								"modeInfo":      firewallconfigs.FindFirewallMode(firewallPolicy.Mode),
 | 
				
			||||||
 | 
								"captchaAction": captchaOptions,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		this.Data["firewallPolicy"] = nil
 | 
							this.Data["firewallPolicy"] = nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,6 +57,11 @@ Vue.component("http-firewall-captcha-options-viewer", {
 | 
				
			|||||||
					summaryList.push("定制UI")
 | 
										summaryList.push("定制UI")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (this.options.geeTestConfig.isOn) {
 | 
				
			||||||
 | 
									summaryList.push("已配置极验")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (summaryList.length == 0) {
 | 
								if (summaryList.length == 0) {
 | 
				
			||||||
				this.summary = "默认配置"
 | 
									this.summary = "默认配置"
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,12 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
				uiFooter: "",
 | 
									uiFooter: "",
 | 
				
			||||||
				uiBody: "",
 | 
									uiBody: "",
 | 
				
			||||||
				cookieId: "",
 | 
									cookieId: "",
 | 
				
			||||||
				lang: ""
 | 
									lang: "",
 | 
				
			||||||
 | 
									geeTestConfig: {
 | 
				
			||||||
 | 
										isOn: false,
 | 
				
			||||||
 | 
										captchaId: "",
 | 
				
			||||||
 | 
										captchaKey: ""
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (options.countLetters <= 0) {
 | 
							if (options.countLetters <= 0) {
 | 
				
			||||||
@@ -33,6 +38,7 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
			options.captchaType = "default"
 | 
								options.captchaType = "default"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			options: options,
 | 
								options: options,
 | 
				
			||||||
			isEditing: false,
 | 
								isEditing: false,
 | 
				
			||||||
@@ -92,6 +98,9 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				this.uiBodyWarning = ""
 | 
									this.uiBodyWarning = ""
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"options.geeTestConfig.isOn": function (v) {
 | 
				
			||||||
 | 
								this.updateSummary()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
@@ -127,6 +136,10 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (this.options.geeTestConfig.isOn) {
 | 
				
			||||||
 | 
									summaryList.push("已配置极验")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (summaryList.length == 0) {
 | 
								if (summaryList.length == 0) {
 | 
				
			||||||
				this.summary = "默认配置"
 | 
									this.summary = "默认配置"
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
@@ -202,7 +215,6 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
					<td class="color-border">定制UI</td>
 | 
										<td class="color-border">定制UI</td>
 | 
				
			||||||
					<td><checkbox v-model="options.uiIsOn"></checkbox></td>
 | 
										<td><checkbox v-model="options.uiIsOn"></checkbox></td>
 | 
				
			||||||
				</tr>
 | 
									</tr>
 | 
				
			||||||
				
 | 
					 | 
				
			||||||
			</tbody>
 | 
								</tbody>
 | 
				
			||||||
			<tbody v-show="options.uiIsOn && options.captchaType == 'default'">
 | 
								<tbody v-show="options.uiIsOn && options.captchaType == 'default'">
 | 
				
			||||||
				<tr>
 | 
									<tr>
 | 
				
			||||||
@@ -254,6 +266,31 @@ Vue.component("http-firewall-captcha-options", {
 | 
				
			|||||||
				</tr>
 | 
									</tr>
 | 
				
			||||||
			</tbody>
 | 
								</tbody>
 | 
				
			||||||
		</table>
 | 
							</table>
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							<table class="ui table definition selectable">
 | 
				
			||||||
 | 
								<tr>
 | 
				
			||||||
 | 
									<td class="title">允许用户使用极验</td>
 | 
				
			||||||
 | 
									<td><checkbox v-model="options.geeTestConfig.isOn"></checkbox>
 | 
				
			||||||
 | 
										<p class="comment">选中后,表示允许用户在WAF设置中选择极验。</p>
 | 
				
			||||||
 | 
									</td>
 | 
				
			||||||
 | 
								</tr>
 | 
				
			||||||
 | 
								<tbody v-show="options.geeTestConfig.isOn">
 | 
				
			||||||
 | 
									<tr>
 | 
				
			||||||
 | 
										<td class="color-border">极验-验证ID *</td>
 | 
				
			||||||
 | 
										<td>
 | 
				
			||||||
 | 
											<input type="text" maxlength="100" name="geetestCaptchaId" v-model="options.geeTestConfig.captchaId" spellcheck="false"/>
 | 
				
			||||||
 | 
											<p class="comment">在极验控制台--业务管理中获取。</p>
 | 
				
			||||||
 | 
										</td>
 | 
				
			||||||
 | 
									</tr>
 | 
				
			||||||
 | 
									<tr>
 | 
				
			||||||
 | 
										<td class="color-border">极验-验证Key *</td>
 | 
				
			||||||
 | 
										<td>
 | 
				
			||||||
 | 
											<input type="text" maxlength="100" name="geetestCaptchaKey" v-model="options.geeTestConfig.captchaKey" spellcheck="false"/>
 | 
				
			||||||
 | 
											<p class="comment">在极验控制台--业务管理中获取。</p>
 | 
				
			||||||
 | 
										</td>
 | 
				
			||||||
 | 
									</tr>
 | 
				
			||||||
 | 
								</tbody>
 | 
				
			||||||
 | 
							</table>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
`
 | 
					`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,11 +16,25 @@ Vue.component("http-firewall-config-box", {
 | 
				
			|||||||
			firewall.defaultCaptchaType = "none"
 | 
								firewall.defaultCaptchaType = "none"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							let allCaptchaTypes = window.WAF_CAPTCHA_TYPES.$copy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// geetest
 | 
				
			||||||
 | 
							let geeTestIsOn = false
 | 
				
			||||||
 | 
							if (this.vFirewallPolicy != null && this.vFirewallPolicy.captchaAction != null && this.vFirewallPolicy.captchaAction.geeTestConfig != null) {
 | 
				
			||||||
 | 
								geeTestIsOn = this.vFirewallPolicy.captchaAction.geeTestConfig.isOn
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 如果没有启用geetest,则还原
 | 
				
			||||||
 | 
							if (!geeTestIsOn && firewall.defaultCaptchaType == "geetest") {
 | 
				
			||||||
 | 
								firewall.defaultCaptchaType = "none"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			firewall: firewall,
 | 
								firewall: firewall,
 | 
				
			||||||
			moreOptionsVisible: false,
 | 
								moreOptionsVisible: false,
 | 
				
			||||||
			execGlobalRules: !firewall.ignoreGlobalRules,
 | 
								execGlobalRules: !firewall.ignoreGlobalRules,
 | 
				
			||||||
			captchaTypes: window.WAF_CAPTCHA_TYPES
 | 
								captchaTypes: allCaptchaTypes,
 | 
				
			||||||
 | 
								geeTestIsOn: geeTestIsOn
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	watch: {
 | 
						watch: {
 | 
				
			||||||
@@ -66,7 +80,7 @@ Vue.component("http-firewall-config-box", {
 | 
				
			|||||||
				<td>
 | 
									<td>
 | 
				
			||||||
					<select class="ui dropdown auto-width" v-model="firewall.defaultCaptchaType">
 | 
										<select class="ui dropdown auto-width" v-model="firewall.defaultCaptchaType">
 | 
				
			||||||
						<option value="none">默认</option>
 | 
											<option value="none">默认</option>
 | 
				
			||||||
						<option v-for="captchaType in captchaTypes" :value="captchaType.code">{{captchaType.name}}</option>
 | 
											<option v-for="captchaType in captchaTypes" v-if="captchaType.code != 'geetest' || geeTestIsOn" :value="captchaType.code">{{captchaType.name}}</option>
 | 
				
			||||||
					</select>
 | 
										</select>
 | 
				
			||||||
					<p class="comment" v-if="firewall.defaultCaptchaType == 'none'">使用系统默认的设置。</p>
 | 
										<p class="comment" v-if="firewall.defaultCaptchaType == 'none'">使用系统默认的设置。</p>
 | 
				
			||||||
					<p class="comment" v-for="captchaType in captchaTypes" v-if="captchaType.code == firewall.defaultCaptchaType">{{captchaType.description}}</p>
 | 
										<p class="comment" v-for="captchaType in captchaTypes" v-if="captchaType.code == firewall.defaultCaptchaType">{{captchaType.description}}</p>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user