2015-04-13 3 views
0

Мое приложение использует AngularJs в качестве интерфейсного фреймворка и NodeJs, ExpressJs, как базовую инфраструктуру. Они могут связываться друг с другом с помощью службы RESTful. Приложение позволяет пользователю иметь возможность вручную создавать новую роль с настраиваемыми доступными системами для этой роли.Как проверить авторизацию для RESTful api?

Всякий раз, когда запрос http-запроса, сделанный AngularJs, GET/POST/PUT/DELETE, необходимо проверить, имеет ли текущий пользователь роль, содержащую требуемые подсистемы или нет.

app.post('/api/v1/budgets/upsert', auth.requiresLogin, auth.requiresRoleSubSystem([10, 11, 12, 13]), budgetCtrl.upsertBudget); 
// to access this api link, user need to have role contained at least one of a system in the array [10, 11, 12, 13] 

Как вы можете видеть, у меня есть промежуточное программное обеспечение, auth.requiresRoleSubSystem(subSystemIds), чтобы сделать это. Он работает без каких-либо проблем, однако я должен вручную установить массив идентификаторов подсистем, необходимых для доступа к каждой ссылке api.

Это очень расстроило и было бы сложно, если бы изменился идентификатор подсистемы. Я думал о некоторых возможных решениях, но все решения практически одинаковы, их необходимо настроить вручную. Любые предложения будут действительно оценены.

+0

Можете ли вы попробовать перехватчик $ http? Например: http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/, поместите свою логику в перехватчик – ABOS

+0

Благодаря @ABOS, это очень полезно для стороннего интерфейса. Тем не менее, мне все же приходится вручную проверять авторизацию на внутренней стороне, как я описал в своем вопросе. – lvarayut

ответ

0

Почему вы не используете константы вместо идентификационных номеров? Таким образом, вы можете легко изменить идентификаторы в одном файле конфигурации. Вы даже можете создать этот файл конфигурации на сервере.

Afaik. app.post - это запрос от клиента на сервер, поэтому это код на стороне клиента. Клиентский код не должен содержать логики аутентификации. Услуги REST возвращают только авторизованные ссылки. Я предполагаю, что вы создаете традиционную веб-приложение на основе JSON вместо службы REST.

+0

Спасибо за ваш ответ. Не могли бы вы объяснить, какие константы следует использовать вместо идентификационных номеров? Фактически, «app.post» находится на стороне сервера, сидит на маршруте Express, который слушает запрос, сделанный с клиентской стороны, и проверяет авторизацию перед выполнением каких-либо действий. – lvarayut

+0

@LVarayut Ох, тогда эта часть в порядке. Я бы использовал центральный объект роли '{editor: 10, admin: 11, ...}' и использовал 'auth.requiresRoleSubSystem ([role.admin, role.editor, ...])'. Поэтому при изменении идентификатора вы должны изменить только один файл. Еще одно усовершенствование, чтобы дать уникальное имя каждой из ролей и создать объект ролей с использованием базы данных: '{name: id}'. Дальнейшее усовершенствование для хранения конечной точки - требуемые записи Roles в базе данных и изменение их с админ-страниц, но это обычно не является обязательным требованием. – inf3rno

+0

Я думаю, что ваше предложение будет работать в случае, если роли были предопределены и никогда не были бы изменены. Однако в моем случае пользователь имеет возможность вручную добавить новую роль и выбрать, какие системы должны быть разрешены для конкретной роли.Другими словами, '{editor: 10, admin: 11, ...}' будет установлен пользователем. Таким образом, на маршруте Express я не могу поместить 'auth.requiresRoleSubSystem ([role.admin, role.editor, ...])', потому что я никогда не узнаю, каково имя роли, введенной пользователем, ' admin', editor и т. д. – lvarayut

0

Просто добавьте в коллекцию Role код, как @ inf3rno сказал:

var Role = new Schema({ 
code: {type: String, index:true}, 
name: String, 
data: {}, 
active: boolean 
}); 

Таким образом, код индексированный строковая константа (например, ROLE01), и тогда вы сможете сопоставить это значение во всей вашей системе, несмотря на _id, меняется.

Например, если пользователь кажется, что это:

User { 
name: String, 
roles: [role._id] 
} 

Просто попытайтесь сохранить его как это:

User { 
name: String, 
roles: [role.code] 
} 

Надеется, что это помогает !!

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