R.E. Login 2.0 -tól oldalak megtekintésének korlátozása és jogok (rangok).

Kérek mindenkit, akinek nem a rangokkal, oldalak megtekintésével van problémája, a következő oldalon kérdezzen:
Meghívós loginrendszer - R.E. Login v2.0

Ez a login talán a legnépszerűbb programom. De való igaz, hogy nem készítettem hozzá részletes használati útmutatót. Mivel egy komplett leírásra egyszerre nincs időm, úgy döntöttem, a leggyakrabban feltett kérdésekre válaszolok. Amik egyben a leglényegesebbek is.

Hogyan kössem regisztrációhoz egy oldal megtekintését?

Teljes oldal letiltása

Ebben a verzióban létezik egy System osztály, ami többek között tartalmaz egy protectedSite() nevű metódust. Ez a metódus mondja meg a loginnak, hogy az adott oldal védett. Tehát nem tekintheti meg akárki. Paraméter nélkül hívva csak a belépést követeli meg. És ilyenkor a config-ban beállított ( Telepítéskor megadott, vagy utólag a classes/Config.class.php -ben beállított ) főoldalra irányít át, vagy külön beállított „Védett oldal fájlja” jelzésű ( config fájlban FILE_PROTECTED_SITE konstans ) oldal esetén utóbbira..

<?php
require_once 'init.php';
System::protectedSite();
?>
Amit ide írok, azt kizárólag belépett user tekintheti meg. A többi át lesz irányítva.

Az oldal egy részének letiltása

Ha az oldalon csak egy rész van, amit nem láthat akárki, akkor a System::$logged változó vizsgálata szükséges. Ami true értéket kap, ha a felhasználó bejelentkezett és false marad, ha még nem lépett be.

<?php
require_once 'init.php';
?>
Ezt a tartalmat bárki láthatja
<?php if (System::$logged) : ?>
       Ezt viszont csak aki bejelentkezett
<?php endif ?>

Bonyolultabb korlátozások jogok megkülönböztetett jogok alapján

A loginban léteznek különböző rangok. Ezek hivatottak a jogosultságokat megkülönböztetni. Alapvetően két fő adatból áll. A változónév, ami alapján programból azonosítani lehet a rangot, és egy név a megjelenítéshez.

Előre beállított rangok

Változó név Név a megjelenítéshez Magyarázat
guest Vendég Be nem jelentkezett felhasználó.
user Felhasználó Egyszerű felhasználó. Alapértelmezett rang a regisztráció után.
banned Tiltott Olyan regisztrált tag, akinek a belépését egy adminisztrátor megtiltotta.
admin Adminisztrátor Korlátozott adminisztrációs jogokkal rendelkező tag.
owner Tulajdonos Teljes körű adminisztrációs jogokkal rendelkező tag. Az első regisztráló ezt a rangot kapja.

Teljes oldal letiltása rangoktól függően.

A már említett protectedSite() metódust lehet használni hozzá. De paraméterként át kell adni a változónevek tömbjét, amely rangú tagoknak engedélyezett az oldal megtekintése.

Fontos tehát, hogy nem azokat kell felsorolni, akik tiltva vannak!

<?php
require_once 'init.php';
System::protectedSite(array('owner', 'admin'));
?>
Amit ide írok, azt kizárólag admin és tulajdonos tekintheti meg. A többi át lesz irányítva.

De

<?php
require_once 'init.php';
System::protectedSite(array('guest', 'user'));
?>
Amit ide írok, azt vendég is láthatja és egyszerű felhasználó is. Viszont se admin, se tulajdonos nem.

A banned rangnak csak beléptetéskor van jelentősége. Így ez egy amolyan kakukktojás rang. Mert ilyen esetben a beléptetés nem történik meg és a rang marad vendég.

Az oldal egy részének letiltása rangok alapján

A System::protectedSite() metódus egy másik metódust használ fel a rangok eldöntésére. A System osztálynak van egy tulajdonsága, ami az aktuális böngésző felhasználót tartalmazza. Ez pedig a System::$user Ennek van egy rank() metódusa, aminek átadva a rangok tömbjét (vagy egyetlen rangott stringként), visszakapjuk logikai értékként, hogy azon rangok közül bármelyikkel is egyezik-e a tag rangja.

<?php
require_once 'init.php';
?>
Ezt mindenki látja.
<?php if (System::$user->rank('user')) : ?>
Ezt csak felhasználó rangúak látják.
<?php endif ?>
<?php if (System::$user->rank(array('owner','admin'))) : ?>
Ezt csak admin és tulajdonos látja.
<?php endif ?>

Új rangokat is fel lehet venni admin felületen. Majd azokat az előbb ismertetett módon lehet vizsgálni.

Tag aktuális rangjának lekérdezése:

Megjelenítendő rangnév

Erre gyakrabban lehet szükség, ezért létezik rá egy metódus szintén. Ez pedig rankName().

echo System::$user->rankName();

Kiírja például, hogy „Adminisztrátor”.

A tag rang ID-jának lekérdezése

A users táblában a rang csak egy id formájában jelenik meg. Mivel ez egy egyszerű tulajdonság, így a következőképpen írható ki:

echo 'Felhasználó rangjának ID-ja:'.System::$user->rank;

A felhasználói jog változónevének lekérdezése

