logo
03.10.2019 11:51
1
Robim na systeme opravneni a prave riesim implementaciu sql schemy. Nikdy som nepouzival vnorene selecty ale kvoli rychlosti a praktickosti by som to tentokrat pominul. Takze ide o to navrhnut schemu tak, aby som vedel nacitat co potrebujem co najoptimalnejsie(idealne 1 query).

Tu su objekty:
Kód:
Account {
  ID
}

Organization {
  ID
}

Membership {
  OrganizationID
  AccountID
}

Role {
  OrganizationID
}

RoleLink {
  RoleID
  oneof {
    MembershipID
    GroupID
  }
}

Group {
  OrganizationID
}

GroupLink {
  GroupID
  MembershipID
}

Permission {
  OrganizationID
}

PermissionLink {
  PermissionID
  RoleID
}

Policy {
  map[RoleID]{
    []Membership
    []Group
  }
}
Potrebujem vybudovat zoznam roli pre ktore potom mozem nacitat opravnenia, nasledovne(vsetko su id, nie cele objekty):
Kód:
- nacitaj vsetky membershipy pre account
  - pre kazdy membership nacitaj vsetky role
  - pre kazdy membership nacitaj skupiny
    - pre kazdu skupinu nacitaj role
- pre kazdu najdenu politiku(logika tu nie je dolezita)
  - pozri ci ma membership ktory patri accountu a ak ano prirad rolu do zoznamu
  - pre kazdu skupinu nacitaj membershipy a ak sa zhoduju s accountom, prirad rolu do zoznamu
na koniec: pre vsetky najdene role nacitaj opravnenia

Název:  your-hard-work-meme.jpg
Zobrazení: 210
Velikost:  59,4 KB
03.10.2019 12:29
2
premyslel jsi nad moznosti mit role per account? V organizaci budes mit typicky admina a dalsi useri z org muzou mit nizsi prava. Premyslel bych nad tim zakomponovat do toho jeste entitu 'OrganizationAdmin'. V budoucnu ta potreba treba muze vzniknout a pak se to blbe upravuje
03.10.2019 15:44
3
a v jakém jazyku to píšeš? Asi bych se vykašlal na myšlenku vše jedním dotazem a nebál se jich pužívat více s where in.

Koukal jsi jak řeší schéma již existující věci? Namátkou:
- Spring https://docs.spring.io/spring-securi...ix-schema.html
- Apache sentry https://github.com/apache/sentry/blo...ysql-2.1.0.sql

Ve většina jazyků jsou již nějaké balíčky, které to řeší, nemusíš to dělat znovu. Nechceš udělat nějaký ER diagram, vazby by z toho byly vidět lépe? Moc nerozumím tvému zápisu, ptáš se na sql, ale zápis máš nějaký jiný. Na první otázky je snadná odpověď

1. pre kazdy membership nacitaj vsetky role

Kód:
select distinct Membership.id, role.id
FROM Membership
JOIN Role on Role.OrganizationID = Membership.OrganizationID
[WHERE Membership.id = XXX]
2. pre kazdy membership nacitaj skupiny

Kód:
select distinct Membership.id, group.id
FROM Membership
JOIN GroupLink on GroupLink.MembershipID = Membership.id
JOIN Group on Group.id = GroupLink.GroupID
[WHERE Membership.id = XXX]

3. pre kazdu skupinu nacitaj role

Kód:
select distinct group.id, Role.id
FROM Group
JOIN RoleLink on RoleLink.GroupID = Group.id
JOIN Role on Role.id = RoleLink.RoleID
[WHERE Group.id = XXX]
Na ty další je pro mě těžké vidět ty vazby, resp. co vůbec chceš načíst.
03.10.2019 16:36
4
jazyk/orm neries....
vezby su prave v tych objektoch - su tam len idcka, nedaval som tam ziadne dalsie polia kvoli jednoduchosti.
vezby su v tom co som pisal, ale ak toto pomoze tak:

Kód:
account -> membership -> role link -> role -> permission link -> permission
account -> group link -> group -> role link -> role -> permission link -> permission
ta politika grantuje rolu pre membership alebo pre skupinu(a cez nu membership).

a samozrejme spravit to na 4 query viem, len som hladal nejake chutrejsie riesenei a optimalizovanejsi navrh sql schemy.

ps: membership spaja account a organizaciu, role link spaja rolu a membership ALEBO skupinu, premissions link spaja opravnenie a rolu, group link spaja skupinu a memebrship.