Sa incepem prin impartirea cerintelor in trei domenii principale:

  1. Actori care efectueaza actiuni ( Roluri) : utilizatori anonimi, membri ai grupului, administratori de grup, super administratori
  2. (Actiuni) efectuate de actori: rasfoiti grupul, post in grup, stergeti postarea
  3. ( Resursele) pe care actorii le efectueaza actiuni: grupuri, postari

Apoi, trebuie sa formam o modalitate declarativa (ganditi-va la ea ca la o ecuatie) pentru a descrie relatia dintre aceste trei domenii in ceea ce priveste rolul care ar trebui sa poata efectua actiuni asupra unei resurse. De exemplu, membru al grupului ar trebui sa poata rasfoi un grup atunci cand este membru al acestui grup.

Rasfoiti politica de grup

Sa numim aceasta ecuatie o politica , asa ca acum putem converti orice cerinta pe care o avem in ceea ce priveste controlul accesului intr-o politica. Unele politici nici macar nu au nevoie de o conditie, de exemplu un super administrator poate naviga in orice grup fara nicio limitare; in acest caz, trebuie sa omitem conditia, deoarece aceasta va reveni intotdeauna adevarata.

In sectiunea urmatoare, vom folosi puterea Swift pentru a implementa un cadru care poate:

  1. Descrieti si mentineti cerintele noastre sub forma unui set de politici.
  2. Furnizati un API curat pentru alte componente de sistem care sa solicite daca unui anumit utilizator i se permite sa faca o anumita actiune sau nu (respectand politicile).

Sa incepem prin a scrie solutia noastra in pseudo-cod pentru a ne oferi un indiciu despre ce vrem sa obtinem in Swift:

// Politica pentru membrii grupului

GroupMember.shouldBeAbleTo (BrowseGroup) .when

(member.groupId == action.groupId) // create users

user1 = GroupMember (nume = “Adam Smith”, varsta = 18, groupId = 1)

user2 = GroupMember (nume = “Adam Smith”, varsta = 18, groupId = 2) // creati actiune

browseGroup2 = BrowseGroup (groupId = 2) // verificati daca este permis utilizatorului

user1.can (browseGroup2) // false

user2.

madres viciosas porno español creampie
follada en la playa porno caca
michelle jenner desnuda porno gitanas españolas
porno gay violado porno suizo
tetas saltarinas follando en el trastero
abuelas ardientes mi mujer es muy puta
pillados follando infraganti orgias con abuelas
subporno madura en la playa
parejas pilladas en la calle abuelas sexi
videos porno online sexo gratis porno
creampie abuelas pajas pollones
maduras en playas nudistas familia española follando
vidio xxxx porno viejas alemanas
porno interactivo gratis pierre wodman
videos xxx violadas tetas en las playas
gordibuenas españolas videos porno maduras españa
hentai castellano paginas videos porno gratis
sexporn incestos madres hijos
porno caliente videos de zofilia
porno violacion gay la engaña para follar

can (browseGroup2) // Adevarat

In aplicatia noastra de stiri, presupunem ca avem un utilizator de clasa care contine informatii de baza despre utilizator, cum ar fi numele si varsta si un grup de clasa care contine informatii de grup de baza, cum ar fi groupNumber si un semnalizator care indica daca grupul este public sau nu:

Deoarece Swift este un limbaj de programare orientat spre protocol, vom folosi puterea protocoalelor si a extensiilor de protocol pentru a construi solutia noastra. Vom compune roluri utilizatorilor prin maparea rolurilor noastre la protocoale si vom amesteca aceste protocoale cu clasa User pentru a genera diferite tipuri de utilizatori pe baza rolurilor lor. De exemplu, o clasa de utilizator conform protocolului GroupMember este un GroupMemberUser si trebuie sa aiba proprietatea groupNumber.

Luand acum in considerare ierarhia rolurilor, vom modela toate rolurile ca protocoale. De exemplu, GroupAdmin a extins GroupMember, deoarece fiecare GroupAdmin este un GroupMember, aceasta inseamna ca un administrator de grup are toate privilegiile pe care le avea membrul grupului si mai multe.

Urmatorul pas este modelarea actiunilor, maparea diferitelor actiuni la tipuri simple (in cazul nostru aleg struct) care se conformeaza protocolului Actiune

Urmatoarea piesa din puzzle este cea care gestioneaza relatia dintre actiuni si roluri, Politici . Amintiti-va din sectiunea anterioara ca Politica = Rol + Actiune + Conditie . Politica are doua metode importante, se aplica care executa conditia unei instante de actiune si un rol si cand accepta o conditie deoarece conditia este optionala si nu este inclusa in initializatorul de politica.

Unind punctele

Pentru ca solutia noastra sa semene mai mult cu pseudo-codul cu care am inceput, vom schimba rolurile si protocoalele de actiune astfel:

Aici am adaugat functia shouldBeAbleTo la protocolul de rol, aceasta functie actioneaza ca o metoda din fabrica care creeaza o politica care conecteaza o actiune la rolul apelantului, putem atribui apoi conditii suplimentare acestei politici utilizand functia cand am adaugat-o anterior in clasa Politica. Am adaugat, de asemenea, functia can care valideaza daca rolul poate efectua o actiune evaluand aceasta actiune peste toate regulile si returnand true daca cineva dintre ele a returnat true. Retineti ca am adaugat si un initializator gol necesar la ambele protocoale.

Totul este in vigoare acum, acum putem sa ne alimentam cadrul cu toate politicile pe care le aveam in cerinte si sa construim aplicatia noastra

Aceasta implementare ne permite sa adaugam noi politici cu costul minim al schimbarii, asa cum am discutat anterior. Daca am primit o noua cerinta, dorim sa le permitem utilizatorilor sa navigheze intr-un grup daca este creat pentru stiri in termen de 30 km de locul in care locuieste utilizatorul, il putem implementa dupa cum urmeaza:

In acest articol am implementat un cadru de control al accesului bazat pe rol atribuit simplu in Swift. Solutia noastra a folosit puterea protocoalelor rapide pentru a ne permite sa modelam cerintele pe care le aveam sub forma unui set de politici. Codul sursa complet al acestui articol poate fi gasit in proiectul Exemplu.

Multumesc ca ai citit !! Daca v-a placut acest articol, va rugam sa lasati cateva palme. ????????????