Skip to content

Commit

Permalink
change readme
Browse files Browse the repository at this point in the history
  • Loading branch information
Flynnon authored and leohowell committed Sep 21, 2020
1 parent 3a3b996 commit c70a98b
Show file tree
Hide file tree
Showing 21 changed files with 50 additions and 15 deletions.
46 changes: 37 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# 风控系统
# 陌陌风控系统静态规则引擎

### 架构介绍

![风控系统架构图](./www/static/img/wiki/architecture.jpg)

### 快速启动
1. 本项目依赖redis, mysql, mongodb,因此需准备环境并更改配置项
Expand Down Expand Up @@ -41,14 +45,16 @@
名单包含三个类型:黑、白、灰名单

名单必须属于某个项目(用于确定名单的范围),可以在名单管理-名单项目管理中添加项目。

![名单管理](./www/static/img/wiki/menu.png)

一条名单型策略完整描述是**A {操作码:在/不在} {XX项目:单选,可选全局} 的 {维度:单选}{方向:黑/白/灰名单}**,示例:A在直播活动的设备白名单

2. 名单型策略

描述符为**{参数名:单选,假设是“用户ID”} {操作码:在/不在} {XX项目:单选,可选全局} 的 {维度:单选}{方向:黑/白/灰名单}**

示例:用户ID在红包项目的用户ID黑名单
示例:用户ID 在 初始项目 的 用户黑名单 中

![名单型策略](./www/static/img/wiki/menu_strategy.png)

3. 布尔型策略

Expand All @@ -58,33 +64,45 @@
传阈值的布尔型,描述符为 **{参数名:单选,假设是"账号ID"} {操作码:大于/小于/等于/不等于} {内置函数:历史登录次数} {阈值:170}**
示例:账号ID历史登录次数大于100

![布尔型策略](./www/static/img/wiki/bool_strategy.png)

`内置函数`是什么?就是自定义的一些逻辑判断函数,只需要满足要求返回布尔值即可。比如注册时间是否在某个范围以内,当前设备是否是常用设备。

4. 时段频控型策略

描述符为 **同一 {计数维度:单选,假设是“设备”} 在 {时段:时间跨度} 内限制 {阈值:整数N} 次 某动作**
示例:同一设备一天内限制登录1000次.
示例:同一设备一天内限制操作10次.
可是我怎么知道当前已经有多少次呢?这就需要上报,上报后将计数 详见第9条 **数据源管理**

![时段频控型策略](./www/static/img/wiki/freq_strategy.png)

5. 限用户数型策略

描述符为 **同一 {计数维度:单选,假设是“设备”} 在 {时段:时间跨度} 内限制 {阈值:整数N} 个用户**

示例:同一设备一天内限1000个用户
示例:同一设备当天限10个用户
此策略同样需要上报的数据,且由于与用户相关,因此上报数据中必须包含user_id字段(在数据源中需配置) 详见第9条 **数据源管理**


![限用户数型策略](./www/static/img/wiki/user_strategy.png)

6. 规则管理

管控原子:命中某条策略后的管控动作,比如拦截...
把上面2--5中所述的策略原子按照优先级组合起来,由上向下执行,直到命中某条策略,则返回对应策略的管控原子。此模块更多是重交互,完成策略的配置、组合、权重等等

![规则配置页](./www/static/img/wiki/rule_manage.png)

7. 日志管理

所有命中策略的日志均在此展示,`下一期会基于此日志,开放拦截溯源功能`
所有命中策略的日志均在此展示,也会包含审计相关的日志,`下一期会基于此日志,开放拦截溯源功能`

![命中日志](./www/static/img/wiki/rule_manage.png)

![审计日志](./www/static/img/wiki/audit_log.png)

8. 权限配置

供权限设置使用,精确限定某个用户能看哪些页面的数据。
供权限设置使用,精确限定某个用户能看哪些页面的数据。 详见 其它 -- 权限管理。

9. 数据源配置

Expand All @@ -93,6 +111,8 @@
存储的名字叫啥?就是此处要配置的数据源。对于此策略,只需要配置数据源,命名为login_uid, 字段包含uid, uid类型是string。然后程序就能根据uid为维度计数,并自动计算指定时间窗口内是否超出指定阈值。

重要:由于逻辑必然依赖时间信息,为通用且必需字段,timestamp为默认隐含字段,类型是时间戳(精确到秒,整数)

![数据源配置](static/img/wiki/data_source.png)

### 调用样例
1. 调用查询服务
Expand Down Expand Up @@ -164,6 +184,14 @@ User.objects.create_superuser(username=username, password=password, email=email,
| 用户 | 用户即为独立的个人/员工 | /permissions/users/ | 1. 本系统在界面上不提供添加用户的功能;2. 用户可以被分配到某个权限组中,也可以直接配置uri组 |
| 管理员 | 即为系统的拥有者,默认拥有所有权限 | 手动配置 | - |

具体图示如下:

![uri组管理](./www/static/img/wiki/permission_manage.png)

![权限组管理](./www/static/img/wiki/url_group_manage.png)

![用户管理](./www/static/img/wiki/user_manage.png)

### 配置相关

目前Django部分的配置均存放于 www/settings 目录,非Django部分的配置均位于 config 目录下。
Expand Down
1 change: 1 addition & 0 deletions builtin_funcs/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from risk_models.exceptions import BuiltInFuncNotExistError

logger = logging.getLogger(__name__)
logging.basicConfig()


class BuiltInFuncs(object):
Expand Down
1 change: 1 addition & 0 deletions risk_models/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from risk_models.cache import menu_cache

logger = logging.getLogger(__name__)
logging.basicConfig()


def build_redis_key(event_code, dimension, menu_type):
Expand Down
2 changes: 1 addition & 1 deletion tests/run_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.settings'

risk_env = os.environ['RISK_ENV']
risk_env = os.environ.get('RISK_ENV')
assert risk_env and risk_env == 'test', '注意,此部分只能在测试环境中执行'


Expand Down
4 changes: 2 additions & 2 deletions tests/test_builtin_funcs/test_buintin_funcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def test_is_abnormal(self):
def test_user_login_count(self):
testcases = [
({'user_id': '111110'}, None),
({'user_id': '111111'}, 100),
({'user_id': '111111'}, 40),
({'user_id': '111118'}, 200),
]
for req_body, result in testcases:
Expand Down Expand Up @@ -56,7 +56,7 @@ def test_op(self):
}
testcases = [
({'user_id': '111110'}, None),
({'user_id': '111111'}, 100),
({'user_id': '111111'}, 40),
({'user_id': '111118'}, 200),
]

Expand Down
6 changes: 4 additions & 2 deletions tests/test_risk_models/test_menu.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import unittest

import pymysql

pymysql.install_as_MySQLdb()

from risk_models.menu import hit_menu
from www.menu.init_data import create_menu_event, add_element_to_menu

Expand Down Expand Up @@ -38,7 +42,5 @@ def test_hit_menu(self):
menu_type=menu_type), False)




if __name__ == '__main__':
unittest.main()
4 changes: 4 additions & 0 deletions tests/test_risk_models/test_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import unittest

import pymysql

pymysql.install_as_MySQLdb()

import django

# init django settings
Expand Down
1 change: 0 additions & 1 deletion www/static/css/bootstrap.min.css

Large diffs are not rendered by default.

Binary file added www/static/img/wiki/architecture.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/audit_log.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/bool_strategy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/data_source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/freq_strategy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/hit_log.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/menu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/menu_strategy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/permission_manage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/rule_manage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/url_group_manage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/user_manage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added www/static/img/wiki/user_strategy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit c70a98b

Please sign in to comment.