मेरे पास मेरे आवेदन में एक विशिष्ट प्राधिकरण प्रणाली है (मेरे प्रबंधकों द्वारा पूछा गया)। यह जूमला पर आधारित है। उपयोगकर्ता उपयोगकर्ता समूहों से जुड़े हुए हैं। मेरे आवेदन में प्रत्येक क्रिया (यानी पृष्ठ) संसाधन हैं और प्रत्येक संसाधन के लिए मैंने एक पहुंच स्तर निर्धारित किया है। मुझे इस विशिष्ट संसाधन तक पहुंच प्रदान करने या न करने के लिए वर्तमान उपयोगकर्ता के उपयोगकर्ता समूहों के साथ संसाधन पहुंच स्तर की तुलना करनी है। उन सभी सूचनाओं को डेटाबेस में संग्रहीत किया जाता है जो सिम्फनी में बदले की संस्थाओं में हैं: उपयोगकर्ता <- ManyToMany -> उपयोगकर्ता समूह मेनू (पथ और पहुंच स्तर वाले सभी संसाधन)

मैंने वोटर सिस्टम के बारे में सोचा। मुझे लगता है कि यह वैसा ही है जैसा मैं चाहता हूं। क्या मैं इसके लिए सपोर्ट फंक्शन को हाईजैक कर सकता हूं?

protected function supports($user, $resource)
    {
        //get usergroups of the $user => $usergroups
        //get the access level of the resource => $resource_access
        // if the attribute isn't one we support, return false
        if (!in_array($usergroups, $resource_access)) {
            return false;
        }

        return true;
    }

उपयोगकर्ता समूह और संसाधन का पहुंच स्तर प्राप्त करें मुझे डेटाबेस में कुछ प्रश्न करना होगा। इसका उपयोग करने के लिए, तो मैं अपने सभी नियंत्रक में इनकार एक्सेसअनलेसग्रांटेड() फ़ंक्शन का उपयोग करना चाहता हूं (रास्ते से अनावश्यक लगता है)?

क्या आपको लगता है कि यह काम करेगा या इस मामले के लिए अधिक उपयुक्त कोई अन्य प्रणाली है? मैंने श्रोता में नियंत्रण करने के बारे में सोचा। कर्नेल। अनुरोध घटना भी। आशा है कि मैं काफी स्पष्ट हूं, मैं सिम्फनी के लिए नया हूं और अभी भी कुछ मुद्दों को समझने के लिए कि सब कुछ कैसे संबंधित और काम कर रहा है।

1
Azeann 30 अगस्त 2019, 12:43

1 उत्तर

सबसे बढ़िया उत्तर

मतदाता घटक इसके लिए एक अच्छा फिट होना चाहिए, क्योंकि यह एक निष्क्रिय दृष्टिकोण है जो आपको किसी भी तर्क को इस तरह से लागू करने देता है जहां कोड के माध्यम से इसे ठीक किया जा सकता है, बिना किसी डेटाबेस विशिष्ट एसीएल पेड़ को संशोधित किए बिना सिम्फनी द्वारा प्रबंधित नहीं किया जाता है।

यदि आप denyAccessUnlessGranted() या isGranted() कोड, एनोटेशन या टहनी के माध्यम से उपयोग करते हैं तो मतदाताओं को बुलाया जाता है। आइए देखें कि आप कैसे जांचना चाहते हैं कि वर्तमान उपयोगकर्ता के पास इंडेक्स पेज देखने की पहुंच है या नहीं:

class SomeController {
    public function index() {
        $this->denyAccessUnlessGranted('VIEW', '/index');
        // or use some magic method to replace '/index' with wathever you require,
        // like injecting $request->getUri(), just make sure your voter can
        // parse it quickly.

        // ...
    }
}

अब एक बहुत ही साधारण मतदाता का निर्माण करें:

class ViewPageVoter extends Voter
{
    /**
     * @var EntityManagerInterface
     */
    private $em;

    public function __construct(EntityManagerInterface $em) {
      $this->em = $em;
    }

    protected function supports($attribute, $subject)
    {
        return is_string($subject) && substr($subject, 0, 1) === '/';
    }

    protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
    {
      $currentUser = $token->getUser();

      if(!$currentUser) {
        // no user or authentication, deny
        return false;
      }

      // Do the query to see if the user is allowed to view the resource.
      // $this->em->getRepository(...) or
      // $this->em->getConnection()
      // 
      // $attribute = VIEW
      // $subject = '/index'
      // $currentUser = authenticated user
      // return TRUE if allowed, return FALSE if not.
    }
}

एक अच्छे बोनस के रूप में आप उस अनुरोध के /_profiler में सुरक्षा मतदाताओं पर अतिरिक्त विवरण आसानी से देख सकते हैं, साथ ही इस विषय पर उनके संबंधित वोट का संकेत भी दे सकते हैं।

1
Adrian 3 सितंबर 2019, 13:30