Ez már ritkábban kellhet. inkább az ellenőrzésekre van szükség. Ezért nincs rá külön metódus a userben. Viszont megoldás persze van. Létezik egy Ranks osztály, amit tulajdonképpen a User osztály is felhasznál. Ennek a Ranks osztálynak vannak különböző metódusai. A legáltalánosabb, és egyben az egyetlen lehetőség a rang változójának lekérdezésére a getRank().

        /**
         * A rang egy adatának lekérdezése
         *
         * A $return mező értékét kérdezi le, ha a $by mező értéke $value
         * Ha egy rang sem felel meg a feltételnek, akkor null-t ad vissza.
         *
         * @param string $return Lekérdezendő mező neve
         * @param string $by Milyen mezőnév alapján kérdezzen le
         * @param mixed $value Mi legyen a $by mező értéke.
         * @return mixed
         */

        public static function getRank($return, $by, $value)
        {
                $by = strtolower($by);
                $value = strtolower($value);
                foreach (self::getInstance() as $row)
                {
                        if (strtolower($row[$by]) == $value)
                        {
                                return (is_null($return)) ? $row : $row[$return];
                        }
                }
                return null;
        }

echo 'A felhasználó rangjának változója: '.Ranks::getRank('varname','rankid', System::$user->rank);

Egyéb lehetőségek

Név lekérdezése ID alapján: echo Ranks::getNameById(System::$user->rank);
Név lekérdezése változó alapján: echo Ranks::getNameByVar('admin');
ID lekérdezése változó alapján: echo Ranks::getIDByvar('admin');

A fenti példákban a System::$user változót használtam a tag objektumának elérésére. A profil megtekintése és változtatása oldalakon elég csak a $user változót használni. És az az épp megtekintett tag objektumát adja. Ennek megfelelően változhatnak a megoldások a fenti példákhoz képest.

Kategóriák: 
Megosztás/Mentés

Hozzászólások

Dual képe

Igen, ez lenne a gond :/

Rimelek képe

Akkor minden bizonnyal egyik csoportba sem tartozik a felhasználó, amivel nézed az oldalt, vagy még előtte írsz el valamit, amitől arra a vizsgálatra rá sem fut. De ezeket végig kell próbálgatni.

Bors Bence képe

Üdv! Köszi a feltõltést! de egy pici problémám lenne a captcha kóddal... a tárhelyen nem jeleniti meg a képet igy nem tudok be Regisztrálni... Most mi a tehendõ??

Rimelek képe

Helló. Ennek az oldalnak a tetején kiemelve jeleztem, hogy a nem jogokkal kapcsolatos kérdéseket hol lehet feltenni. Azon az oldalon leírtam ennek a problémának a megoldását is. Ami tárhelytől függően más lehet, de többnyire az útvonalakkal kapcsolatos.

Székely Levente képe

Szia,
Aki bejelentkezik, azt nem dobja a rendszer át egy védett oldalra, hanem marad az index.php-n csak láthatóvá válnak a dolgok.
Azt hogyan lehet megcsinálni, hogy aki bejelentkezett átirányítja egy oldalra?
Próbáltam így, de nem jó:

<?php
require_once 'init.php';

require_once 'relogin2/login.php';
?>
<?php if (System::$logged) : ?>
       
<?php endif ?>
<?php
header("Location: jatek.php"); /* Átirányít */
exit; /* Biztossá teszi azt, hogy az következő kódrész nem fut le. */
?>

Rimelek képe

Ha oda raknád az átirányítást, ahol teljesül a feltétel és nem utána, akkor átirányítana. Vagyis így is megteszi, csak így minden alkalommal.

De a jatek.php azért tényleg legyen védve, hogy ne lehessen elérni belépés nélkül.

Suvel képe

Szia,
Először bocsi a késői válaszra, vártam az email-t, mert azt hittem, hogy kapok ott valami értesítést:)

És megnéztem, tényleg rossz helyen volt, köszi!
És persze, le van az védve :)

Suvel képe

Szia,
Felraktam a scriptet, minden jó, csak van egy hiba (szerintem a webhosttal), hogy amikor rá megyek a kijelentkezés gombra, akkor átirányít a webhost oldalára, hogy nincs ilyen oldal (000webhoston vagyok), miért?
Tudsz valami megoldást?

Rimelek képe

Ha felgörgetsz a lap tetejére, ott a link, ami a másik blogbejegyzésre mutat, ami nem kifejezetten a jogokkal foglalkozik. És ott valahol a vége felé leírtam a webhost beállításait is. Ha azt végig követed, szerintem megoldja a problémád.

Suvel képe

Szia,
Hogyan lehet olyat létrehozni, hogy az oldal tartalma minden felhasználónk más?
Tehát úgy mint egy böngészős játékban, ha valaki épít valamit, az a másik felhasználónak nem lesz meg.Ilyen adatlap féle.
Remélem érted.
Üdv

Rimelek képe

Erre elvileg már válaszoltam és nem látom a választ. Érdekes.

Szóval azt építesz a loginba, amit akarsz. Már amennyiben tudsz adatbázist kezelni és értesz a php-hez. De a login nem ad hozzá külön támogatást. Innentől általános sql és php kérdés. Hogy ki, mit lát és ezt hogyan oldod meg, az csak tőled függ.