2014-11-18 3 views
9

मान लें कि मेरे पास 4 मार्ग हैं - 2 को उपयोगकर्ता को लॉग इन करने की आवश्यकता है, 2 नहीं। मेरा ऐप init लगता है:मार्गप्रदाता के साथ कोणीय में एक मार्ग लॉन्च करने से पहले मैं लॉगिन या अन्य स्थिति की जांच कैसे करूं?

 $routeProvider.when('/open1',{templateUrl:'/open1.html',controller:'Open1'}); 
     $routeProvider.when('/open2',{templateUrl:'/open2.html',controller:'Open2'}); 
     $routeProvider.when('/secure1',{templateUrl:'/secure1.html',controller:'Secure1'}); 
     $routeProvider.when('/secure2',{templateUrl:'/secure2.html',controller:'Secure2'}); 

मार्गों /open1 और /open2 सभी के लिए खुले हैं, जबकि मार्गों /secure1 और /secure2 उपयोगकर्ता की आवश्यकता में लॉग इन करने और, अगर नहीं, कुछ कार्रवाई करते हैं, जैसे कि लॉगिन करने या चेतावनी लॉन्च करने के लिए रीडायरेक्ट करें। मैं अपने Auth सेवा और कॉलिंग का उपयोग करके उपयोगकर्ता का राज्य निर्धारित कर सकता हूं, उदाहरण के लिए, Auth.isLogin()। तो परिणाम होगा:

  • /open1 और /open2 के लिए जा रहा हमेशा टेम्पलेट और नियंत्रक ऊपर
  • घोषित करने के लिए जाना है, तो Auth.isLogin() रिटर्न सच है, /secure1 और /secure2 ऊपर घोषित टेम्पलेट और नियंत्रक
  • यदि करने के लिए जाना Auth.isLogin() झूठा रिटर्न, /secure1 और /secure2 कुछ अन्य कार्यवाही करें, उदाहरण के लिए $location.path('/login')

मैं सकता Secure1 और Secure2 नियंत्रकों कि जाँच करता है में डाल तर्क है, लेकिन यह दोहराव है और जिम्मेदारियों अप मिक्स, उन्हें कठिन परीक्षण करने के लिए बनाता है, आदि

वहाँ एक रास्ता है कि मैं कर सकता है घोषित करने के लिए $routeProvider का उपयोग करें, "इस मार्ग और इस मार्ग की जांच करें और यदि नहीं, तो पुनर्निर्देशित करें"? मैं किसी भी तरह resolve का उपयोग करने के बारे में सोच रहा था, लेकिन यह सुनिश्चित नहीं है कि इसे कैसे काम किया जाए (resolve पर दस्तावेज़ बहुत स्पष्ट नहीं हैं, और कुछ उपयोगी उदाहरण हैं)।

संपादित करें:

नीचे उत्तरों के आधार पर, ऐसा लगता है ऐसा करने के लिए तीन दर्शन देखते हैं:

दूसरा विकल्प दो उत्तरदाताओं ने सुझाव दिया है।

उत्तर

12

ऊपर मेरी टिप्पणी के रूप में में उपयोग है, वहाँ 3 अलग अलग रास्तों (प्लस की क्षमता हैं यदि आप एचटीएमएल टेम्पलेट्स से इसे नियंत्रित करना चाहते हैं तो निर्देश का उपयोग करने के लिए)।

$routeProvider.when('/secure', { 
    templateUrl: '/secure.html', 
    controller: 'Secure', 
    resolve:{ 
     loggedIn:onlyLoggedIn 
    } 
}); 

और फिर onlyLoggedIn:

var onlyLoggedIn = function ($location,$q,Auth) { 
    var deferred = $q.defer(); 
    if (Auth.isLogin()) { 
     deferred.resolve(); 
    } else { 
     deferred.reject(); 
     $location.url('/login'); 
    } 
    return deferred.promise; 
}; 

सरल, एक आकर्षण की तरह काम करता रहा

https://midgetontoes.com/angularjs-check-user-login/

जो अनिवार्य रूप से किया जाता है इस प्रकार निम्नलिखित समाप्त हो गया। अगर मुझे कभी निर्देश की आवश्यकता है, तो मैं इस टुकड़े को एक सेवा में खींच दूंगा।

+0

क्या आप कृपया बता सकते हैं कि var onlyLoggedIn कहां रखा जाए, जैसे कि किस दायरे में? मैं इसके लिए बहुत नया हूँ। @deitch –

+0

