diff --git a/.coveragerc b/.coveragerc index 936d6bd996..c2c57943e3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,9 +1,8 @@ [run] -include = - common* - sql* - sql_api* +source = + . omit = src* downloads* sql/migrations/* + venv* diff --git a/.env.list b/.env.list index 418af00f8d..87f3fc5549 100644 --- a/.env.list +++ b/.env.list @@ -13,6 +13,12 @@ AUTH_LDAP_USER_ATTR_MAP=username=cn,display=displayname,email=email CSRF_TRUSTED_ORIGINS=http://127.0.0.1:9123 # https://django-q.readthedocs.io/en/latest/configure.html# -Q_CLUISTER_WORKERS=4 -Q_CLUISTER_TIMEOUT=60 +Q_CLUSTER_WORKERS=4 +Q_CLUSTER_TIMEOUT=60 Q_CLUISTER_SYNC=false + +# https://djangocas.dev/docs/latest/ +ENABLE_CAS=true +CAS_SERVER_URL=https://127.0.0.1 +CAS_VERSION=2 +SECURE_SSL_REDIRECT=false \ No newline at end of file diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index 0722acc2d8..063a8b76f9 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -78,13 +78,12 @@ jobs: run: | mysql -h127.0.0.1 -uroot -e "CREATE DATABASE archery CHARSET UTF8MB4;" mysql -h127.0.0.1 -uroot -e "DROP DATABASE IF EXISTS test_archery;CREATE DATABASE test_archery CHARSET UTF8MB4;" - mysql -h127.0.0.1 -uroot test_archery 0: if ENABLE_AUTHENTICATION_COUNT > 1: logger.warning( - "系统外部认证目前支持LDAP、DINGDING、OIDC三种,认证方式只能启用其中一种,如果启用多个,实际生效的只有一个,优先级LDAP > DINGDING > OIDC" + "系统外部认证目前支持LDAP、DINGDING、OIDC、CAS四种,认证方式只能启用其中一种,如果启用多个,实际生效的只有一个,优先级LDAP > DINGDING > OIDC > CAS" ) authentication = "" # 默认为空 for name, enabled in SUPPORTED_AUTHENTICATION: diff --git a/archery/urls.py b/archery/urls.py index e24e00eb52..11e407e85a 100644 --- a/archery/urls.py +++ b/archery/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from django.contrib import admin from common import views +from django.conf import settings urlpatterns = [ path("admin/", admin.site.urls), @@ -10,6 +11,17 @@ path("", include(("sql.urls", "sql"), namespace="sql")), ] +if settings.ENABLE_CAS: + import django_cas_ng.views + + urlpatterns += [ + path( + "cas/authenticate/", + django_cas_ng.views.LoginView.as_view(), + name="cas-login", + ), + ] + handler400 = views.bad_request handler403 = views.permission_denied handler404 = views.page_not_found diff --git a/common/config.py b/common/config.py index 89475a8c52..e70b498d95 100644 --- a/common/config.py +++ b/common/config.py @@ -15,7 +15,6 @@ class SysConfig(object): def __init__(self): self.sys_config = {} - self.get_all_config() def get_all_config(self): try: @@ -34,10 +33,28 @@ def get_all_config(self): self.sys_config = {} def get(self, key, default_value=None): - value = self.sys_config.get(key, default_value) + value = self.sys_config.get(key) + if value: + return value + # 尝试去数据库里取 + config_entry = Config.objects.filter(item=key).last() + if config_entry: + # 清洗成 python 的 bool + value = self.filter_bool(config_entry.value) # 是字符串的话, 如果是空, 或者全是空格, 返回默认值 if isinstance(value, str) and value.strip() == "": return default_value + if value is not None: + self.sys_config[key] = value + return value + return default_value + + @staticmethod + def filter_bool(value: str): + if value.lower() == "true": + return True + if value.lower() == "false": + return False return value def set(self, key, value): diff --git a/common/middleware/check_login_middleware.py b/common/middleware/check_login_middleware.py index 9d906f9929..836c2dda57 100644 --- a/common/middleware/check_login_middleware.py +++ b/common/middleware/check_login_middleware.py @@ -14,6 +14,7 @@ "/oidc/logout/", "/dingding/callback/", "/dingding/authenticate/", + "/cas/authenticate/", ] IGNORE_URL_RE = r"/api/(v1|auth)/\w+" diff --git a/common/templates/config.html b/common/templates/config.html index c56ec44dca..c66075a0f6 100755 --- a/common/templates/config.html +++ b/common/templates/config.html @@ -736,6 +736,17 @@
工单通知
+
+ +
+ +
+
短信服务

diff --git a/common/templates/login.html b/common/templates/login.html index 8aaa95c2d4..82ab1224ee 100644 --- a/common/templates/login.html +++ b/common/templates/login.html @@ -29,6 +29,10 @@

Login To Archery

+ {% elif cas_enabled %} + {% endif %} {% if dingding_enabled or oidc_enabled %}