কোনও সামগ্রীর ধরণ বা মডেল সংজ্ঞায়িত না করে আমি কীভাবে জাঙ্গো অনুমতিগুলি ব্যবহার করতে পারি?


86

আমি আমার জাঙ্গো অ্যাপ্লিকেশনটির মধ্যে নির্দিষ্ট ক্রিয়াকে সীমাবদ্ধ করতে অনুমতি ভিত্তিক সিস্টেমটি ব্যবহার করতে চাই। এই ক্রিয়াগুলি কোনও নির্দিষ্ট মডেলের (যেমন অ্যাপ্লিকেশনের বিভাগগুলিতে অ্যাক্সেস, অনুসন্ধান করা ...) এর সাথে সম্পর্কিত হওয়া দরকার না, সুতরাং আমি স্টক অনুমতি ফ্রেমওয়ার্কটি সরাসরি ব্যবহার করতে পারি না , কারণ Permissionমডেলটির জন্য ইনস্টল করা সামগ্রীর ধরণের একটি রেফারেন্স প্রয়োজন।

আমি আমার নিজের অনুমতি মডেলটি লিখতে পারতাম তবে তার পরে আমাকে জ্যাঙ্গো অনুমতিগুলির সাথে অন্তর্ভুক্ত সমস্ত গুডিকে আবার লিখতে হবে, যেমন:

আমি জাঙ্গো-অথরিটি এবং জ্যাঙ্গো-অভিভাবকের মতো কিছু অ্যাপ্লিকেশন চেক করেছি , তবে তারা প্রতি-বস্তুর অনুমতি অনুমোদনের মাধ্যমে মডেল সিস্টেমে আরও বেশি সংযোজন অনুমতি সরবরাহ করেছে বলে মনে হয়।

প্রকল্পের জন্য কোনও মডেল (পাশাপাশি Userএবং Group) সংজ্ঞায়িত না করে এই কাঠামোটি পুনরায় ব্যবহার করার কোনও উপায় আছে কি ?

উত্তর:


57

জ্যাঙ্গোর Permissionমডেলটির একটি ContentTypeউদাহরণ প্রয়োজন

আমি মনে করি এর চারপাশের একটি উপায় একটি ডামি তৈরি করছে ContentTypeযা কোনও মডেলের সাথে সম্পর্কিত নয় ( app_labelএবং modelক্ষেত্রগুলি কোনও স্ট্রিংয়ের মানতে সেট করা যেতে পারে)।

আপনি যদি এটি সমস্ত পরিষ্কার এবং সুন্দর চান তবে আপনি এমন একটি Permission প্রক্সি মডেল তৈরি করতে পারেন ContentTypeযা ডামির সমস্ত কুৎসিত বিবরণ পরিচালনা করে এবং "মডেললেস" অনুমতি উদাহরণ তৈরি করে। আপনি এমন একটি কাস্টম ম্যানেজার যুক্ত করতে পারেন যা Permissionবাস্তব মডেলগুলির সাথে সম্পর্কিত সমস্ত দৃষ্টিকোণ ফিল্টার করে ।


4
যদি আপনি কিছু আপত্তি না করেন, আমি আপনার উত্তরটি আমার বাস্তবায়ন দিয়ে সম্পূর্ণ করব।
চেভি

দুঃখের বিষয়, আপনার সম্পাদনা পর্যালোচনা করার মতো যথেষ্ট খ্যাতি না থাকায় আমি অনুমোদন দিতে পারি না (এটি আমাকে + ২ কে জিজ্ঞাসা করে)। অন্যান্য ব্যবহারকারীরা আপনার সম্পাদনাগুলি প্রত্যাখ্যান করছে, তাই আমি আপনাকে এটিকে অন্য উত্তর হিসাবে যুক্ত করার পরামর্শ দিচ্ছি (আপনার আমার অগ্রাধিকার রয়েছে!) আবারও ধন্যবাদ।
গঞ্জালো

4
এটা বিরক্তিকর. এটি সত্যিই আপনার উত্তরের একটি সমাপ্তি, সুতরাং এটির সম্পাদনা করা বোধগম্য। যাইহোক, আমি এটি অন্য উত্তরে রেখেছি।
চেভি

148

আপনার মধ্যে যারা এখনও অনুসন্ধান করছেন:

আপনি কোনও ডাটাবেস সারণী ছাড়াই একটি সহায়ক মডেল তৈরি করতে পারেন। এই মডেলটি আপনার প্রকল্পে আপনার যে কোনও অনুমতি আনতে পারে। কন্টেন্টটাইপের সাথে ডিল করার বা স্পষ্টভাবে অনুমতি বিষয়বস্তু তৈরি করার দরকার নেই।

from django.db import models
        