@AayushKumarSingha मैं इसे अपने app.js में स्थानीय चर के रूप में घोषित करता हूं और फिर इसे अपने '$ रूटप्रदाता 'में संदर्भित करता हूं। लेकिन यह कहीं भी आप चाहते हैं, क्योंकि आप हमेशा '() 'की आवश्यकता हो सकती है या अन्यथा इसे शामिल कर सकते हैं। – deitch

+6

आपका यूआरएल मर चुका है – Denny

2

मैं एक ही समस्या थी और मैं इसे इस तरह से किया था:

var app = angular.module('myModule',["ui-bootstrap"]); 

और फिर अनुप्रयोग में एक locationchange के लिए सुन (यह भी एक पेज के onEnter ट्रिगर किया जाएगा)

app.run(function ($rootScope, $location, $cookieStore) { 
$rootScope.$on("$locationChangeStart", function (event, next, current) { 
    //Here you can check whatever you want (servercall, cookie...) 
}); 
} 

मैं उम्मीद है की यह मदद करेगा!

+0

यह एक बुरी योजना नहीं है, लेकिन फिर मैं ईवेंट हैंडलर में मार्ग प्रति तर्क जोड़ने की जरूरत है, और कैसे मैं चलने से एक विशेष मार्ग बंद कर देंगे? – deitch

+0

मैंने 'थ्रो "रोक निष्पादन जोड़ा";' जो सभी जावास्क्रिप्ट गतिविधि को रोक देगा। और एक लॉगिन पेज पर एक रीडायरेक्ट किया। फ़ंक्शन में मैं जांचता हूं कि $ location.path == "/ signin"; –

+0

मुझे लगता है कि यह काम करेगा। क्या '$ रूटप्रोवाइडर' के अंदर कुछ भी नहीं है जो मदद कर सकता है? – deitch

4

This blog post निर्देशों का उपयोग करके AngularJS में उपयोगकर्ता प्रमाणीकरण के साथ सौदा करता है।

$ रूट सेवा रूट मार्ग से पहले $ रूट चेंजस्टार्ट उत्सर्जित करती है।

आप निर्देशों का उपयोग नहीं करते हैं, तो आप (आप कोड के बाद यह जगह कर सकते हैं जहां मार्गों [app.config] को परिभाषित) app.run फोन करके उस घटना पकड़ कर सकते हैं। उदाहरण के लिए:

पूर्ण प्रकटीकरण के लिए मैं ui.router का उपयोग करें और इस $stateChangeStart से एक अनुकूलित कोड मैं अपने ऐप

var app = angular.module('app'); 

app.config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/open1',{templateUrl:'/open1.html',controller:'Open1'}); 
    $routeProvider.when('/open2',{templateUrl:'/open2.html',controller:'Open2'}); 
    $routeProvider.when('/secure1',{templateUrl:'/secure1.html',controller:'Secure1'}); 
    $routeProvider.when('/secure2',{templateUrl:'/secure2.html',controller:'Secure2'}); 
}]); 

app.run(['$rootScope', '$location', 'Auth', function($rootScope, $location, Auth) { 
    $rootScope.$on('$routeChangeStart', function(event, currRoute, prevRoute){ 
     var logged = Auth.isLogin(); 

     //check if the user is going to the login page 
     // i use ui.route so not exactly sure about this one but you get the picture 
     var appTo = currRoute.path.indexOf('/secure') !== -1; 

     if(appTo && !logged) { 
      event.preventDefault(); 
      $location.path('/login'); 
     } 
    }); 
}]); 
+0

तो मैं निरंतरता को पकड़ने और रोकने के लिए '$ रूट चेंजस्टार्ट 'ईवेंट का उपयोग कर सकता हूं? मुझे अभी भी पथ जानने की आवश्यकता होगी, और अगर मैं कर सकता हूं, तो '$ रूटप्रोवाइडर.हेन()' में ऐसा करना पसंद करेंगे, लेकिन यह काम करेगा। यह नीचे @JasonvanderZeeuw उत्तर के समान है। मैं ब्लॉग पोस्ट पढ़ूंगा, धन्यवाद – deitch

+0

@deitch मैं [AngularUI राउटर] (http://angular-ui.github.io/ui-router/site/) की सिफारिश करता हूं क्योंकि यह यूआरएल के बजाय राज्यों का उपयोग करता है। उदाहरण के लिए, राज्य _secure.report_ या _secure.list_ हो सकता है जबकि यूआरएल _/report_ या _/list_ होगा, तो आप केवल जांच करेंगे कि नाम में _secure_ है, सही लिंक जानने के बिना – vjancic

+0

मैं इसे देखूंगा ब्लॉग पोस्ट पढ़ने के बाद बाहर। – deitch

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