Как правильно сделать модель юзеров с ролями? Есть ли примеры/практики авторизации с ролями?

К примеру, есть модель User

const userSchema =  new mongoose.Schema ({
  email: {
    type: String,
    unique: true,
    required: true,
    trim: true
  },
  password: {
    type: String,
    required: true
  },
  username: {
    type: String,
    unique: true
  },
  firstName: String,
  lastName: String,
  createdAt: {
    type: Date,
    default: Date.now
  }
})


Различные туториалы и статьи покрывают лишь базовую ауторизацию, и совершенно не касаются такой темы как роли пользователей. А мне надо, к примеру, админы и просто пользователи.

Я конечно могу добавить просто это

role: {
    type :String,
    default: 'reader'
  }


И просто в строку писать admin или reader. Но это выглядит слишком примитивно. и я уверен что есть некие практики как должно все быть устроено. Дайте пожуйста ссылку или расскажите как надо?
  • Вопрос задан
  • 692 просмотра
Пригласить эксперта
Ответы на вопрос 3
planc
@planc
const ADMIN = 0b11111111

const CAN_DELETE = 0b00001000
const CAN_EDIT =   0b00000100
const CAN_WRITE =  0b00000010
const CAN_READ =   0b00000001

const REGULAR_USER = CAN_WRITE | CAN_READ
const ANONYMOUS = CAN_READ
const BANNED = 0b0

const MODERATOR = REGULAR_USER | CAN_EDIT | CAN_DELETE

class User {
  constructor(name, mask) {
    this.name = name;
    this.mask = mask;
  }
}


const users = [
  new User('admin', ADMIN),
  new User('moder', MODERATOR),
  new User('regular_user', REGULAR_USER),
  new User('anon', ANONYMOUS),
]


users.forEach( u => {
  console.log(u.name);
  if ((u.mask & ADMIN) === ADMIN) {
    console.log('\t ADMIN');
  }
  if ((u.mask & MODERATOR) === MODERATOR) {
    console.log('\t MODERATOR');
  }
  if ((u.mask & REGULAR_USER) === REGULAR_USER) {
    console.log('\t REGULAR_USER');
  }
  if ((u.mask & CAN_EDIT) === CAN_EDIT) {
    console.log('\t CAN_EDIT');
  }
  if ((u.mask & CAN_DELETE) === CAN_DELETE) {
    console.log('\t CAN_DELETE');
  }
  if ((u.mask & CAN_WRITE) === CAN_WRITE) {
    console.log('\t CAN_WRITE');
  }
  if ((u.mask & CAN_READ) === CAN_READ) {
    console.log('\t CAN_READ');
  }
});


admin
	 ADMIN
	 MODERATOR
	 REGULAR_USER
	 CAN_EDIT
	 CAN_DELETE
	 CAN_WRITE
	 CAN_READ
moder
	 MODERATOR
	 REGULAR_USER
	 CAN_EDIT
	 CAN_DELETE
	 CAN_WRITE
	 CAN_READ
regular_user
	 REGULAR_USER
	 CAN_WRITE
	 CAN_READ
anon
	 CAN_READ
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
Комментировать
@ru-soft
https://aspnetboilerplate.com/ Пример реализации и документация Для Node.Js можно позаимствовать структуру моделей и логику проверки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы