增加“极验-行为验”验证码集成支持

This commit is contained in:
GoEdgeLab
2023-11-29 16:57:58 +08:00
parent 1f2093e031
commit 89255cb437
7 changed files with 117 additions and 20 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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>
` `

View File

@@ -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>