2015-10-18 5 views
17

मैं सॉकेट.यो की चैट के साथ थोड़ा सा खेल रहा हूं, और मेरे पास एक सवाल है: मैं एक व्यवस्थापक उपयोगकर्ता और नियमित उपयोगकर्ता के बीच अंतर कैसे कर सकता हूं गपशप करने का कमरा? मैं चाहता हूं कि व्यवस्थापक को लात मारने और लोगों पर प्रतिबंध लगाने जैसी शक्तियां हों, लेकिन मेरे उपयोगकर्ता नहीं।socket.io चैट में सिम्फनी उपयोगकर्ता भूमिकाओं/समूहों के बीच अंतर कैसे करें

मैं अपने आवेदन को विकसित करने के लिए सिम्फनी का उपयोग कर रहा हूं, और मैं चैट उपयोगकर्ताओं के लिए अपने उपयोगकर्ता डेटाबेस का उपयोग करना चाहता हूं। मैं अपने सिम्फनी ऐप के उपयोगकर्ताओं के लिए FOSUserBundle का उपयोग कर रहा हूं। वे कई समूहों में विभाजित हैं, इसलिए मेरे पास admin समूह है, और अन्य।

admin समूह में ROLE_ADMIN है जिसका अर्थ है कि इसके अंदर प्रत्येक उपयोगकर्ता की भूमिका है। यह व्यवस्थापक समूह है और इस समूह के प्रत्येक उपयोगकर्ता को चैट रूम में अन्य उपयोगकर्ताओं को प्रतिबंध, किक, म्यूट आदि की अनुमति होनी चाहिए।

चैट में मेरे सिम्फनी उपयोगकर्ताओं का उपयोग करने के लिए, मैं अपने सत्र प्राप्त करने के लिए रेडिस में पढ़ रहा हूं, लेकिन मुझे बिल्कुल यकीन नहीं है कि मेरे व्यवस्थापक उपयोगकर्ताओं और नियमित उपयोगकर्ताओं के बीच अंतर कैसे बनाया जाए। मैं नियमित उपयोगकर्ता को सर्वर से अनुरोध करने से कैसे रोक सकता हूं जो ऐसा कुछ करता है जिसके उपयोगकर्ता के पास पहुंच नहीं है? क्योंकि कोई भी अनुरोध कर सकता है, लेकिन मैं उन अनुरोधों को कैसे सत्यापित कर सकता हूं यदि वे अपाचे सर्वर पर MySQL डेटाबेस में संग्रहीत उपयोगकर्ताओं से आते हैं?

यदि सिम्फनी के लिए नहीं है, तो यह नियमित PHP एप्लिकेशन में कैसे किया जा सकता है? अंत में, इससे कोई फ़र्क नहीं पड़ता कि व्यवस्थापक को कैसे परिभाषित किया गया है, लेकिन उसे नोड सर्वर से कैसे कनेक्ट करें और नोड सर्वर को मेरे उपयोगकर्ता डेटाबेस के साथ कैसे काम करें।

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

+0

शायद http://stackoverflow.com/questions/26176359/socket-io-connect-role- प्रमाणीकरण – pregmatch

+0

डुप्लिकेट नहीं हो सकता है। यह सवाल बहुत विशिष्ट है। – Bogdan

उत्तर

3

मुझे उपयोगकर्ता के डेटा को नोड सर्वर पर एन्क्रिप्ट करने और भेजने का विचार था, फिर उसे वहां डिक्रिप्ट करें। केवल दो सर्वर निजी कुंजी जानते हैं, इसलिए यदि ग्राहक को एन्क्रिप्टेड डेटा पर हाथ मिल जाता है, तो वह किसी अन्य क्लाइंट के लिए इसके साथ अनुरोध नहीं कर सकता है।

यह मूल विचार है।

मैं यह कैसे करूँगा? मैं जेडब्ल्यूटी की तरह कुछ उपयोग करता हूं ताकि उपयोगकर्ता को नोड एप्लिकेशन में भेज सकें। एन्क्रिप्टेड नहीं होना चाहिए, क्योंकि मुझे यह सुनिश्चित करने के लिए केवल वास्तविक उपयोगकर्ता द्वारा अनुरोध जारी किया गया था, यह सुनिश्चित करने के लिए केवल jwt हस्ताक्षर की परवाह है।

उसके बाद, उपयोगकर्ता आईडी का उपयोग करके मैं सर्वर पक्ष उपयोगकर्ता की भूमिकाओं की जांच करने के लिए php एप्लिकेशन पर कॉल करूंगा।

