Pereiti prie turinio

PHP vartotojų grupės


Rekomenduojami pranešimai

Sveiki,

 

gerą pusdienį vargau ir niekas nesigavo, tad kreipiuosi į jus...

 

Mini TVS sistemėlei reikia atskirų vartotojų grupių - nariai, moderatoriai, vadovai.

 

Nariai matytų mažiausiai informacijos

Moderatoriai turėtų daugiau funkcijų

Vadovai turėtų pilną prieigą prie visų funkcijų.

 

Turim users lentelę su (int)id, (varchar)username, (varchar)password ir (int)rights (Nariai - 10, moderatoriai - 100, vadovai - 1000).

 

Prisijungiame su sesija, kurioje saugome vartotojo id (users -> id).

 

Kaip aprašyti funkciją, kurią naudojant atskirose vietose, būtų galima tikrinti ar narys turi nario, ar moderatoriaus, ar vadovo teises?

 

Norėčiau panaudoti kažką tokio:

 

function usersRights() {
   //funkcija
}

 

vietose, kur reikia tikrinti:

 

if (usersRights()) {
  // rodom info
}

 

 

Dėkoju už pagalbą.

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

na taip, galima daryti ir toki varianta:

 

$userID = $_session['rights'];

if (($userID=1) || ($userID=87)) {

//echo

}

 

bet tai yra nepatogu, dėl to, jog daug kur reikia šią formą rašyt ir galima pridėti naujus vartotojus, senus redaguoti (keisti jiem teises) ir visai trinti...

 

Noriu kažko optimalesnio.

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kurk kartu ir $_SESSION[’user_rights’] = rigts.

Pakurk users class. Turėk class atributus:

 

Static Private $user_type1 = 10;
Static Private $user_type2 = 100;
Static Private $user_type3 = 1000; 

(Nu vienu žodžiu tiek tu atributu, kiek yra user tipų).

 

Tada daryk tarp class metodą:

 

Static function user_rights($session_rights=““) {
If($session_rights == $this-> user_type1) {
Return $nario_tipas = “Narys“;
} elseif ($session_rights == $this-> user_type2) {
Return $nario_tipas = “Moderatorius“;
} elseif ($session_rights == $this-> user_type3) {
Return $nario_tipas = “Vadovas“;
} else {
       Return $nario_tipas = ““;
}
}

 

Na ir vienu žodžiu, tame pagrindiniame page dėk:

 

If(Users::user_rights($_SESSION[“user_rights“]) == “Narys“) {
//Display tą sritį.
}

 

Na gal ir nedaug ką pakeičia, aišku galima ir geriau padaryt, ir su daugiau visokių smulkmenų, bet funkcionalumas šioks toks yra. Jei ką reikės keist tai klasėje, o pagrindiniam tik tą vieną žodį.

 

P.S. Net nesu garantuotas, kad veiks (turėtų veikt), nes netikrinau.

 

P.P.S. Tas string (pvz. Narys) gali keist konstantom ar panašiai. Tada dar geriau bus, jei reikės ką keist. Galėsi pakeist tik tas reikšmes, tame faile, kur tos konstantos.

Redagavo fluxas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kurk kartu ir $_SESSION[’user_rights’] = rigts.

Pakurk users class. Turėk class atributus:

 

Static Private $user_type1 = 10;
Static Private $user_type2 = 100;
Static Private $user_type3 = 1000; 

(Nu vienu žodžiu tiek tu atributu, kiek yra user tipų).

 

Tada daryk tarp class metodą:

 

Static function user_rights($session_rights=““) {
If($session_rights == $this-> user_type1) {
Return $nario_tipas = “Narys“;
} elseif ($session_rights == $this-> user_type2) {
Return $nario_tipas = “Moderatorius“;
} elseif ($session_rights == $this-> user_type3) {
Return $nario_tipas = “Vadovas“;
} else {
       Return $nario_tipas = ““;
}
}

 

Na ir vienu žodžiu, tame pagrindiniame page dėk:

 

If(Users::user_rights($_SESSION[“user_rights“]) == “Narys“) {
//Display tą sritį.
}

 

