mirror of https://github.com/jumpserver/jumpserver
修改token获取,拆分认证文件和权限文件
parent
d964221689
commit
4d71c2d1ff
|
@ -12,5 +12,5 @@
|
|||
|
||||
|
||||
from users.utils import AdminUserRequiredMixin
|
||||
from users.backends import IsSuperUserOrTerminalUser, IsSuperUser
|
||||
from users.permissions import IsSuperUserOrTerminalUser, IsSuperUser
|
||||
from users.models import User, UserGroup
|
||||
|
|
|
@ -14,9 +14,9 @@ router.register(r'v1/admin-user', api.AdminUserViewSet, 'admin-user')
|
|||
router.register(r'v1/system-user', api.SystemUserViewSet, 'system-user')
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'),
|
||||
url(r'^v1/assets_bulk$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'),
|
||||
# url(r'^v1/idc/(?P<pk>[0-9]+)/assets/$', api.IDCAssetsApi.as_view(), name='api-idc-assets'),
|
||||
url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='system-user-auth'),
|
||||
url(r'^v1/system-user/auth', api.SystemUserAuthApi.as_view(), name='system-user-auth'),
|
||||
]
|
||||
|
||||
urlpatterns += router.urls
|
||||
|
|
|
@ -4,5 +4,5 @@
|
|||
from users.utils import AdminUserRequiredMixin
|
||||
from users.models import User
|
||||
from assets.models import Asset, SystemUser
|
||||
from users.backends import IsSuperUserOrTerminalUser
|
||||
from users.permissions import IsSuperUserOrTerminalUser
|
||||
from terminal.models import Terminal
|
||||
|
|
|
@ -263,11 +263,11 @@ REST_FRAMEWORK = {
|
|||
# Use Django's standard `django.contrib.auth` permissions,
|
||||
# or allow read-only access for unauthenticated users.
|
||||
'DEFAULT_PERMISSION_CLASSES': (
|
||||
'users.backends.IsValidUser',
|
||||
'users.permissions.IsValidUser',
|
||||
),
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
'users.backends.TerminalAuthentication',
|
||||
'users.backends.AccessTokenAuthentication',
|
||||
'users.authentication.TerminalAuthentication',
|
||||
'users.authentication.AccessTokenAuthentication',
|
||||
'rest_framework.authentication.TokenAuthentication',
|
||||
'rest_framework.authentication.BasicAuthentication',
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
from rest_framework.views import APIView, Response
|
||||
from rest_framework.generics import ListAPIView, get_object_or_404
|
||||
from rest_framework import viewsets
|
||||
from users.backends import IsValidUser, IsSuperUser
|
||||
from users.permissions import IsValidUser, IsSuperUser
|
||||
from common.utils import get_object_or_none
|
||||
from .utils import get_user_granted_assets, get_user_granted_asset_groups, get_user_asset_permissions, \
|
||||
get_user_group_asset_permissions, get_user_group_granted_assets, get_user_group_granted_asset_groups
|
||||
|
|
|
@ -11,7 +11,8 @@ from rest_framework.permissions import AllowAny
|
|||
from common.utils import signer, get_object_or_none
|
||||
from .models import Terminal, TerminalHeatbeat
|
||||
from .serializers import TerminalSerializer, TerminalHeatbeatSerializer
|
||||
from .hands import IsSuperUserOrTerminalUser
|
||||
from .hands import IsSuperUserOrTerminalUser, User
|
||||
|
||||
|
||||
|
||||
class TerminalViewSet(viewsets.ModelViewSet):
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
from users.backends import IsSuperUserOrTerminalUser
|
||||
from users.models import User
|
||||
from users.permissions import IsSuperUserOrTerminalUser
|
||||
from audits.models import ProxyLog
|
||||
|
||||
|
|
|
@ -13,10 +13,10 @@ from django_filters.rest_framework import DjangoFilterBackend
|
|||
|
||||
from common.mixins import IDInFilterMixin
|
||||
from common.utils import get_logger
|
||||
from .utils import check_user_valid, token_gen
|
||||
from .utils import check_user_valid, get_or_refresh_token
|
||||
from .models import User, UserGroup
|
||||
from .hands import write_login_log_async
|
||||
from .backends import IsSuperUser, IsTerminalUser, IsValidUser, IsSuperUserOrTerminalUser
|
||||
from .permissions import IsSuperUser, IsTerminalUser, IsValidUser, IsSuperUserOrTerminalUser
|
||||
from . import serializers
|
||||
|
||||
|
||||
|
@ -87,19 +87,11 @@ class UserGroupUpdateUserApi(generics.RetrieveUpdateAPIView):
|
|||
|
||||
class UserToken(APIView):
|
||||
permission_classes = (IsValidUser,)
|
||||
expiration = settings.CONFIG.TOKEN_EXPIRATION or 3600
|
||||
|
||||
def get(self, request):
|
||||
if not request.user:
|
||||
return Response({'error': 'unauthorized'})
|
||||
|
||||
remote_addr = request.META.get('REMOTE_ADDR', '')
|
||||
remote_addr = base64.b16encode(remote_addr).replace('=', '')
|
||||
token = cache.get('%s_%s' % (request.user.id, remote_addr))
|
||||
if not token:
|
||||
token = token_gen(request.user)
|
||||
cache.set(token, request.user.id, self.expiration)
|
||||
cache.set('%s_%s' % (request.user.id, remote_addr), token, self.expiration)
|
||||
token = get_token(request)
|
||||
return Response({'token': token})
|
||||
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ from rest_framework.compat import is_authenticated
|
|||
|
||||
from common.utils import signer, get_object_or_none
|
||||
from .hands import Terminal
|
||||
from .utils import get_or_refresh_token
|
||||
from .models import User
|
||||
|
||||
|
||||
|
@ -83,45 +84,5 @@ class AccessTokenAuthentication(authentication.BaseAuthentication):
|
|||
|
||||
if not user:
|
||||
return None
|
||||
|
||||
remote_addr = request.META.get('REMOTE_ADDR', '')
|
||||
remote_addr = base64.b16encode(remote_addr).replace('=', '')
|
||||
cache.set(token, user_id, self.expiration)
|
||||
cache.set('%s_%s' % (user.id, remote_addr), token, self.expiration)
|
||||
get_or_refresh_token(request, user)
|
||||
return user, None
|
||||
|
||||
|
||||
class IsValidUser(permissions.IsAuthenticated, permissions.BasePermission):
|
||||
"""Allows access to valid user, is active and not expired"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsValidUser, self).has_permission(request, view) \
|
||||
and request.user.is_valid
|
||||
|
||||
|
||||
class IsTerminalUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access only to app user """
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsTerminalUser, self).has_permission(request, view) \
|
||||
and isinstance(request.user, Terminal)
|
||||
|
||||
|
||||
class IsSuperUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access only to superuser"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsSuperUser, self).has_permission(request, view) \
|
||||
and request.user.is_superuser
|
||||
|
||||
|
||||
class IsSuperUserOrTerminalUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access between superuser and app user"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsSuperUserOrTerminalUser, self).has_permission(request, view) \
|
||||
and (request.user.is_superuser or request.user.is_terminal)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
|
@ -12,5 +12,6 @@
|
|||
|
||||
from terminal.models import Terminal
|
||||
from audits.tasks import write_login_log_async
|
||||
from users.models import User
|
||||
# from perms.models import AssetPermission
|
||||
# from perms.utils import get_user_granted_assets, get_user_granted_asset_groups
|
||||
|
|
|
@ -67,6 +67,7 @@ class User(AbstractUser):
|
|||
ROLE_CHOICES = (
|
||||
('Admin', _('Administrator')),
|
||||
('User', _('User')),
|
||||
('APP', _('Application'))
|
||||
)
|
||||
|
||||
username = models.CharField(max_length=20, unique=True, verbose_name=_('Username'))
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
import base64
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext as _
|
||||
from rest_framework import authentication, exceptions, permissions
|
||||
from rest_framework.compat import is_authenticated
|
||||
|
||||
from common.utils import signer, get_object_or_none
|
||||
from .hands import Terminal
|
||||
from .models import User
|
||||
|
||||
|
||||
class IsValidUser(permissions.IsAuthenticated, permissions.BasePermission):
|
||||
"""Allows access to valid user, is active and not expired"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsValidUser, self).has_permission(request, view) \
|
||||
and request.user.is_valid
|
||||
|
||||
|
||||
class IsTerminalUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access only to app user """
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsTerminalUser, self).has_permission(request, view) \
|
||||
and isinstance(request.user, Terminal)
|
||||
|
||||
|
||||
class IsSuperUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access only to superuser"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsSuperUser, self).has_permission(request, view) \
|
||||
and request.user.is_superuser
|
||||
|
||||
|
||||
class IsSuperUserOrTerminalUser(IsValidUser, permissions.BasePermission):
|
||||
"""Allows access between superuser and app user"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return super(IsSuperUserOrTerminalUser, self).has_permission(request, view) \
|
||||
and (request.user.is_superuser or request.user.is_terminal)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
|
@ -16,14 +16,14 @@ router.register(r'v1/user-groups', api.UserGroupViewSet, 'user-group')
|
|||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^v1/users/token/$', api.UserToken.as_view(), name='user-token'),
|
||||
url(r'^v1/users/profile/$', api.UserProfile.as_view(), name='user-profile'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/reset-password/$', api.UserResetPasswordApi.as_view(), name='user-reset-password'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/reset-pk/$', api.UserResetPKApi.as_view(), name='user-reset-pk'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/update-pk/$', api.UserUpdatePKApi.as_view(), name='user-update-pk'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/groups/$',
|
||||
url(r'^v1/token$', api.UserToken.as_view(), name='user-token'),
|
||||
url(r'^v1/profile$', api.UserProfile.as_view(), name='user-profile'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/reset-password$', api.UserResetPasswordApi.as_view(), name='user-reset-password'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/reset-pk$', api.UserResetPKApi.as_view(), name='user-reset-pk'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/update-pk$', api.UserUpdatePKApi.as_view(), name='user-update-pk'),
|
||||
url(r'^v1/users/(?P<pk>\d+)/groups$',
|
||||
api.UserUpdateGroupApi.as_view(), name='user-update-group'),
|
||||
url(r'^v1/user-groups/(?P<pk>\d+)/users/$',
|
||||
url(r'^v1/user-groups/(?P<pk>\d+)/users$',
|
||||
api.UserGroupUpdateUserApi.as_view(), name='user-group-update-user'),
|
||||
]
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# ~*~ coding: utf-8 ~*~
|
||||
#
|
||||
from __future__ import unicode_literals
|
||||
import base64
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
|
@ -10,6 +11,7 @@ from django.conf import settings
|
|||
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.cache import cache
|
||||
|
||||
from paramiko.rsakey import RSAKey
|
||||
|
||||
|
@ -195,6 +197,13 @@ def check_user_valid(**kwargs):
|
|||
return None
|
||||
|
||||
|
||||
def token_gen(*args, **kwargs):
|
||||
def get_or_refresh_token(request, user):
|
||||
expiration = settings.CONFIG.TOKEN_EXPIRATION or 3600
|
||||
remote_addr = request.META.get('REMOTE_ADDR', '')
|
||||
remote_addr = base64.b16encode(remote_addr).replace('=', '')
|
||||
token = cache.get('%s_%s' % (user.id, remote_addr))
|
||||
if not token:
|
||||
token = uuid.uuid4().get_hex()
|
||||
cache.set(token, request.user.id, expiration)
|
||||
cache.set('%s_%s' % (request.user.id, remote_addr), token, expiration)
|
||||
return uuid.uuid4().get_hex()
|
||||
|
||||
|
|
Loading…
Reference in New Issue