विस्तार से बता दें:

  • नोड एप्लिकेशन और php एप्लिकेशन जेडब्ल्यूटी टोकन हस्ताक्षर करने के लिए एक साझा रहस्य का प्रयोग करेंगे।
  • PHP एप्लिकेशन जेनरेट किए गए टोकन को फ्रंटेंड पर उजागर करेगा।
  • सॉकेट.ओ क्लाइंट नोड ऐप को प्रमाणीकरण के हिस्से के रूप में टोकन भेज देगा।

  • पर प्रतिबंध लगाने को संभालने के लिए कैसे NodeJS आवेदन जो php आवेदन से "प्रतिबंध" अनुरोध hanlde कर सकते हैं में एक वेब सेवा समाप्ति बिंदु बनाने के अपने प्रयोक्ता आईडी
  • के साथ खोला सॉकेट की एक सूची रखने के लिए।
  • जब ऐसा अनुरोध नोडजेस एप्लिकेशन द्वारा प्राप्त होता है, तो उपयोगकर्ता आईडी के आधार पर सॉकेट को देखो और कनेक्शन बंद करें।
+0

यूप, हमने पाया कि वेब टोकन का उपयोग करने का तरीका है। –

3

मैं आम तौर पर voters कॉल के साथ उपयोगकर्ता की भूमिकाओं की जांच करने के लिए SecurityAccessManager सेवा बनाता हूं (यदि आवश्यक हो तो मैं इस विशिष्ट पोस्ट को अपडेट कर सकता हूं "जैसे विशिष्ट अधिकारों की जांच के लिए मैं एक उदाहरण प्रदान कर सकता हूं?

कॉन्फ़िग

company.navigation.security_access: 
    class: Company\NavigationBundle\Services\SecurityAccessManager 
    arguments: 
     - @security.authorization_checker    
     - @security.token_storage 

सेवा कोड

namespace Company\NavigationBundle\Services; 
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 

class SecurityAccessManager 
{ 
    private $authorizationChecker; 
    private $tokenStorage; 
    private $debug; 

    public function __construct(
      AuthorizationCheckerInterface $authorizationChecker, 
      TokenStorage $tokenStorage) 
    {  
     $this->authorizationChecker = $authorizationChecker; 
     $this->tokenStorage = $tokenStorage; 
     $this->debug = true; 
    } 

    // ************************************************************************* 
    // User 
    // ************************************************************************* 

    public function getUser() 
    { 
     return $this->tokenStorage->getToken()->getUser();   
    } 

    public function getUserId() 
    { 
     return $this->tokenStorage->getToken()->getUser()->getId();   
    } 

    public function isAuthenticatedUser() 
    {  
     return $this->authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED'); 
    }  

    // ************************************************************************* 
    // Roles checker 
    // ************************************************************************* 

    public function isAdmin() 
    { 
     if($this->authorizationChecker->isGranted('ROLE_ADMIN') !== true) { 
      return false; 
     } else { 
      return true;   
     } 
    }  

    public function checkRightAdmin() 
    { 
     if($this->authorizationChecker->isGranted('ROLE_ADMIN') !== true) { 
      throw new AccessDeniedException('Unauthorised access! '.($this->debug ? __FUNCTION__ : null)); 
     } 

     return true;   
    } 

    public function checkUserHasRightToEditPost($postId) 
    { 
     // Check if user has right to modify the post 
     if ($this->authorizationChecker->isGranted('is_user_has_right_to_edit_post', $postId) === false) { 
      throw new AccessDeniedException('Unauthorised access! '.($this->debug ? __FUNCTION__ : null)); 
     } 

     return true; 
    } 
} 

फिर, अपने नियंत्रक कार्यों में, आप जाँच कर सकते हैं उपयोगकर्ता के अधिकारों

namespace Company\YourBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class YourBunbleController extends Controller 
{ 
    /** 
    * Get the service 
    * @return \Company\NavigationBundle\Services\SecurityAccessManager 
    */ 
    private function getService() 
    {   
     return $this->get('company.navigation.security_access'); 
    } 

    public function updatePostAction(Request $request, $postId) 
    { 
     // Throw 403 if user has no admin rights 
     $this->getService()->checkRightAdmin(); 

     // Throw 403 if user has no rights to update the post 
     $this->getService()->checkUserHasRightToEditPost(); 

     //OK, you can update database 
     ... 
    } 
} 
+0

यह वास्तव में एक अच्छी तरह से स्वरूपित उत्तर है, लेकिन यह मेरी समस्या का समाधान नहीं करता है। मैंने पहले से ही अनुमतियों की जांच करने के लिए मतदाता बना दिया है, और मैं उपयोगकर्ता ROLE भी देख सकता हूं, या मैं समूह की जांच कर सकता हूं। मेरी समस्या यह थी कि इन भूमिकाओं को node.js सर्वर पर कैसे पास किया जाए, इसलिए चैट रूम पर इसका नियंत्रण होता है। और नोड और मेरे mysql डेटाबेस पर वही उपयोगकर्ता कैसे हैं। उदाहरण के लिए, व्यवस्थापक कुछ उपयोगकर्ताओं तक पहुंच कैसे प्रतिबंधित करेगा? –

+0

प्रतिबंध लगाने से सॉकेट कनेक्शन को तुरंत बंद करना चाहिए, इसलिए नोड को किसी भी तरह डेटाबेस के साथ संबंध होना चाहिए और सिम्फनी ऐप के साथ समानांतर में काम करना चाहिए। –

संबंधित मुद्दे