class RightsSupport(models.Model):
            
    class Meta:
        
        managed = False  # No database table creation or deletion  \
                         # operations will be performed for this model. 
                
        default_permissions = () # disable "add", "change", "delete"
                                 # and "view" default permissions

        permissions = ( 
            ('customer_rights', 'Global customer rights'),  
            ('vendor_rights', 'Global vendor rights'), 
            ('any_rights', 'Global any rights'), 
        )

ঠিক পরে manage.py makemigrationsএবং manage.py migrateআপনি এই অনুমতিগুলি যে কোনও অন্যর মতো ব্যবহার করতে পারেন।

# Decorator

@permission_required('app.customer_rights')
def my_search_view(request):
    …

# Inside a view

def my_search_view(request):
    request.user.has_perm('app.customer_rights')

# In a template
# The currently logged-in user’s permissions are stored in the template variable {{ perms }}

{% if perms.app.customer_rights %}
    <p>You can do any customer stuff</p>
{% endif %}

4
এটাই প্রতিভা, আমার দিন বাঁচাও!
Reorx

4
আমি পরিচালিত.পি মাইগ্রেশন চালানোর পরে কিছুই পরিবর্তন হয়নি ... আমি কোনও নতুন অনুমতি দেখতে পাচ্ছি না :(
এজি

4
আপনি কি আপনার প্রকল্পটিতে আপনার অ্যাপ্লিকেশন যুক্ত করেছেন (INSTALLED_APPS)?
দিমিত্রি

4
এই উত্তর নিখুঁত। আমিও [] ডিফল্ট_পরিষ্কারগুলি সম্পাদনা করেছি, মডেলটির সংরক্ষণে () সংরক্ষণ করুন নোট-ইমপ্লিমেন্টেড এরআর বাড়াতে চাইছি এবং যদি অনুমতি না পাওয়ানো মডেলকে এই অনুমতিটির জন্য সত্যই জাস্ট করা হয় তবে _ * _ অনুমতি () বানানো ভূল হতে পারে।
ডগলাস ডেনহার্টোগ

4
আমি মেটা বর্গ নিম্নলিখিত জোড়ার প্রস্তাব: default_permissions = ()। এটি জ্যাঙ্গোকে স্বয়ংক্রিয়ভাবে এই মডেলের জন্য ডিফল্ট যুক্ত / পরিবর্তন / মুছা / দেখার অনুমতিগুলি তৈরি করতে বাধা দেবে, আপনি যদি এই পদ্ধতির ব্যবহার করেন তবে সম্ভবত এটি অপ্রয়োজনীয়।
জর্দান

51

গঞ্জালোর পরামর্শ অনুসরণ করে , আমি আমার "মডেললেস" ডামি কনটেন্টের ধরণের অনুমতিগুলি পরিচালনা করতে একটি প্রক্সি মডেল এবং একটি কাস্টম ম্যানেজার ব্যবহার করেছি ।

from django.db import models
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType


class GlobalPermissionManager(models.Manager):
    def get_query_set(self):
        return super(GlobalPermissionManager, self).\
            get_query_set().filter(content_type__name='global_permission')


class GlobalPermission(Permission):
    """A global permission, not attached to a model"""

    objects = GlobalPermissionManager()

    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        ct, created = ContentType.objects.get_or_create(
            name="global_permission", app_label=self._meta.app_label
        )
        self.content_type = ct
        super(GlobalPermission, self).save(*args, **kwargs)

10
কোডটির জন্য ধন্যবাদ, এই কোডটি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণও দেখানো ভাল লাগবে।
কেন কোচরনে

4
কোথায় সেই মডেল অনুমতি বাস করা উচিত?
মিরাত ক্যান বায়রাক

4
গ্লোবাল পার্মিশন তৈরি করতে: অ্যাপ্লিকেশন থেকে মডেলগুলি গ্লোবাল পার্মিশন gp = গ্লোবালপিরমিশন.অবজেক্টস ক্রেইট আমদানি করে (কোডনাম = 'ক্যান_ডো_ইট', নাম = 'এটি করতে পারে') এটি চালানো হলে আপনি অন্য অনুমতিগুলির মতো ব্যবহারকারী / গোষ্ঠীতে সেই অনুমতি যুক্ত করতে পারেন ।
জুলিয়েন গ্রেনিয়ার

4
@JulienGrenier জ্যাঙ্গো 1.8 কোড বিরতি: FieldError: Cannot resolve keyword 'name' into field. Choices are: app_label, id, logentry, model, permission
ম্যাকিক

4
সতর্কতা: জ্যাঙ্গো -এর একটি নবীনতর সংস্করণ (অন্তত 1.10) প্রয়োজন পদ্ধতি "get_queryset" (শব্দ "QUERY" এবং "সেট মধ্যে অভাব: _ নোট) ওভাররাইড করতে।
কানের লতি

10

জ্যাঙ্গো ১.৮-তে চেইয়ের জবাবের জন্য ঠিক করুন, যা কয়েকটি মন্তব্যে অনুরোধ করা হয়েছে।

এটি প্রকাশিত নোটগুলিতে বলেছে:

Django.contrib.contenttyype.models.ContentType এর নাম ক্ষেত্রটি একটি মাইগ্রেশন দ্বারা সরানো হয়েছে এবং একটি সম্পত্তি দ্বারা প্রতিস্থাপন করা হয়েছে। এর অর্থ এই ক্ষেত্রটি দ্বারা আর কোনও সামগ্রী টাইপ অনুসন্ধান করা বা ফিল্টার করা সম্ভব নয়।

সুতরাং এটি কনটেন্ট টাইপের উল্লেখ হিসাবে 'নাম' যা গ্লোবাল পার্মিশনগুলিতে ব্যবহার করে না।

আমি যখন এটি ঠিক করি তখন আমি নিম্নলিখিতগুলি পাই:

from django.db import models
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType


class GlobalPermissionManager(models.Manager):
    def get_queryset(self):
        return super(GlobalPermissionManager, self).\
            get_queryset().filter(content_type__model='global_permission')


class GlobalPermission(Permission):
    """A global permission, not attached to a model"""

    objects = GlobalPermissionManager()

    class Meta:
        proxy = True
        verbose_name = "global_permission"

    def save(self, *args, **kwargs):
        ct, created = ContentType.objects.get_or_create(
            model=self._meta.verbose_name, app_label=self._meta.app_label,
        )
        self.content_type = ct
        super(GlobalPermission, self).save(*args)

গ্লোবাল পার্মিশনম্যানেজার শ্রেণিটি অপরিবর্তিত তবে সম্পূর্ণতার জন্য অন্তর্ভুক্ত।


4
এটি এখনও জ্যাঙ্গো ১.৮-র জন্য ঠিক করে নি যেমন সিঙ্কডিবি-র সময় জাজানো দৃser়ভাবে দাবি করে যে "নাম" ক্ষেত্রটি শূন্য হতে পারে না।
অরমিতা

এটি আমার পক্ষে কাজ করেছিল, তবে আমার প্রকল্পে এখনও অজানগো লিগ্যাসি স্টাফের কারণে মাইগ্রেশন ব্যবহার করছি না not আপনি কি পূর্ববর্তী জ্যাঙ্গো থেকে আপগ্রেড করছেন, কারণ সেখানে 1.8 তে কোনও নাম ক্ষেত্র হওয়ার কথা নেই
rgammans

4

এটি বিকল্প সমাধান। প্রথমে নিজেকে জিজ্ঞাসা করুন: ডিবির মধ্যে এমন একটি ডামি-মডেল তৈরি করবেন না যা সত্যই ডিবিতে উপস্থিত রয়েছে তবে অনুমতি গ্রহণ ছাড়া কখনও কখনও ব্যবহৃত হয় না? এটি দুর্দান্ত নয়, তবে আমি মনে করি এটি বৈধ এবং সোজা সামনের সমাধান।

from django.db import models

class Permissions(models.Model):

    can_search_blue_flower = 'my_app.can_search_blue_flower'

    class Meta:
        permissions = [
            ('can_search_blue_flower', 'Allowed to search for the blue flower'),
        ]

উপরের সমাধানটির সুবিধা রয়েছে যে আপনি Permissions.can_search_blue_flowerআক্ষরিক স্ট্রিং "my_app.can_search_blue_flower" ব্যবহারের পরিবর্তে আপনার উত্স কোডে পরিবর্তনশীলটি ব্যবহার করতে পারেন । এর অর্থ কম টাইপস এবং আইডিইতে আরও স্বতঃসিদ্ধ।


4
ব্যবহার কি managed=Falseআপনাকে Permissions.can_search_blue_flowerকোনও কারণে ব্যবহার করতে দেয় না ?
স্যাম বোবেল

@ সামোবেল হ্যাঁ, আপনি ঠিক থাকতে পারেন। আমার ধারণা আমি শেষবার "বিমূর্ত" চেষ্টা করেছি।
গেটল্লি

1

আপনি এটি proxy modelএকটি ডামি কন্টেন্ট ধরণের সাথে ব্যবহার করতে পারেন ।

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType


class CustomPermission(Permission):

    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        ct, created = ContentType.objects.get_or_create(
            model=self._meta.verbose_name, app_label=self._meta.app_label,
        )
        self.content_type = ct
        super(CustomPermission, self).save(*args)

এখন আপনি শুধু সঙ্গে অনুমতি তৈরি করতে পারেন nameএবং codenameকাছ থেকে অনুমতি নিয়ে CustomPermissionমডেল।

 CustomPermission.objects.create(name='Can do something', codename='can_do_something')

এবং আপনি আপনার টেমপ্লেটগুলিতে কেবলমাত্র কাস্টম অনুমতিগুলি জিজ্ঞাসা করতে এবং প্রদর্শন করতে পারেন।

 CustomPermission.objects.filter(content_type__model='custom permission')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.