自定义视图集中的drf模型权限

时间:2020-07-23 13:19:24

标签: django django-models django-rest-framework django-permissions

例如,目前我有一个自定义视图:

<Page x:Class="com.MyBiz.MyProd.Pages.Configuration.TopLevel.AddCompany"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:com.MyBiz.MyProd.Pages.Configuration.TopLevel"
      mc:Ignorable="d" 
      d:DesignHeight="250" d:DesignWidth="400" Margin="0,0,0,30"
      Title="AddCompany">

   <Border BorderBrush="Gainsboro" BorderThickness="2">
      <Grid Background="Gray" Height="250" Width="400" VerticalAlignment="Bottom" HorizontalAlignment="Left" >
         <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="130"/>
            <ColumnDefinition Width="*"/>
         </Grid.ColumnDefinitions>
         <StatusBar VerticalAlignment="Top"/>

         <Label VerticalAlignment="Center" HorizontalAlignment="Left">Company Name</Label>
         <TextBox x:Name="tbxCompanyName" Grid.Column="1" Height="30" MaxLength="100" HorizontalAlignment="Stretch" Margin="0,0,10,0"></TextBox>

         <Label VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="1" Grid.Column="0">Contact</Label>
         <TextBox x:Name="tbxContact" Grid.Column="1" Grid.Row="1" Height="30" HorizontalAlignment="Stretch"  MaxLength="500" Margin="0,0,10,0"></TextBox>

         <Label VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="2">Address</Label>
         <TextBox x:Name="tbxAddress" Grid.Column="1" Grid.Row="2" Height="30" HorizontalAlignment="Stretch"  MaxLength="100" Margin="0,0,10,0"></TextBox>

         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"  Grid.Column="1" Grid.Row="3" Margin="0,0,10,0">
            <Button x:Name="btnCancel" Width="40" Height="20" Background="LightGray" >
               <Image Source="/Images/cancel.png" VerticalAlignment="Center" HorizontalAlignment="left"></Image>
            </Button>
            <Button x:Name="btnCreate" Width="40" Height="20" Background="LightGray" Margin="20,0,0,0" Click="btnCreate_Click">
               <Image Source="/Images/approve.png" VerticalAlignment="Center" HorizontalAlignment="left"></Image>
            </Button>
         </StackPanel>

      </Grid>
   </Border>

</Page>

和这些模型:

class DocumentViewSet(RevisionMixin, viewsets.ViewSet):
    def destroy(self, request, pk=None):
        ...

用户属于公司。文档也属于公司。如果来自文档的公司和来自用户的公司相同,则用户仅应与文档视图进行交互。

在这种分离之上,用户可以具有常规的Django模型权限,例如delete或add。或另一个自定义模型权限。

现在,我想按视图检查用户是否与请求的资源属于同一公司,然后检查用户是否有权执行特定操作。

例如,在上面的视图集销毁功能中,我想从数据库中删除文档。因此,我想检查所请求的用户是否与所请求的文档具有相同的公司,然后我要检查用户是否对这些模型具有删除权限。

我尝试使用自定义权限:

class Company(models.Model):
    ...

class Document(models.Model):
    company = models.ForeignKey('company.Company', ...)
    ...

这适用于DocumentViewSet,但不适用于我的所有模型/视图集,因为另一个对象没有将外键直接指向公司。 因此,我需要在has_object_permission函数中创建一些权限类或具有一些ifelse。

但这是最好的解决方案吗?

0 个答案:

没有答案