Merge pull request #6745 from jumpserver/pr@dev@add_authorization_rule

feat: 授权规则分类管理
This commit is contained in:
feng626 2021-09-01 16:48:56 +08:00 committed by GitHub
commit 9fb6fd44d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 50 additions and 10 deletions

9
apps/perms/const.py Normal file
View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
#
from django.db.models import TextChoices
from django.utils.translation import ugettext_lazy as _
class AuthorizationRules(TextChoices):
manual = 'manual', _('Manual authorization')
ticket = 'ticket', _('Ticket authorization')

View File

@ -0,0 +1,23 @@
# Generated by Django 3.1.12 on 2021-08-31 03:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('perms', '0018_auto_20210208_1515'),
]
operations = [
migrations.AddField(
model_name='applicationpermission',
name='authorization_rules',
field=models.CharField(choices=[('manual', 'Manual authorization'), ('ticket', 'Ticket authorization')], default='manual', max_length=64, verbose_name='Authorization rules'),
),
migrations.AddField(
model_name='assetpermission',
name='authorization_rules',
field=models.CharField(choices=[('manual', 'Manual authorization'), ('ticket', 'Ticket authorization')], default='manual', max_length=64, verbose_name='Authorization rules'),
),
]

View File

@ -11,7 +11,7 @@ from orgs.mixins.models import OrgModelMixin
from common.db.models import UnionQuerySet from common.db.models import UnionQuerySet
from common.utils import date_expired_default, lazyproperty from common.utils import date_expired_default, lazyproperty
from orgs.mixins.models import OrgManager from orgs.mixins.models import OrgManager
from ..const import AuthorizationRules
__all__ = [ __all__ = [
'BasePermission', 'BasePermissionQuerySet' 'BasePermission', 'BasePermissionQuerySet'
@ -31,11 +31,7 @@ class BasePermissionQuerySet(models.QuerySet):
def invalid(self): def invalid(self):
now = timezone.now() now = timezone.now()
q = ( q = (Q(is_active=False) | Q(date_start__gt=now) | Q(date_expired__lt=now))
Q(is_active=False) |
Q(date_start__gt=now) |
Q(date_expired__lt=now)
)
return self.filter(q) return self.filter(q)
@ -48,13 +44,17 @@ class BasePermission(OrgModelMixin):
id = models.UUIDField(default=uuid.uuid4, primary_key=True) id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
users = models.ManyToManyField('users.User', blank=True, verbose_name=_("User"), related_name='%(class)ss') users = models.ManyToManyField('users.User', blank=True, verbose_name=_("User"), related_name='%(class)ss')
user_groups = models.ManyToManyField('users.UserGroup', blank=True, verbose_name=_("User group"), related_name='%(class)ss') user_groups = models.ManyToManyField(
'users.UserGroup', blank=True, verbose_name=_("User group"), related_name='%(class)ss')
is_active = models.BooleanField(default=True, verbose_name=_('Active')) is_active = models.BooleanField(default=True, verbose_name=_('Active'))
date_start = models.DateTimeField(default=timezone.now, db_index=True, verbose_name=_("Date start")) date_start = models.DateTimeField(default=timezone.now, db_index=True, verbose_name=_("Date start"))
date_expired = models.DateTimeField(default=date_expired_default, db_index=True, verbose_name=_('Date expired')) date_expired = models.DateTimeField(default=date_expired_default, db_index=True, verbose_name=_('Date expired'))
created_by = models.CharField(max_length=128, blank=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=128, blank=True, verbose_name=_('Created by'))
date_created = models.DateTimeField(auto_now_add=True, verbose_name=_('Date created')) date_created = models.DateTimeField(auto_now_add=True, verbose_name=_('Date created'))
comment = models.TextField(verbose_name=_('Comment'), blank=True) comment = models.TextField(verbose_name=_('Comment'), blank=True)
authorization_rules = models.CharField(
max_length=64, default=AuthorizationRules.manual, choices=AuthorizationRules.choices,
verbose_name=_('Authorization rules'))
objects = BasePermissionManager.from_queryset(BasePermissionQuerySet)() objects = BasePermissionManager.from_queryset(BasePermissionQuerySet)()

View File

@ -13,6 +13,8 @@ __all__ = [
class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer): class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer):
authorization_rules_display = serializers.ReadOnlyField(
source='get_authorization_rules_display', label=_('Authorization rules'))
category_display = serializers.ReadOnlyField(source='get_category_display', label=_('Category display')) category_display = serializers.ReadOnlyField(source='get_category_display', label=_('Category display'))
type_display = serializers.ReadOnlyField(source='get_type_display', label=_('Type display')) type_display = serializers.ReadOnlyField(source='get_type_display', label=_('Type display'))
is_valid = serializers.BooleanField(read_only=True, label=_('Is valid')) is_valid = serializers.BooleanField(read_only=True, label=_('Is valid'))
@ -24,7 +26,7 @@ class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer):
fields_small = fields_mini + [ fields_small = fields_mini + [
'category', 'category_display', 'type', 'type_display', 'category', 'category_display', 'type', 'type_display',
'is_active', 'is_expired', 'is_valid', 'is_active', 'is_expired', 'is_valid',
'created_by', 'date_created', 'date_expired', 'date_start', 'comment' 'created_by', 'date_created', 'date_expired', 'date_start', 'comment', 'authorization_rules_display'
] ]
fields_m2m = [ fields_m2m = [
'users', 'user_groups', 'applications', 'system_users', 'users', 'user_groups', 'applications', 'system_users',

View File

@ -39,6 +39,8 @@ class ActionsDisplayField(ActionsField):
class AssetPermissionSerializer(BulkOrgResourceModelSerializer): class AssetPermissionSerializer(BulkOrgResourceModelSerializer):
actions = ActionsField(required=False, allow_null=True, label=_("Actions")) actions = ActionsField(required=False, allow_null=True, label=_("Actions"))
authorization_rules_display = serializers.ReadOnlyField(
source='get_authorization_rules_display', label=_('Authorization rules'))
is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) is_valid = serializers.BooleanField(read_only=True, label=_("Is valid"))
is_expired = serializers.BooleanField(read_only=True, label=_('Is expired')) is_expired = serializers.BooleanField(read_only=True, label=_('Is expired'))
users_display = serializers.ListField(child=serializers.CharField(), label=_('Users display'), required=False) users_display = serializers.ListField(child=serializers.CharField(), label=_('Users display'), required=False)
@ -53,7 +55,7 @@ class AssetPermissionSerializer(BulkOrgResourceModelSerializer):
fields_small = fields_mini + [ fields_small = fields_mini + [
'is_active', 'is_expired', 'is_valid', 'actions', 'is_active', 'is_expired', 'is_valid', 'actions',
'created_by', 'date_created', 'date_expired', 'created_by', 'date_created', 'date_expired',
'date_start', 'comment' 'date_start', 'comment', 'authorization_rules_display'
] ]
fields_m2m = [ fields_m2m = [
'users', 'users_display', 'user_groups', 'user_groups_display', 'assets', 'users', 'users_display', 'user_groups', 'user_groups_display', 'assets',

View File

@ -3,6 +3,7 @@ from orgs.utils import tmp_to_org, tmp_to_root_org
from applications.const import AppCategory, AppType from applications.const import AppCategory, AppType
from applications.models import Application from applications.models import Application
from perms.models import ApplicationPermission from perms.models import ApplicationPermission
from perms.const import AuthorizationRules
from assets.models import SystemUser from assets.models import SystemUser
from .base import BaseHandler from .base import BaseHandler
@ -89,6 +90,7 @@ class Handler(BaseHandler):
permissions_data = { permissions_data = {
'id': self.ticket.id, 'id': self.ticket.id,
'name': apply_permission_name, 'name': apply_permission_name,
'authorization_rules': AuthorizationRules.ticket,
'category': apply_category, 'category': apply_category,
'type': apply_type, 'type': apply_type,
'comment': str(permission_comment), 'comment': str(permission_comment),

View File

@ -5,6 +5,7 @@ from .base import BaseHandler
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from perms.models import AssetPermission, Action from perms.models import AssetPermission, Action
from perms.const import AuthorizationRules
from orgs.utils import tmp_to_org, tmp_to_root_org from orgs.utils import tmp_to_org, tmp_to_root_org
@ -83,6 +84,7 @@ class Handler(BaseHandler):
permission_data = { permission_data = {
'id': self.ticket.id, 'id': self.ticket.id,
'name': apply_permission_name, 'name': apply_permission_name,
'authorization_rules': AuthorizationRules.ticket,
'comment': str(permission_comment), 'comment': str(permission_comment),
'created_by': permission_created_by, 'created_by': permission_created_by,
'actions': apply_actions, 'actions': apply_actions,

View File

@ -108,7 +108,7 @@ class Migration(migrations.Migration):
('strategy', models.CharField( ('strategy', models.CharField(
choices=[('super_admin', 'Super admin'), ('org_admin', 'Org admin'), ('super_org_admin', 'Super admin and org admin'), choices=[('super_admin', 'Super admin'), ('org_admin', 'Org admin'), ('super_org_admin', 'Super admin and org admin'),
('custom_user', 'Custom user')], ('custom_user', 'Custom user')],
default='super', max_length=64, verbose_name='Approve strategy')), default='super_admin', max_length=64, verbose_name='Approve strategy')),
('assignees_display', models.JSONField(default=list, encoder=common.db.encoder.ModelJSONFieldEncoder, ('assignees_display', models.JSONField(default=list, encoder=common.db.encoder.ModelJSONFieldEncoder,
verbose_name='Assignees display')), verbose_name='Assignees display')),
('assignees', ('assignees',