Na gal ir nedaug ką pakeičia, aišku galima ir geriau padaryt, ir su daugiau visokių smulkmenų, bet funkcionalumas šioks toks yra. Jei ką reikės keist tai klasėje, o pagrindiniam tik tą vieną žodį.

 

P.S. Net nesu garantuotas, kad veiks (turėtų veikt), nes netikrinau.

 

P.P.S. Tas string (pvz. Narys) gali keist konstantom ar panašiai. Tada dar geriau bus, jei reikės ką keist. Galėsi pakeist tik tas reikšmes, tame faile, kur tos konstantos.

 

Visiška nesąmonė. Nieks tokių dalykų nesaugo kliento pusėj.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jeigu teisių aibė atrodo taip paprastai:

Vartotojas < Moderatorius < Administratorius

Tai ką čia galvot? Turi gi lauką rights, tai ir saugok jame kaip saugai. Jeigu nėra didelės problemos, tai sesijoj saugai tik ID, ir kaskart po užklausą darai pagal tą ID į duombazę, iš kurios paimi vartotojo duomenis (kartu ir tą rights). Turi define'us arba constantas ir tiesiog if'ini kur reikia.

class User {
  const ACCESS_USER = 1,
        ACCESS_MODERATOR = 10,
        ACCESS_ADMIN = 100;

  public function login() {
       // loginini user'i
       $_SESSION['id'] = $gautas_rezultatas_is_db;
  }

  static function getInfo() {
       // query SELECT name, ...., rights FROM users WHERE id = {$_SESSION['id']}
  }
}

$user = User::getInfo();

// jeigu moderatorius arba adminas
if ($user['rights'] > User::ACCESS_USER) {
   print "Tu auksciau, negu paprastas useris";
}

if ($user['rights'] == User::ACCESS_ADMIN) {
   print "Tu adminas";
}
// .....

 

Bet čia yra patogu TIK tada, kai User < Moderator < Admin, arba teisės yra sugrupuotos. Jeigu yra kažkokių specifinių teisių, pvz. kad Moderatorius gali daryti kažką, ko negali daryti Adminas (pvz. kažkokį specifinį puslapį matyti), tai tada patogiausia žaisti su flag'ais ir bitwise operacijomis. Tarkim, yra 5 skirtingos teisės:

1. Blokuoti user'į

2. Matyti turinį

3. Matyti moderavimo langą

4. Matyt administravimo langą

5. Loginintis

 

Ir kiekvienai iš šitų teisių reikia priskirti true/false (gali ar negali). Patogiausia tai padaryti 0 ir 1 sekos pagalba, pvz 01001 reikštų, kad user'is gali matyti turinį (2 skaitmuo - 1) ir loginintis (5 skaitmuo - 1), visų kitų negali daryti. Pvz. kažkoks kitas žmogus turi galėti daryti tą patį ką ir user'is ir plius dar galėti juos blokuoti - tai jo teisės būtų 11001. Čia, kaip galima suprasti, dvejetainė išraiška, kurią galima atvaizduoti paprastu integer'iu. Pavyzdžiui, jau minėtas 01001 = 1 * 20 + 1 * 23 = 9 (kaip ir kodėl ir kam šitas taip skaičiuojamas galima sužinoti universitete arba šiaip pagooglinus). Taigi, jeigu rights = 9 tai reiškia, kad vartotojas gali matyti turinį ir loginintis. Tikrinama tai irgi paprastai, su bitwise operacijomis:


class User {
  const 
    CAN_LOGIN = 1, // 2^0       (00001)
    CAN_ADMIN = 2, // 2^1       (00010)
    CAN_MODERATE = 4, // 2^2    (00100)
    CAN_SEE_CONTENT = 8, // 2^3 (01000)
    CAN_BLOCK_USER = 16 // 2^4; (10000)

  static function canDo($access) {
     $rights = 9; // gaunamas is duomenu bazes
     return ($rights & $access) == $access; // sudedam kiekviena bita ir ziurim ar nepasikeite. 
                                            //Jeigu nepasikeite - reiskia reikiamoje vietoje yra 1
  }

}

