@lafka/rights
Version:
Rights service for LAFka
95 lines (71 loc) • 4.05 kB
Markdown
# Битовая система прав (БСП)
## Для тех, кто будет работать на прямую
### Как работает?
- Биты не повторяются в правах, так что каждое право имеет уникальное значение: 1, 2, 4, 8, 16...
- Биты сверяются оператором И (`&`) и если получается, что биты пересекаются, то права имеются, иначе нет
### Почему права — степень двух?
- БСП использует бинарную систему, состоящая из единицы и нуля
- Так получается, что мы используем все числа в бинарной, начиная с единицы (ноль — отсутствие прав)
- Так как для каждого право нужно рассчитать уникальное число, которое не будет препятствовать другим правам, нам нужно брать следующие битовое число
- Скажем, что `00001` (один в десятичное) — наше первое право, тогда следующим будет `00010` (Два в десятичное). Тогда пересечение этих прав образует `00011` — такие права у нас имеются. Чтобы проверить, имеется ли у нас первое право, нужно использовать оператор `&`: `00011` & `00001`, тогда у нас получится `00001`, означающее, что право у нас имеется, на языке программирования JavaScript это будет выглядеть следующим образом:
```js
const userRights = 0x00001 // Допустим, что тут объявлены наши права
/**
* @param bit bit of permisson, what we want to checks
* @return {boolean}
*/
function hasPermission(bit) {
return (userRights & bit) === bitж
}
```
- Мы сравниваем `userRights & bit` с `bit` для того, чтобы получить `boolean`-ответ
### Справочная информация
- Язык почти не важен!
- [Битовые поля c++](https://learn.microsoft.com/ru-ru/cpp/cpp/cpp-bit-fields)
- [Битовые поля Википедия](https://en.wikipedia.org/wiki/Bit_field)
- [Битовые поля JavaScript](https://emergent.systems/posts/bit-fields/)
## Для тех, кто будет работать косвенно (через API, библиотеку или другие системы)
- Используйте `has`, чтобы проверить, имеются ли определенные права у пользователя с чем-либо
- UserService
```js
import { UserService } from "@lafka/rights";
(async() => {
const { data: fockusty } = await (await fetch(api_url + "/users/", {headers})).json();
new UserService(fockusty).has({
right: "me",
rights: ["POSTS_CREATE"] // equalt rights: "POSTS_CREATE"
}); // boolean
new UserService(fockusty).has({
right: "users",
rights: {
"123": ["MANAGE", "MODERATE", "READ"],
"321": ["READ"],
"666": "MODERATE",
}
}) // { "123": boolean, "321": boolean "666": boolean };
})();
```
- PostService
```js
import { PostService } from "@lafka/rights";
(async() => {
// const fockusty: LAFka.User;
const { data: post } = (await (await fetch(api_url + "posts/" + myCoolPostId, {headers})).json());
new PostService(post).has({
rights: "VIEW",
userId: fockusty.id
}); // boolean
new PostService(post).has({
rights: "DELETE",
userId: fockusty.id
}); // boolean
new PostService(post).has({
rights: "OWNER",
userId: "2"
}); // boolean
new PostService(post).has({
rights: ["VIEW", "REACT", "COMMENTS_READ"],
userId: "4"
}); // boolean
})()
```