2015-04-16 63 views
5

Sails.js arka ucunda bir açısal uygulama yapıyorum. Bu JWT kimlik doğrulamasını uygulamaya dahil ettim.
https://github.com/Foxandxss/sails-angular-jwt-exampleKöşeli Kimlik Doğrulama - Çoklu kimlik doğrulama düzeyleri

Kimlik doğrulamanın nasıl çalıştığını hala araştırıyorum ve şu anda birden çok yetkilendirme düzeyinin nasıl ekleneceğini anlamaya çalışıyorum. 0 ve 1 ile önceden oluşturulmuş ve bunun üzerinde bir yönetici seviyesi eklemek istiyorum.

Varolan yetkilendirme düzeylerini şu şekilde işler: Her rotaya bir sabit yoluyla bir yetkilendirme düzeyi atanır.

AccessLevels.user sabit anahtar-değer çifti çekilir
$stateProvider 
      .state('user', { 
      abstract: true, 
      template: '<ui-view/>', 
      data: { 
       access: AccessLevels.user 
      } 
      }) 

:

angular.module('app') 
    .constant('AccessLevels', { 
     anon: 0, 
     user: 1 
    }); 

bir rota navigasyon Ne zaman Yani tüm kullanıcı yolları durumdaki veri tesiste atanan bu erişim özelliği olsun Bu, belirli bir rota için erişim seviyesinin ne olduğunu görmek için data.access özelliğini kontrol eder. Kimlik doğrulaması gerektiren bir yol olarak geri dönerse, bir simge için localStorage öğesini denetler. Bir belirteç varsa, rota devam eder, aksi takdirde sizi önler.

authorize: function(access) { //<- 'access' will be whatever is in the data property for that state 
     if (access === AccessLevels.user) { 
      return this.isAuthenticated(); // <- this just grabs the token 
     } else { 
      return true; 
     } 
     } 

Yani ek bir katman eklemek için en basit yolu nedir: İşte

stateChangeStart üzerinde denir işlevdir?
Açıkçası kullanıcı modeline auth_level değeri koymam gerekiyor. Ama sonra ne olacak? Bu işlevselliği eklemenin ve varolan kimlik doğrulamanın bütünlüğünü korumanın en iyi yolu ne olurdu (güvenlik konusunda endişeliyim)?

cevap

1

İlk olarak, Erik Gillespie beni doğru yöne yönlendirdi. Teşekkürler!

İşte benim açısal/yelkenler app kimlik doğrulama ek düzey eklemek için yapmak zorunda bazı noktalar şunlardır:

  • benim kullanıcı modeline bir 'seviye' alan eklemek zorunda kaldı. Kullandığım kimlik doğrulama modülü, anonim kullanıcılar (0) ve düzenli kullanıcılar için ayarlanmış bazı değişkenlere sahipti (1). Şimdi kullanıcı modelim, seviye 1 veya seviye 2 olup olmadığınızı kaydeder.
  • Bazı kimlik doğrulama işlemleri yaparken başvurulan açılandırılmış uygulamadaki bağlantı sabitini güncellemeliydim. Mevcut kullanıcı türleri listesine admin: 2 ekledim.
  • Kullanıcı seviyesini oturum kodlarında saklamak için JWT'mde özel bir hak talep etmek zorunda kaldım. Bu, kullanıcının aslında bir şeyler yapmaya çalıştıklarında (genellikle CRUD) ne dediklerini söyledikleri yetkiye sahip olduğunu teyit etmek için gereklidir. Yetkileri, belirteçlerinde saklanan yetki düzeyine göre kontrol edilir. Yapmam gereken bir sonraki şeye yol açıyor ...
  • İki politika oluşturmam gerekiyordu. Sails, API'nızda ara katman yazılımı oluşturabileceğiniz temiz bir yapılandırma yapısına sahiptir (politikaları çağırır). Politikalar klasörünü, muhtemelen ihtiyaç duyabileceğiniz herhangi bir ara katmanla doldurursunuz. Ardından, yelken yapılandırma klasöründe, her bir denetleyicinin her bir özel işlevine ara katman yazılımı atayabileceğiniz ilgili bir kurallar.js dosyası bulunur. Çok havalı. Bu yüzden, bir kullanıcının kullanıcı olduklarını söyledikleri yetki düzeyini ve yönetici olduklarından emin olmak için bir yönetici (yönetici şeyler yapmaya çalışıyorlarsa) kontrol eden bir ara katman oluşturdum. Daha sonra, kısıtlamak istediğim işlevler için uygun katman yazılımını ekledim.
  • Bir kullanıcı giriş yaptıysa, iki ayrı gösterge panosunun yanı sıra normal kullanıcıların gidemediği bazı sayfalar da var. Yani, yönetici ya da sadece bir kullanıcı olup olmadığını kontrol etmek ve örneğin uygun bir panoya yönlendirmek için açısal kontrol gerekir. Aksine benim navigasyonu ile karmaşa yerine, ben app.run böyle bir işlevi yarattı:
    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
     
          if (toState.url == '/dashboard') { 
     
          var dash = Auth.level(); // <- this is a service I made that checks the users level and returns the appropriate state to go to for that user 
     
          event.preventDefault(); 
     
          $state.go(dash); 
     
          }
    ekledim yolları her kullanıcı türü için uygun bulduğu her ve daha sonra url Doğruya onları iter olduğunu vurduğunda . Rotalarımın hepsinde, onlara erişmek için gerekli seviyeyi belirten bir veri nesnesi vardır. Bu nedenle, kullanıcıların bu bölümlere bile gidebildiklerinden emin olmak için kullanıcı seviyesini kontrol eder. Bu, benzer bir stateChangeStart işleviyle işleniyor.
2

Sunucu tarafından verilen yetkileri tutmak için private claims'u kullanabilirsiniz. Özel hak talepleri, istediğiniz başka herhangi bir veriyi JWT'ye koymanızı sağlar.

Hiç node-jsonwebtoken (hangi sails.js'nin JWTs için kullandığı belirsiz) kullanmamıştım, ancak mevcut olması beklenen değerlere erişmek için doğrudan JWT yüküyle çalışabiliyor gibi görünüyorsunuz. böyle bir şey yapabileceğini:

// Assign authorization on server after successful authentication of an admin 
token.auth = AccessLevels.admin; 

// Read authorization on client 
authorize: function(access) { 
    if (access === AccessLevels.anon) { 
     return true; 
    } 
    // Assumes the JWT token is returned by isAuthenticated() 
    // (Sorry, not familiar with Sails.js or the JWT example) 
    return this.isAuthenticated().auth === access; 
} 

kimlik doğrulama sonra, herhangi müteakip isteği muhtemelen sağlanan örnekte için "tokenAuth" benzer bir ekleme politikasını ekleyerek, hem de kullanıcının yetki doğrulaması gerekir, ama bu auth iddiayı doğrular Sağlanan JWT'de, çağrılmak üzere olan herhangi bir işlevi çağırmak için gereken yetki ile eşleşir.

+0

Bu nedenle sunucu tarafı yetkilendirme denetleyicisinin, başarılı oturum açmada kullanıcı nesnesini ve bir belirteç anahtar/değer çiftini geri gönderdiğini görüyorum. Simge, '{sid: user.id} 'yük yükü ile işaret yönteminin değerini içerir. Sadece bunu {sid: user.id, auth_level: user.auth_level} 'olarak değiştirebileceğimi mi söylüyorsunuz? – tpie

+0

Yep. Bir JWT'nin iddiaları temel olarak bir haritadır ve JWT belirli belirli anahtar/değer çiftlerini (iss, sub, aud, exp, nbf, iat, jti) tanımlamakta, ancak diğer üretici/tüketici tanımlı iddiaların eklenmesine de izin vermektedir. Çoğu kitaplık, keyfi hak taleplerini de eklemeyi destekler ve JavaScript ile, hak talepleri genellikle değer eklemeye ve atamaya başlayabileceğiniz bir haritadır. –