// ir veliau kazkur kode
if (User::canDo(User::CAN_MODERATE)) {
  // gali moderuoti
}

if (User::canDo(User::CAN_SEE_CONTENT)) {
  // gali matyti turini
} 

 

Čia žodžiu taip labai trumpai prabėgau, "pseudokodu" parašiau pačią flag'ų idėją (taip pat veikia ir CHMOD (o kodėl ten būtent 777, 775 būna ir pan.). Galima atskirą straipsnį šia tema parašyt, kad aiškiau būtų, gal kada prisėsiu. Siūlau pasidomėt, jeigu kažkas nežino :)

Redagavo vitalikaz
Nuoroda į pranešimą
Dalintis kituose puslapiuose

su OOP nelabai draugauju :)

Metas padraugauti. Aišku, vien šiai funkcijai tai nebūtina, bet tikrai labai populiari paradigma, kurią sutiksi bet kur, kur daugiau PHP kodo (bet kuris ne-mini frameworkas, ORM, ir t.t.).

 

Šiaip jau nematau, kame problema. Net be OOP darant, galima pasidaryti kažką tokio:

define('RIGHTS_USER', 10);
define('RIGHTS_MODERATOR', 100);
define('RIGHTS_ADMIN', 1000);

function hasRightLevel($level) {
   // su sąlyga, kad, kaip kažkas minėjo,
   // turėsi tuos duomenis sesijoje
   return $_SESSION['user']['rights'] >= $level;
}

var_dump(hasRightLevel(RIGHTS_MODERATOR));

 

Štai ir viskas, vienos eilutės funkcija :D

 

Aišku, nesakau, kad čia geras kodas (panašėja į php-fusion, kur viskas globalu, kas kur ką nori, tą daro), bet labai greitas sprendimas. Kaip sakiau, tiesiog nelabai suprantu, ko nemokėjai pasidaryti.

 

Hm, o kas čia per mada rašyti keywordus iš didžiosios raidės? Atrodo kaip kažkoks Visual Basic košmaras :/

 

Ne tik, kad kodo stilius sako visiškai kitaip, bet išvis nemačiau niekada realiam kode, kad rašytų iš didžiosios raidės. :huh:

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Metas padraugauti. Aišku, vien šiai funkcijai tai nebūtina, bet tikrai labai populiari paradigma, kurią sutiksi bet kur, kur daugiau PHP kodo (bet kuris ne-mini frameworkas, ORM, ir t.t.).

 

Šiaip jau nematau, kame problema. Net be OOP darant, galima pasidaryti kažką tokio:

define('RIGHTS_USER', 10);
define('RIGHTS_MODERATOR', 100);
define('RIGHTS_ADMIN', 1000);

function hasRightLevel($level) {
   // su sąlyga, kad, kaip kažkas minėjo,
   // turėsi tuos duomenis sesijoje
   return $_SESSION['user']['rights'] >= $level;
}

var_dump(hasRightLevel(RIGHTS_MODERATOR));

 

Štai ir viskas, vienos eilutės funkcija :D

 

Aišku, nesakau, kad čia geras kodas (panašėja į php-fusion, kur viskas globalu, kas kur ką nori, tą daro), bet labai greitas sprendimas. Kaip sakiau, tiesiog nelabai suprantu, ko nemokėjai pasidaryti.

 

 

Hm, o kas čia per mada rašyti keywordus iš didžiosios raidės? Atrodo kaip kažkoks Visual Basic košmaras :/

 

Ne tik, kad kodo stilius sako visiškai kitaip, bet išvis nemačiau niekada realiam kode, kad rašytų iš didžiosios raidės. :huh:

 

Per wordą iš pradžių pasirašiau, tai automatiškai didžiosiomis padarė ir nepakeičiau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nežinau, ką jūs čia buriat, bet aš daryčiau taip (gal sintaksiškai kode bus klaidų, bet tai dėl to, kad PHP nebeprogramuoju).

 

