mirror of https://github.com/jumpserver/jumpserver
[Update] 支持radius认证 (#2323)
* [Update] 支持radius认证 * [Update] 支持radius * [Update] 增加requirements * [Update] 修改copyright * [Update] 修改migrationspull/2327/head
parent
35403086ab
commit
0e1d3f93ff
|
@ -12,7 +12,7 @@ RUN yum -y install epel-release && cd /tmp/requirements && \
|
||||||
RUN cd /tmp/requirements && pip install -r requirements.txt
|
RUN cd /tmp/requirements && pip install -r requirements.txt
|
||||||
|
|
||||||
COPY . /opt/jumpserver
|
COPY . /opt/jumpserver
|
||||||
COPY config_docker.py /opt/jumpserver/config.py
|
COPY config_example.yml /opt/jumpserver/config.yml
|
||||||
VOLUME /opt/jumpserver/data
|
VOLUME /opt/jumpserver/data
|
||||||
VOLUME /opt/jumpserver/logs
|
VOLUME /opt/jumpserver/logs
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
|
@ -0,0 +1,34 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from radiusauth.backends import RADIUSBackend, RADIUSRealmBackend
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
class CreateUserMixin:
|
||||||
|
def get_django_user(self, username, password=None):
|
||||||
|
if isinstance(username, bytes):
|
||||||
|
username = username.decode()
|
||||||
|
try:
|
||||||
|
user = User.objects.get(username=username)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
if '@' in username:
|
||||||
|
email = username
|
||||||
|
else:
|
||||||
|
email_suffix = settings.EMAIL_SUFFIX
|
||||||
|
email = '{}@{}'.format(username, email_suffix)
|
||||||
|
user = User(username=username, name=username, email=email)
|
||||||
|
user.source = user.SOURCE_RADIUS
|
||||||
|
user.save()
|
||||||
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
class RadiusBackend(CreateUserMixin, RADIUSBackend):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class RadiusRealmBackend(CreateUserMixin, RADIUSRealmBackend):
|
||||||
|
pass
|
|
@ -331,6 +331,10 @@ defaults = {
|
||||||
'SECURITY_PASSWORD_LOWER_CASE': False,
|
'SECURITY_PASSWORD_LOWER_CASE': False,
|
||||||
'SECURITY_PASSWORD_NUMBER': False,
|
'SECURITY_PASSWORD_NUMBER': False,
|
||||||
'SECURITY_PASSWORD_SPECIAL_CHAR': False,
|
'SECURITY_PASSWORD_SPECIAL_CHAR': False,
|
||||||
|
'AUTH_RADIUS': False,
|
||||||
|
'RADIUS_SERVER': 'localhost',
|
||||||
|
'RADIUS_PORT': 1812,
|
||||||
|
'RADIUS_SECRET': '',
|
||||||
'HTTP_BIND_HOST': '0.0.0.0',
|
'HTTP_BIND_HOST': '0.0.0.0',
|
||||||
'HTTP_LISTEN_PORT': 8080,
|
'HTTP_LISTEN_PORT': 8080,
|
||||||
}
|
}
|
||||||
|
|
|
@ -400,6 +400,16 @@ if AUTH_OPENID:
|
||||||
AUTHENTICATION_BACKENDS.insert(0, AUTH_OPENID_BACKENDS[0])
|
AUTHENTICATION_BACKENDS.insert(0, AUTH_OPENID_BACKENDS[0])
|
||||||
AUTHENTICATION_BACKENDS.insert(0, AUTH_OPENID_BACKENDS[1])
|
AUTHENTICATION_BACKENDS.insert(0, AUTH_OPENID_BACKENDS[1])
|
||||||
|
|
||||||
|
# Radius Auth
|
||||||
|
AUTH_RADIUS = CONFIG.AUTH_RADIUS
|
||||||
|
AUTH_RADIUS_BACKEND = 'authentication.radius.backends.RadiusBackend'
|
||||||
|
RADIUS_SERVER = CONFIG.RADIUS_SERVER
|
||||||
|
RADIUS_PORT = CONFIG.RADIUS_PORT
|
||||||
|
RADIUS_SECRET = CONFIG.RADIUS_SECRET
|
||||||
|
|
||||||
|
if AUTH_RADIUS:
|
||||||
|
AUTHENTICATION_BACKENDS.insert(0, AUTH_RADIUS_BACKEND)
|
||||||
|
|
||||||
# Celery using redis as broker
|
# Celery using redis as broker
|
||||||
CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/%(db)s' % {
|
CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/%(db)s' % {
|
||||||
'password': CONFIG.REDIS_PASSWORD,
|
'password': CONFIG.REDIS_PASSWORD,
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<strong>Copyright</strong> {% trans ' Beijing Duizhan Tech, Inc. ' %} © 2014-2018
|
<strong>Copyright</strong> {% trans ' Beijing Duizhan Tech, Inc. ' %} © 2014-2019
|
|
@ -5,6 +5,6 @@
|
||||||
<!--<img style="display: none" src="http://www.jumpserver.org/img/evaluate_avatar1.jpg">-->
|
<!--<img style="display: none" src="http://www.jumpserver.org/img/evaluate_avatar1.jpg">-->
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<strong>Copyright</strong> {% trans ' Beijing Duizhan Tech, Inc. ' %}© 2014-2018
|
<strong>Copyright</strong> {% trans ' Beijing Duizhan Tech, Inc. ' %}© 2014-2019
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
{% include '_copyright.html' %}
|
{% include '_copyright.html' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 text-right">
|
<div class="col-md-6 text-right">
|
||||||
<small>2014-2018</small>
|
<small>2014-2019</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 2.1.4 on 2019-01-07 11:12
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0017_auto_20181123_1113'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='source',
|
||||||
|
field=models.CharField(choices=[('local', 'Local'), ('ldap', 'LDAP/AD'), ('openid', 'OpenID'), ('radius', 'Radius')], default='local', max_length=30, verbose_name='Source'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -41,10 +41,12 @@ class User(AbstractUser):
|
||||||
SOURCE_LOCAL = 'local'
|
SOURCE_LOCAL = 'local'
|
||||||
SOURCE_LDAP = 'ldap'
|
SOURCE_LDAP = 'ldap'
|
||||||
SOURCE_OPENID = 'openid'
|
SOURCE_OPENID = 'openid'
|
||||||
|
SOURCE_RADIUS = 'radius'
|
||||||
SOURCE_CHOICES = (
|
SOURCE_CHOICES = (
|
||||||
(SOURCE_LOCAL, 'Local'),
|
(SOURCE_LOCAL, 'Local'),
|
||||||
(SOURCE_LDAP, 'LDAP/AD'),
|
(SOURCE_LDAP, 'LDAP/AD'),
|
||||||
(SOURCE_OPENID, 'OpenID'),
|
(SOURCE_OPENID, 'OpenID'),
|
||||||
|
(SOURCE_RADIUS, 'Radius'),
|
||||||
)
|
)
|
||||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||||
username = models.CharField(
|
username = models.CharField(
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
|
||||||
# 加密秘钥 生产环境中请修改为随机字符串,请勿外泄
|
|
||||||
SECRET_KEY:
|
|
||||||
|
|
||||||
# SECURITY WARNING: keep the bootstrap token used in production secret!
|
|
||||||
# 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制
|
|
||||||
BOOTSTRAP_TOKEN:
|
|
||||||
|
|
||||||
# Development env open this, when error occur display the full process track, Production disable it
|
|
||||||
# DEBUG 模式 开启DEBUG后遇到错误时可以看到更多日志
|
|
||||||
# DEBUG: true
|
|
||||||
|
|
||||||
# DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/
|
|
||||||
# 日志级别
|
|
||||||
# LOG_LEVEL: DEBUG
|
|
||||||
# LOG_DIR:
|
|
||||||
|
|
||||||
# Session expiration setting, Default 24 hour, Also set expired on on browser close
|
|
||||||
# 浏览器Session过期时间,默认24小时, 也可以设置浏览器关闭则过期
|
|
||||||
# SESSION_COOKIE_AGE: 3600 * 24
|
|
||||||
# SESSION_EXPIRE_AT_BROWSER_CLOSE: False
|
|
||||||
|
|
||||||
# Database setting, Support sqlite3, mysql, postgres ....
|
|
||||||
# 数据库设置
|
|
||||||
# See https://docs.djangoproject.com/en/1.10/ref/settings/#databases
|
|
||||||
|
|
||||||
# SQLite setting:
|
|
||||||
# 使用单文件sqlite数据库
|
|
||||||
# DB_ENGINE: sqlite3
|
|
||||||
# DB_NAME:
|
|
||||||
|
|
||||||
# MySQL or postgres setting like:
|
|
||||||
# 使用Mysql作为数据库
|
|
||||||
DB_ENGINE: mysql
|
|
||||||
DB_HOST: 127.0.0.1
|
|
||||||
DB_PORT: 3306
|
|
||||||
DB_USER: jumpserver
|
|
||||||
DB_PASSWORD:
|
|
||||||
DB_NAME: jumpserver
|
|
||||||
|
|
||||||
# When Django start it will bind this host and port
|
|
||||||
# ./manage.py runserver 127.0.0.1:8080
|
|
||||||
# 运行时绑定端口
|
|
||||||
HTTP_BIND_HOST: 0.0.0.0
|
|
||||||
HTTP_LISTEN_PORT: 8080
|
|
||||||
|
|
||||||
# Use Redis as broker for celery and web socket
|
|
||||||
# Redis配置
|
|
||||||
REDIS_HOST: 127.0.0.1
|
|
||||||
REDIS_PORT: 6379
|
|
||||||
# REDIS_PASSWORD:
|
|
||||||
# REDIS_DB_CELERY: 3
|
|
||||||
# REDIS_DB_CACHE: 4
|
|
||||||
|
|
||||||
# Use OpenID authorization
|
|
||||||
# 使用OpenID 来进行认证设置
|
|
||||||
# BASE_SITE_URL: http://localhost:8080
|
|
||||||
# AUTH_OPENID: false # True or False
|
|
||||||
# AUTH_OPENID_SERVER_URL: https://openid-auth-server.com/
|
|
||||||
# AUTH_OPENID_REALM_NAME: realm-name
|
|
||||||
# AUTH_OPENID_CLIENT_ID: client-id
|
|
||||||
# AUTH_OPENID_CLIENT_SECRET: client-secret
|
|
||||||
|
|
||||||
# OTP校验窗口大小,可以避免服务器时间稍有差异引起OTP校验失败
|
|
||||||
# OTP_VALID_WINDOW: 0
|
|
|
@ -78,3 +78,4 @@ python-keycloak-client==0.1.3
|
||||||
rest_condition==1.0.3
|
rest_condition==1.0.3
|
||||||
python-ldap==3.1.0
|
python-ldap==3.1.0
|
||||||
tencentcloud-sdk-python==3.0.40
|
tencentcloud-sdk-python==3.0.40
|
||||||
|
django-radius==1.3.3
|
||||||
|
|
Loading…
Reference in New Issue