2016-09-06 3 views
1

Я создаю приложение Sails.js, которое включает логин пользователя. Как инструктирует документация, когда пользователь входит в, сессионный записывает ее идентификатор в сессии соответственно:Безопасно хранить полную информацию о пользователе в сеансе с Sails.js?

req.session.userId = createdUser.id; 

В большинстве примеров, каждый маршрут выполняет поиск по этому ID, если он присутствует, и посылает аутентифицированный пользователь, если он найден. Это кажется мне очень неэффективным. КАЖДЫЙ вид должен знать, есть ли пользователь с подписью, чтобы отобразить ее имя в верхнем левом углу. Поэтому, если я правильно понимаю, каждое представление включает в себя поездку в базу данных для поиска пользователя, даже если я уменьшу количество кода, создав политику, которая выполняет этот поиск для каждого маршрута.

То, что я предпочел бы сделать это записывать информацию пользователя в сессии, с тем, что после того, как она проходит проверку подлинности, эта информация автоматически присутствует в каждом виде:

req.session.userId = createdUser.id; 
createdUser.loggedIn = true; 
req.session.user = createdUser; 
// the createdUser object does NOT contain the encrypted password or other sensitive info 

Это то позволяет мне просто проверить в шаблон для такого пользователя с подписью из родительского шаблона layout (и любого дочернего шаблона). (Я использую виды на стороне сервера.)

{% if (session.user && session.user.loggedIn) %} 
<li><a href="/profile/{{ session.user.id }}">Hi there, {{ session.user.username }}</a></li> 
{% else %} 
<li><a href="/signin">Sign In (if you want)</a></li> 
{% endif %} 

Мой вопрос заключается в том, создает ли это риск безопасности любого рода. Кажется МНОГО более эффективным, чем поиск пользователя во всех представлениях, но, возможно, есть причина, по которой документация, похоже, советует это?

ответ

2

В большинстве примеров, каждый маршрут выполняет поиск по этому ID, если он присутствует, и посылает аутентифицированного пользователя к просмотру, если найден

FYI, в идеале это должно быть обработано политика.

Это кажется мне очень неэффективным. КАЖДЫЙ вид должен знать, есть ли у пользователь с подписью, чтобы отобразить ее имя в верхнем в левом углу. Итак, если я правильно понимаю, каждое представление включает в себя отправку базы данных для поиска пользователя, даже если я уменьшу количество кода , создав политику, которая выполняет этот поиск для каждого маршрута.

Либо вы делаете дополнительные круговые поездки в базу данных, либо раздуваете свои сеансы. Оба имеют свои плюсы и минусы. Например. при создании бэкэнд-приложения, которое не нужно масштабировать, я не забочусь об этом дополнительном поиске базы данных. Однако, когда у меня есть сотни тысяч пользователей, я должен заботиться. Вы должны это учитывать, когда архитектор приложения. Приложения, которые необходимо масштабировать, например, для использования, например. redis в качестве хранилища сеансов для оптимизации.

Итак, чтобы ответить на ваш вопрос, да, в хранилище можно сохранить имя пользователя и т. Д., Чтобы избежать дополнительных запросов к базам данных. Я не эксперт по безопасности, но я бы не предлагал хранить конфиденциальную информацию пользователя в сеансе, как пароли.

BTW Я настоятельно рекомендую использовать http://passportjs.org/. Он очень хорошо сочетается с парусами.

Для начала:

  1. http://iliketomatoes.com/implement-passport-js-authentication-with-sails-js-0-10-2/
  2. https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

В этом примере вы можете увидеть, как имя пользователя, адрес электронной почты и роли пользователя сохраняются в объекте сеанса:

passport.serializeUser(function(user, done) { 
    var sessionUser = { _id: user._id, name: user.name, email: user.email, roles: user.roles } 
    done(null, sessionUser); 
}); 
+0

Только что мне нужно - спасибо! –

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