class UserRights {
   ADMIN = 2
MODERATOR = 1
MEMBER = 0

// cia konstruktorius, kuriam paduodi user objekta ar kokia kita
// vartotoja ar jo teises identifikuojancia informacija
function __contruct($user) {
	$this->user = $user;
}

function isAdmin() {
        return $user->dataFromDB['perm'] === $this->ADMIN;
}

function isMember() {
        return $user->dataFromDB['perm'] === $this->MEMBER;
}

function isModerator() {
        return $user->dataFromDB['perm'] === $this->MODERATOR;
}
}

$rights = new UserRights($user);
if ($rights->isAdmin()) {
echo 'blah';
} elseif ... {
echo 'blahblah';
}

Redagavo aemdy
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nežinau, ką jūs čia buriat, bet aš daryčiau taip (gal sintaksiškai kode bus klaidų, bet tai dėl to, kad PHP nebeprogramuoju).

 

class UserRights {
ADMIN = 2
MODERATOR = 1
MEMBER = 0

// cia konstruktorius, kuriam paduodi user objekta ar kokia kita
// vartotoja ar jo teises identifikuojancia informacija
function __contruct($user) {
	$this->user = $user;
}

function isAdmin() {
	$user->dataFromDB['perm'] === $this->ADMIN;
}

function isMember() {
	$user->dataFromDB['perm'] === $this->MEMBER;
}

function isModerator() {
	$user->dataFromDB['perm'] === $this->MODERATOR;
}
}

$rights = new UserRights($user);
if ($rights->isAdmin()) {
echo 'blah';
} elseif ... {
echo 'blahblah';
}

 

na ok, bandysiu pritaikyti savo sistemai, ir susidraugauti su OOP :)

neapleiskite temos, nes manau turėsiu klausimų :D

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

krc...

 

niekas nesigauna su tuo OOP...

labai paprastas metodas:

 

$array = array(
   "id" => $_SESSION['user_id']
);

$user_details = GetUserDetails($array);

if($user_details['rights'] == 1000){
   // rodom viską
} else
if($user_details['rights'] == 100) {
   // rodom moderatoriaus puslapį
} else
if($user_details['rights'] == 10) {
   // rodom user puslapį
}

function GetUserDetails($array){
   // $query = SELECT * FROM `users` WHERE id = '". $array['id'] ."'

   return $query;
}

 

tikrai suprasi ką parašiau, tiesiog masyve aš padariau, kad ID yra išgaunamas iš sesijos, bet tu gali pasidaryti kaip tik nori, svarbu, kad suprastai kokiu principu veikia. Kodas labai paprastas, nes kaip supratau su PHP tau ne kas, todėl manau tikrai suprasi kas ir kaip ;)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

įdėk ten savo kodą, kur prieš tai rašei, ir matysi, jog neveikia... o kadangi aš nesuprantu to OOP, tai net neraukiu kas ten negerai... :|

 

Jei jau taip bijai to OOP galima ir paprastas funkcijas pasirašyt, isAdmin isModerator ir t.t. ten paduodi sesijos id nario ir gražini true ar false arba, kaip nori, kad gražintu :)

 

Arba gio pavyzdys

Nuoroda į pranešimą
Dalintis kituose puslapiuose

įdėk ten savo kodą, kur prieš tai rašei, ir matysi, jog neveikia... o kadangi aš nesuprantu to OOP, tai net neraukiu kas ten negerai... :|

Tau nieks berods ir nedavė pilno kodo – tik griaučius. Juk mes nežinom, kaip tu ten iš DB trauksi, ar ką.

 

O tai kam naudoti ko nerauki? Eini, išmoksti, tada rauki :) Jei tingėsi mokytis ir norėsi visada likt prie to, ką moki dabar, tai beliks taip ir daryti, klausinėti forumuose kiekvieno žingsnio.

 

http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/

http://php.net/manual/en/language.oop5.php

 

Kaip sakiau, čia OOP nebūtinas (bet šiaip žinoti – tai tikrai), bet vis dar nesuprantu, ko nemoki pasidaryti pats.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...