例如,目前我有一个自定义视图:
<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。
但这是最好的解决方案吗?