diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2b90ec9b2bccaf0334827acd7c25de3bd6a12110..3df226764ccd1615d3796d5f54ead7919b696926 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,17 +2,10 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="3a000256-1023-4a19-a046-bde25cb853cc" name="Default" comment=""> - <change afterPath="$PROJECT_DIR$/.idea/webResources.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/schoolapps/timetable/templates/timetable/quicklaunch.html" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/schoolapps/timetable/templates/timetable/substitution.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/school-apps.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/school-apps.iml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/schoolapps/static/common/style.css" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/static/common/style.css" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/schoolapps/templates/partials/header.html" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/templates/partials/header.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/schoolapps/timetable/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/timetable/urls.py" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/schoolapps/timetable/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/timetable/views.py" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/schoolapps/schoolapps/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/schoolapps/schoolapps/settings.py" afterDir="false" /> </list> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="TRACKING_ENABLED" value="true" /> @@ -32,17 +25,17 @@ <file leaf-file-name="secure_settings.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/secure_settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="204"> - <caret line="12" column="22" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" /> + <state relative-caret-position="391"> + <caret line="23" column="38" lean-forward="true" selection-start-line="23" selection-start-column="38" selection-end-line="23" selection-end-column="38" /> </state> </provider> </entry> </file> - <file leaf-file-name="settings.py" pinned="false" current-in-tab="false"> + <file leaf-file-name="settings.py" pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="303"> - <caret line="134" column="24" selection-start-line="134" selection-start-column="24" selection-end-line="134" selection-end-column="24" /> + <state relative-caret-position="259"> + <caret line="145" column="20" lean-forward="true" selection-start-line="145" selection-start-column="20" selection-end-line="145" selection-end-column="20" /> <folding> <element signature="e#309#318#0" expanded="true" /> </folding> @@ -54,7 +47,7 @@ <entry file="file://$PROJECT_DIR$/schoolapps/timetable/templates/timetable/substitution.html"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="187"> - <caret line="11" selection-start-line="11" selection-end-line="11" /> + <caret line="12" selection-start-line="12" selection-end-line="12" /> </state> </provider> </entry> @@ -63,7 +56,7 @@ <entry file="file://$PROJECT_DIR$/schoolapps/timetable/views.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="294"> - <caret line="19" column="27" lean-forward="true" selection-start-line="19" selection-start-column="27" selection-end-line="19" selection-end-column="27" /> + <caret line="19" column="27" selection-start-line="19" selection-start-column="27" selection-end-line="19" selection-end-column="27" /> <folding> <element signature="e#0#57#0" expanded="true" /> </folding> @@ -71,11 +64,11 @@ </provider> </entry> </file> - <file leaf-file-name="quicklaunch.html" pinned="false" current-in-tab="true"> + <file leaf-file-name="quicklaunch.html" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/schoolapps/timetable/templates/timetable/quicklaunch.html"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="170"> - <caret line="10" column="43" lean-forward="true" selection-start-line="10" selection-start-column="43" selection-end-line="10" selection-end-column="43" /> + <state> + <caret column="36" selection-start-column="36" selection-end-column="36" /> </state> </provider> </entry> @@ -84,7 +77,7 @@ <entry file="file://$PROJECT_DIR$/schoolapps/static/common/style.css"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="583"> - <caret line="137" column="15" lean-forward="true" selection-start-line="137" selection-start-column="15" selection-end-line="137" selection-end-column="15" /> + <caret line="136" column="15" selection-start-line="136" selection-start-column="15" selection-end-line="136" selection-end-column="15" /> </state> </provider> </entry> @@ -102,7 +95,7 @@ <entry file="file://$PROJECT_DIR$/schoolapps/templates/partials/header.html"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="1399"> - <caret line="109" column="16" lean-forward="true" selection-start-line="109" selection-start-column="16" selection-end-line="109" selection-end-column="16" /> + <caret line="109" column="16" selection-start-line="109" selection-start-column="16" selection-end-line="109" selection-end-column="16" /> </state> </provider> </entry> @@ -110,8 +103,8 @@ <file leaf-file-name="example_secure_settings.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="340"> - <caret line="20" column="35" selection-start-line="20" selection-start-column="35" selection-end-line="20" selection-end-column="35" /> + <state relative-caret-position="255"> + <caret line="15" column="36" selection-start-line="15" selection-start-column="36" selection-end-line="15" selection-end-column="36" /> </state> </provider> </entry> @@ -120,8 +113,8 @@ <entry file="file://$PROJECT_DIR$/README.md"> <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> <state split_layout="SPLIT"> - <first_editor relative-caret-position="373"> - <caret line="39" column="18" selection-start-line="39" selection-start-column="18" selection-end-line="39" selection-end-column="18" /> + <first_editor relative-caret-position="466"> + <caret line="36" column="19" lean-forward="true" selection-start-line="36" selection-start-column="19" selection-end-line="36" selection-end-column="19" /> </first_editor> <second_editor /> </state> @@ -205,15 +198,15 @@ <option value="$PROJECT_DIR$/schoolapps/aub/views.py" /> <option value="$PROJECT_DIR$/.gitignore" /> <option value="$PROJECT_DIR$/schoolapps/schoolapps/secure_settings.py" /> - <option value="$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py" /> - <option value="$PROJECT_DIR$/README.md" /> - <option value="$PROJECT_DIR$/schoolapps/schoolapps/settings.py" /> <option value="$PROJECT_DIR$/schoolapps/timetable/templates/timetable/substitution.html" /> <option value="$PROJECT_DIR$/schoolapps/timetable/views.py" /> <option value="$PROJECT_DIR$/schoolapps/templates/partials/header.html" /> <option value="$PROJECT_DIR$/schoolapps/timetable/urls.py" /> <option value="$PROJECT_DIR$/schoolapps/static/common/style.css" /> <option value="$PROJECT_DIR$/schoolapps/timetable/templates/timetable/quicklaunch.html" /> + <option value="$PROJECT_DIR$/README.md" /> + <option value="$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py" /> + <option value="$PROJECT_DIR$/schoolapps/schoolapps/settings.py" /> </list> </option> </component> @@ -685,13 +678,13 @@ <editor active="true" /> <layout> <window_info anchor="bottom" id="TODO" order="6" /> - <window_info anchor="bottom" id="Event Log" order="7" sideWeight="0.50053364" side_tool="true" visible="true" weight="0.23710209" /> + <window_info anchor="bottom" id="Event Log" order="7" sideWeight="0.5010672" side_tool="true" visible="true" weight="0.21953897" /> <window_info anchor="bottom" id="Database Changes" order="8" /> <window_info anchor="bottom" id="Version Control" order="10" weight="0.27083334" /> <window_info anchor="bottom" id="Python Console" order="8" weight="0.3294509" /> - <window_info anchor="bottom" id="Run" order="2" sideWeight="0.4994664" weight="0.23710209" /> + <window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.49893278" visible="true" weight="0.21953897" /> <window_info anchor="bottom" id="Terminal" order="9" /> - <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2620064" /> + <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.2620064" /> <window_info anchor="bottom" id="Docker" order="11" show_stripe_button="false" /> <window_info anchor="right" id="Database" order="3" /> <window_info anchor="bottom" id="Find" order="1" sideWeight="0.4994664" weight="0.32930845" /> @@ -700,12 +693,27 @@ <window_info id="Favorites" order="2" side_tool="true" /> <window_info anchor="bottom" id="Debug" order="3" weight="0.39933443" /> <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> + <window_info anchor="bottom" id="Docker" order="11" show_stripe_button="false" /> <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> + <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2620064" /> + <window_info anchor="right" id="SciView" order="5" /> <window_info anchor="right" id="Commander" order="0" weight="0.4" /> <window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> + <window_info anchor="bottom" id="TODO" order="6" /> + <window_info anchor="bottom" id="Version Control" order="10" weight="0.27083334" /> + <window_info anchor="bottom" id="Run" order="2" sideWeight="0.4994664" weight="0.23710209" /> + <window_info anchor="bottom" id="Find" order="1" sideWeight="0.4994664" weight="0.32930845" /> <window_info anchor="right" id="Data View" order="4" /> + <window_info anchor="bottom" id="Database Changes" order="8" /> + <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> + <window_info anchor="right" id="Database" order="3" /> + <window_info anchor="bottom" id="Terminal" order="9" /> + <window_info anchor="bottom" id="Event Log" order="7" sideWeight="0.50053364" side_tool="true" visible="true" weight="0.23710209" /> <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> + <window_info id="Favorites" order="2" side_tool="true" /> <window_info anchor="bottom" id="Message" order="0" /> + <window_info anchor="bottom" id="Debug" order="3" weight="0.39933443" /> + <window_info anchor="bottom" id="Python Console" order="8" weight="0.3294509" /> </layout> </component> <component name="TypeScriptGeneratedFilesManager"> @@ -981,9 +989,6 @@ <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="612"> <caret line="41" selection-start-line="41" selection-end-line="41" /> - <folding> - <element signature="e#0#57#0" expanded="true" /> - </folding> </state> </provider> </entry> @@ -991,9 +996,6 @@ <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="1938"> <caret line="122" column="29" selection-start-line="122" selection-start-column="29" selection-end-line="122" selection-end-column="29" /> - <folding> - <element signature="e#0#78#0" expanded="true" /> - </folding> </state> </provider> </entry> @@ -1004,27 +1006,10 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/secure_settings.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="204"> - <caret line="12" column="22" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/settings.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="303"> - <caret line="134" column="24" selection-start-line="134" selection-start-column="24" selection-end-line="134" selection-end-column="24" /> - <folding> - <element signature="e#309#318#0" expanded="true" /> - </folding> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/schoolapps/timetable/views.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="294"> - <caret line="19" column="27" lean-forward="true" selection-start-line="19" selection-start-column="27" selection-end-line="19" selection-end-column="27" /> + <caret line="19" column="27" selection-start-line="19" selection-start-column="27" selection-end-line="19" selection-end-column="27" /> <folding> <element signature="e#0#57#0" expanded="true" /> </folding> @@ -1034,7 +1019,7 @@ <entry file="file://$PROJECT_DIR$/schoolapps/timetable/templates/timetable/substitution.html"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="187"> - <caret line="11" selection-start-line="11" selection-end-line="11" /> + <caret line="12" selection-start-line="12" selection-end-line="12" /> </state> </provider> </entry> @@ -1045,42 +1030,59 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py"> + <entry file="file://$PROJECT_DIR$/schoolapps/static/common/style.css"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="340"> - <caret line="20" column="35" selection-start-line="20" selection-start-column="35" selection-end-line="20" selection-end-column="35" /> + <state relative-caret-position="583"> + <caret line="136" column="15" selection-start-line="136" selection-start-column="15" selection-end-line="136" selection-end-column="15" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/schoolapps/templates/partials/header.html"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="1399"> + <caret line="109" column="16" selection-start-line="109" selection-start-column="16" selection-end-line="109" selection-end-column="16" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/schoolapps/timetable/templates/timetable/quicklaunch.html"> + <provider selected="true" editor-type-id="text-editor"> + <state> + <caret column="36" selection-start-column="36" selection-end-column="36" /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/README.md"> <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> <state split_layout="SPLIT"> - <first_editor relative-caret-position="373"> - <caret line="39" column="18" selection-start-line="39" selection-start-column="18" selection-end-line="39" selection-end-column="18" /> + <first_editor relative-caret-position="466"> + <caret line="36" column="19" lean-forward="true" selection-start-line="36" selection-start-column="19" selection-end-line="36" selection-end-column="19" /> </first_editor> <second_editor /> </state> </provider> <provider editor-type-id="text-editor" /> </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/static/common/style.css"> + <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/example_secure_settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="583"> - <caret line="137" column="15" lean-forward="true" selection-start-line="137" selection-start-column="15" selection-end-line="137" selection-end-column="15" /> + <state relative-caret-position="255"> + <caret line="15" column="36" selection-start-line="15" selection-start-column="36" selection-end-line="15" selection-end-column="36" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/templates/partials/header.html"> + <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/secure_settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="1399"> - <caret line="109" column="16" lean-forward="true" selection-start-line="109" selection-start-column="16" selection-end-line="109" selection-end-column="16" /> + <state relative-caret-position="391"> + <caret line="23" column="38" lean-forward="true" selection-start-line="23" selection-start-column="38" selection-end-line="23" selection-end-column="38" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/schoolapps/timetable/templates/timetable/quicklaunch.html"> + <entry file="file://$PROJECT_DIR$/schoolapps/schoolapps/settings.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="170"> - <caret line="10" column="43" lean-forward="true" selection-start-line="10" selection-start-column="43" selection-end-line="10" selection-end-column="43" /> + <state relative-caret-position="259"> + <caret line="145" column="20" lean-forward="true" selection-start-line="145" selection-start-column="20" selection-end-line="145" selection-end-column="20" /> + <folding> + <element signature="e#309#318#0" expanded="true" /> + </folding> </state> </provider> </entry> diff --git a/README.md b/README.md index 4481cfb76bcda77c0e6fb798cf638c9a45f17de2..99361c045e06ccd14eaaa11c65b3ddd10d84d18b 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,7 @@ keine ## Installation ### Grundsystem ``` -apt install python3 python3-dev python3-pip git mariadb-server python3-venv -``` +apt install python3 python3-dev python3-pip git mariadb-server python3-venv libldap2-dev libsasl2-dev``` ### MySQL-Datenbank 1. Datenbank `schoolapps` (`utf8_general_ci`) anlegen @@ -39,7 +38,7 @@ python3 -m venv env source env/bin/activate pip install mysqlclient pip install django -pip install django-cors-headers +pip install django-auth-ldap ``` - `example_secure_settings.py` zu `secure_settings.py` kopieren und anpassen diff --git a/schoolapps/schoolapps/example_secure_settings.py b/schoolapps/schoolapps/example_secure_settings.py index 413ee94a2627a2c7360e73d8fdca9122ddaa424a..33e69e04e3956251db22bca9eff6b67314c53a65 100644 --- a/schoolapps/schoolapps/example_secure_settings.py +++ b/schoolapps/schoolapps/example_secure_settings.py @@ -26,3 +26,7 @@ DATABASES = { 'PORT': '' } } + +# LDAP +AUTH_LDAP_BIND_DN = "cn=django-agent,dc=example,dc=com" +AUTH_LDAP_BIND_PASSWORD = "phlebotinum" diff --git a/schoolapps/schoolapps/settings.py b/schoolapps/schoolapps/settings.py index e8e70bdae32b72add6fbdd1dc53e9e5755f087b3..bc4085f6cdef726155205fa61df808962d7f44af 100644 --- a/schoolapps/schoolapps/settings.py +++ b/schoolapps/schoolapps/settings.py @@ -11,6 +11,8 @@ https://docs.djangoproject.com/en/2.0/ref/settings/ """ import os +import ldap +from django_auth_ldap.config import LDAPSearch, GroupOfNamesType from .secure_settings import * # Build paths inside the project like this: os.path.join(BASE_DIR, ...) @@ -146,3 +148,52 @@ EMAIL_USE_TLS = True # TIMETABLE TIMETABLE_WIDTH = 5 TIMETABLE_HEIGHT = 10 + +######## +# LDAP # +######## + +# Baseline configuration. +AUTH_LDAP_SERVER_URI = "ldap://127.0.0.1" +AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com", + ldap.SCOPE_SUBTREE, "(uid=%(user)s)") +# or perhaps: +# AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=users,dc=example,dc=com" + +# Set up the basic group parameters. +AUTH_LDAP_GROUP_SEARCH = LDAPSearch("dc=skole,dc=skolelinux,dc=no", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)") +AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="ou") + +# Simple group restrictions +# AUTH_LDAP_REQUIRE_GROUP = "cn=enabled,ou=django,ou=groups,dc=example,dc=com" +# AUTH_LDAP_DENY_GROUP = "cn=disabled,ou=django,ou=groups,dc=example,dc=com" + +# Populate the Django user from the LDAP directory. +AUTH_LDAP_USER_ATTR_MAP = { + "first_name": "givenName", + "last_name": "sn", + "email": "mail" +} + +# AUTH_LDAP_USER_FLAGS_BY_GROUP = { +# "is_active": "cn=active,ou=django,ou=groups,dc=example,dc=com", +# "is_staff": "cn=staff,ou=django,ou=groups,dc=example,dc=com", +# "is_superuser": "cn=superuser,ou=django,ou=groups,dc=example,dc=com" +# } + +# This is the default, but I like to be explicit. +AUTH_LDAP_ALWAYS_UPDATE_USER = True + +# Use LDAP group membership to calculate group permissions. +AUTH_LDAP_FIND_GROUP_PERMS = True + +# Cache group memberships for an hour to minimize LDAP traffic +AUTH_LDAP_CACHE_GROUPS = True +AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600 + +# Keep ModelBackend around for per-user permissions and maybe a local +# superuser. +AUTHENTICATION_BACKENDS = ( + 'django_auth_ldap.backend.LDAPBackend', + 'django.contrib.auth.backends.ModelBackend', +)