@vGrabko99
html, css, js, php, golang, mysql

Правильно ли я делаю таблицу с правами?

Привет. Есть задача.
Надо назначить права. При вызове метода API я тащу поле с таблицы и смотрю если 0 то доступ закрыт. Если 1 то всё ок.
Собственно таблица
type UseApi struct {
	KeyId           int    `sql:"AUTO_INCREMENT"                gorm:"primary_key"`
	ApiKey          string `sql:"type:varchar(13)   ;not null"  gorm:"unique_index"`
	ApiAuthRedirekt string `sql:"type:varchar(100)  ;not null"`

	//0 прав нет 1 права есть
	RightsAuth                         int `sql:"type:varchar(1)    ;not null"`
	RightsRegs                         int `sql:"type:varchar(1)    ;not null"`
	RightsBattlesInvasion              int `sql:"type:varchar(1)    ;not null"` //война
	RightsBattlesSanctions             int `sql:"type:varchar(1)    ;not null"`
	RightsBattlesGround                int `sql:"type:varchar(1)    ;not null"`
	RightsMissionsLocation             int `sql:"type:varchar(1)    ;not null"` //мисии
	RightsMissionsHq                   int `sql:"type:varchar(1)    ;not null"`
	RightsUnitsMarket                  int `sql:"type:varchar(1)    ;not null"` //Магазин техники
	RightsBlackmarketMercenaries       int `sql:"type:varchar(1)    ;not null"` //чёрный рынок
	RightsBlackmarketSaboteurs         int `sql:"type:varchar(1)    ;not null"`
	RightsBlackmarketLaboratory        int `sql:"type:varchar(1)    ;not null"`
	RightsBlackmarketContraband        int `sql:"type:varchar(1)    ;not null"`
	RightsBlackmarketDocuments         int `sql:"type:varchar(1)    ;not null"`
	RightsBlackmarketAuction           int `sql:"type:varchar(1)    ;not null"` //Производство
	RightsManufacturingFactory         int `sql:"type:varchar(1)    ;not null"`
	RightsManufacturingMines           int `sql:"type:varchar(1)    ;not null"`
	RightsManufacturingRockets         int `sql:"type:varchar(1)    ;not null"`
	RightsBuildingsProfitable          int `sql:"type:varchar(1)    ;not null"` //постройки
	RightsBuildingsDefense             int `sql:"type:varchar(1)    ;not null"`
	RightsBuildingsEnergy              int `sql:"type:varchar(1)    ;not null"`
	RightsOfficersclubResling          int `sql:"type:varchar(1)    ;not null"` //клуб офицеров
	RightsOfficersclubRoulette         int `sql:"type:varchar(1)    ;not null"`
	RightsOfficersclubSpyInterrogation int `sql:"type:varchar(1)    ;not null"`
	RightsOfficersclubVeteransRiddle   int `sql:"type:varchar(1)    ;not null"`
	RightsOfficersclubWallNewspaper    int `sql:"type:varchar(1)    ;not null"`
	RightsProfileInfo                  int `sql:"type:varchar(1)    ;not null"` //профиль
	RightsProfileSkills                int `sql:"type:varchar(1)    ;not null"`
	RightsProfileAchievements          int `sql:"type:varchar(1)    ;not null"`
	RightsProfileProperty              int `sql:"type:varchar(1)    ;not null"`
	RightsProfileBooty                 int `sql:"type:varchar(1)    ;not null"`
	RightsProfileGifts                 int `sql:"type:varchar(1)    ;not null"`
	RightsProfileVipMode               int `sql:"type:varchar(1)    ;not null"`
	RightsProfileStatistic             int `sql:"type:varchar(1)    ;not null"`
	RightsHalloffameRating             int `sql:"type:varchar(1)    ;not null"` //зал славы
	RightsHalloffameStatistic          int `sql:"type:varchar(1)    ;not null"`
	RightsHalloffameHeroes             int `sql:"type:varchar(1)    ;not null"`
	RightsHalloffameLegions            int `sql:"type:varchar(1)    ;not null"`
	RightsAllianceIndex                int `sql:"type:varchar(1)    ;not null"` //альянс
	RightsAllianceRequests             int `sql:"type:varchar(1)    ;not null"`
	RightsAllianceReferrals            int `sql:"type:varchar(1)    ;not null"`
	RightsAllianceReinforcement        int `sql:"type:varchar(1)    ;not null"`
	RightsAllianceUnderDefense         int `sql:"type:varchar(1)    ;not null"`
	RightsChatPublic                   int `sql:"type:varchar(1)    ;not null"` //чаты
	RightsChatAlliance                 int `sql:"type:varchar(1)    ;not null"`
	RightsChatLegions                  int `sql:"type:varchar(1)    ;not null"`
	RightsChatBootcamp                 int `sql:"type:varchar(1)    ;not null"`
	RightsBankStorage                  int `sql:"type:varchar(1)    ;not null"` // банк
	RightsBankGold                     int `sql:"type:varchar(1)    ;not null"`
	RightsBankСredit                   int `sql:"type:varchar(1)    ;not null"`
	RightsBankExchanger                int `sql:"type:varchar(1)    ;not null"`
	RightsMailIndex                    int `sql:"type:varchar(1)    ;not null"` //почта
	RightsMailWrite                    int `sql:"type:varchar(1)    ;not null"`
	RightsMailContacts                 int `sql:"type:varchar(1)    ;not null"`
	RightsMailIgnore                   int `sql:"type:varchar(1)    ;not null"`
	RightsHospital                     int `sql:"type:varchar(1)    ;not null"` //госпиталь
	RightsNews                         int `sql:"type:varchar(1)    ;not null"` //Новости
	RightsNewsAddCommen                int `sql:"type:varchar(1)    ;not null"`
	RightsdailyBonus                   int `sql:"type:varchar(1)    ;not null"`
}


Она вышла очень огромной. Зарание спасибо.
Так как с MyISAM чтение быстрее то будет использоваться этот тип таблицы Пруфф
  • Вопрос задан
  • 310 просмотров
Решения вопроса 4
Akdmeh
@Akdmeh
PHP, Yii2, Music
Плохо, лучше бы просто хранить в отдельной таблице все варианты прав и их соотношения (к примеру, есть поле manageNews, который включает в себя deleteNews, updateNews) и отдельную таблицу для соотношений - какой пользователь имеет какие права.
https://github.com/yiisoft/yii2-framework/blob/mas...
Пусть это и php-фреймворк, но можно посмотреть пример работы таблицы; заодно в документации можно найти, как все это работает.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
@FireGM
А не легче было сделать одно поле с указанием цифр? Цифры где-нибудь записаны, можно в той же базе. Например, поле Scope в структуре. Это поле содержит значение "1;8;12;6;". Разбиваем по ";", Смотрим, какие права нужны на выполнение функции, смотрим есть ли это значение - выполняем/даём ответ, что нужны такие-то права.
Ответ написан
mirrr
@mirrr
Программист и просто хороший человек
А я бы использовал битовую маску, тем более go прекрасно умеет с ними работать)
type Rights int64

const (
	RightsAuth             = 1 << iota // 1 << 0 which is 0000000000000001
	RightsRegs                         // 1 << 1 which is 0000000000000010
	RightsBattlesInvasion              // 1 << 2 which is 0000000000000100
	RightsBattlesSanctions             // 1 << 3 which is 0000000000001000
	RightsBattlesGround                // 1 << 4 which is 0000000000010000
	RightsMissionsLocation             // 1 << 5 which is 0000000000100000
	// ...
)


Вот здесь более подробный пример: pastebin.com/jz6TZevq
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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