2015-08-09 4 views
0

Я создаю приложение AngularJS с остальным API, написанным на PHP как бэкэнд. Это первый раз, когда я использую AngularJS и PHP «вместе».Ограничить операции в restful PHP API

Угловой отслеживает аутентификацию пользователей с помощью модуля ngCookies. Некоторые операции, такие как удаление файлов, должны быть доступны только пользователям с определенными привилегиями. Как я могу убедиться, что «обычные» пользователи или пользователи, которые не вошли в систему, не могут получить доступ к действиям удаления API?

Любые идеи приветствуются.

ответ

1

Вот как я это делаю.

  1. В users таблице БД добавить столбец с именем token VARCHAR(36)
  2. Всякий раз, когда пользователь входит в систему:
  3. обновляю lastlogin колонки
  4. обновление
  5. I, что лексема с MD5($ip.$email.$logindate)
  6. Теперь я возвращаюсь объект пользователя в угловых и угловой знает токен.
  7. В Угловом $http услуга Я добавляю перехватчики и перед тем, как будет сделан запрос Authentication. Я использую базовую аутентификацию. Я создаю строку $user_id.'::'.$token.

    app.factory('authInterceptor', function($rootScope, $q, appConfig, $injector, $cacheFactory) { 
        function request(config) { 
         if(angular.isDefined($rootScope.currentUser.id)) { 
          config.headers.Authorization = 'Basic ' + 
          window.btoa($rootScope.currentUser.id + ':' + 
          $rootScope.currentUser.token); 
         } 
    
         return config; 
        } 
    
        function response(response) { 
         if(angular.isDefined(response.data.code) && parseInt(response.data.code) == 401) { 
          var UserApi = $injector.get('UserApi'); 
    
          UserApi.logout(); 
    
          $cacheFactory.get('$http').removeAll(); 
    
          UserApi.login(response.data.message) 
           .catch(function() { 
            var $state = $injector.get('$state'); 
            $state.go('app.home'); 
           }); 
         } 
    
         return response || $q.when(response); 
        } 
    
        return { 
         request: request, 
         response: response 
        }; 
    }) 
    

Это мой authInterceptor завод, который я вставляю в приложение

app.config(function($httpProvider) { 
    $httpProvider.interceptors.push('authInterceptor'); 
}) 

Что происходит там я поставил стандартный Authentication заголовок для каждого запроса, если пользователь авторизован.

Затем в PHP я получаю этот заголовок. Я получаю идентификатор пользователя и токен отдельно. Затем я использую идентификатор пользователя, чтобы получить данные пользователя из базы данных, где у меня есть токен и дата последнего входа.

Теперь я могу сравнивать маркер и посмотреть, если этот пользователь является тот, кто вошел в систему.

Но это не совсем безопасно. Если кто-нибудь получит этот токен, он сможет войти в систему. Вот почему используется IP. не только я проверяю токен на один в БД, я также проверяю его на IP. Я создаю MD5($ip.$email.$logindate), потому что я знаю все эти данные и проверяю против токена, который я получаю от углового. Если он был отправлен с другого IP-адреса, он не пройдет.

Вы также можете увидеть ответ функции в authInterceptor. Всякий раз, когда у меня есть проблема с аутентификацией, я отправляю обратно код HTTP 401. Теперь в ответ я знаю, что аутентификация завершилась неудачно. Я выхожу из системы и перенаправляю его на домашнюю страницу сайта.

Теперь код очень прост в кодировке. Вы просто возвращаете то, что нужно вернуть, и не заботятся ни о каком аутентифицированном пользователе.

Но есть еще. Если вам нужен какой-то ACL, тогда вы можете спроектировать это, как хотите. В вашем классе, возвращающем определенный метод RESTFull API, вы можете определить свойство $acl и задать имя группы. Там же, где вы проверяете подлинность, вы также можете проверить ACL.

Пожалуйста, смотрите мой код здесь PHP бэкенд и Угловое интерфейс

https://github.com/Coach-Hub

Это основная идея, вы, конечно, можете построить вокруг этого.

+0

Это было вдохновение, которое я искал. Большое спасибо. – KMK

-1

Я не разработчик php. Вы не можете обеспечить эту вещь в интерфейсе. Ниже приведен пример кода, который мы используем в приложении NodeJs, чтобы подтвердить, что пользователь имеет действительное разрешение на удаление или нет.

router.patch('/:id', auth.hasRole(userEnums.roles.admin), controller.update); 
router.post('/create', auth.hasRole(userEnums.roles.admin), controller.create); 
//Checks if the user role meets the minimum requirements of the route 
function hasRole(roleRequired) { 
    if (!roleRequired) throw new Error('Required role needs to be set'); 

    return compose() 
     .use(isAuthenticated()) 
     .use(function meetsRequirements(req, res, next) { 
      if (req.user.role.indexOf(roleRequired) !== -1) { 
       next(); 
      } 
      else { 
       res.send(403); 
      } 
     }); 
} 

Здесь auth.hasRole является простым методом/промежуточным слоем, который представляет собой дизайн Карри узор. Он проверяет использование req и проверяет, имеет ли пользователь действительное разрешение на удаление. В случае, если у пользователя нет разрешения администратора, он возвращается с предупреждением об ошибке. Это для связи с администратором и пользователем. В конце мы также используем другую стратегию для проверки пользователя. Предположим, мы раскрываем наш API удаления, и любой может удалить его. В этом случае мы должны убедиться, что активный пользователь должен быть владельцем документа. В этом случае сначала мы получаем идентификатор владельца документа и сопоставляем его с запрошенным идентификатором пользователя. В случае совпадений мы удаляем документ.

BlogPostApiService.destroy(id, _.curry(hasPermission)(req.user)) 
//hasPermission implementation 
function hasPermission(user, blogPost) { 
    return user && (user.hasRole(UserEnums.roles.admin) || (user._id.toString() == blogPost.author.id.toString())); 
} 
+0

Это совершенно не имеет смысла. Он спросил о бэкэнде PHP, почему вы приводите пример node.js? –

+0

coz это невозможно на стороне клиента. любой может это взломать. Я предлагаю, какую реализацию он может сделать. вместо того, чтобы давать код для копирования. Он должен написать свою собственную логику, а не копировать вставить то, что скопировано из любого места – xdeepakv

+0

Это не копирование/вставка, которую я дал. Это идея. И вопрос был > Как я могу убедиться, что «нормальные» пользователи или пользователи, которые не вошли в систему, не могут получить доступ к действиям удаления API? Так что я думаю, что он имел в виду стороннюю сторону, а не внешнюю сторону. Но на самом деле вопрос заключался в том, как сочетание обоих может решить эту проблему. Во всяком случае, пример Nodejs для парня PHP не имеет значения в любом случае. –

Смежные вопросы