Hallo
Bin gerade an meinem Login und ACL am Designen. Nun frage ich mich ob ich Frontend Benutzer und Backend Benutzer komplett voneinader trennen soll oder nicht. Was ist der bessere und sichere Weg?
Vor allem wenn man sich ins Backend eingeloggt hat sollte man natürlich sich im Frontend auch noch anmelden müssen. Und hier wird es tricky, da tappe ich noch im dunkeln.
Hier wäre mal mein grober Versuch:
Die AUTHORISZE Klasse:
Dann um zu prüfen ob ein User eingelogt ist, wird dann auf jeder Seite eingebunden:
Und zu guter letzt noch das Login script:
und noch als Besipiel zum prüfen ob User Rechte hat:
Was meint Ihr ist das ein guter Weg? Irgendwie sagt mein Bauchgefühl das mit der Abrstakten Klasse ist nicht so gut.
Bin gerade an meinem Login und ACL am Designen. Nun frage ich mich ob ich Frontend Benutzer und Backend Benutzer komplett voneinader trennen soll oder nicht. Was ist der bessere und sichere Weg?
Vor allem wenn man sich ins Backend eingeloggt hat sollte man natürlich sich im Frontend auch noch anmelden müssen. Und hier wird es tricky, da tappe ich noch im dunkeln.
Hier wäre mal mein grober Versuch:
Die AUTHORISZE Klasse:
PHP-Code:
abstract class Auth{
protected $_is_logged_in = false;
protected $_logged_in_user_id = 0;
protected $_user_task_objects;
// Die abgeleitete Klasse zwingen, diese Methoden zu definieren
abstract protected function init();
abstract protected function getUserData($loginname);
abstract protected function setUserLoggedInSession($user_id);
// Gemeinsame Methode
//check login and create session ???
public function login($loginname, $password) {
global $Services, $Session; //just for testing
$login = false;
//check if loginname is username or email
//validate post data
$Validate = $Services->get('validate'); //get Service valdiate
$Validate->addRule($loginname, 'isAlphaNumeric');
//$Validate->addRule($password, 'isPassword');
//password encryption
if ($Validate->isValid()){
$user_check_query = $this->getUserData($loginname);
//checkUser: check if user exist and password is correct
if (!empty($user_check_query)) {
//user exist
//print_r($user_check_query);
//echo 'username exist';
if ($user_check_query['password'] == $password) {
$login = true;
$this->_is_logged_in = true;
$this->_logged_in_user_id = $user_check_query['id'];
$this->setUserLoggedInSession($this->_logged_in_user_id);
$Session->regenerate();
}
}
} else {
//validation has error
$login = false;
}
return $login;
}
public function logout() {}
public function isLoggedIn() {
if ($this->_is_logged_in == true) {
return true;
}
return false;
}
public function getLoggedInUserId() {
return $this->_logged_in_user_id;
}
public function hasPermission($task, $object) {
if ($this->isLoggedIn()) {
if (!empty($this->_user_task_objects)) { //if no task = no permission at all!
foreach($this->_user_task_objects as $Task) {
if ($Task->getObject() == $object) {
if ($Task->getTask() == $task) {
return true;
}
}
}
}
}
return false;
}
public function setUserTaskObjects($user_task_objects) {
$this->_user_task_objects = $user_task_objects;
}
}
//class for frontend
class AuthSite extends Auth{
public function init() {
global $Services, $Session; //just for testing
//start the session
$Session->start();
if (isset($_SESSION['site']['user_id']) && is_numeric($_SESSION['site']['user_id'])) {
$this->_is_logged_in = true;
$this->_logged_in_user_id = $_SESSION['site']['user_id'];
echo 'SESSION EXIST<br>';
//should we also regenerate session id on every new page???
$Session->regenerate();
}
}
//check login and create session ???
protected function getUserData($loginname) {
global $Services, $Session; //just for testing
//database table users
$user_check_query = $Services->get('database')->prepare('SELECT id, password, role_id FROM core_users WHERE username = :username');
$user_check_query->execute(array(':username' => $loginname));
$user_check_query = $user_check_query->fetch();
return $user_check_query;
}
protected function setUserLoggedInSession($user_id) {
$_SESSION['site']['user_id'] = $user_id;
}
} //end class
Dann um zu prüfen ob ein User eingelogt ist, wird dann auf jeder Seite eingebunden:
PHP-Code:
################### include on every site #########################
//$Auth = $Services->get('Auth');
$Auth = new AuthSite(); //later it comes from Services like above
$Auth->init(); //checks if session user_id exist and if sets logged in to true
//create user if logged in
if ($Auth->isLoggedIn()) {
echo 'session user_id exists<br>';
$userFactory = new UserFactory();
//creates User Object and role is assigned
$User = $userFactory->getUser($Auth->getLoggedInUserId()); //creates the user
print_r($User);
//create the user Role
$UserRole = new UserRole();
$UserRole->setRoleId($User->getRoleId());
//create user task objects
$userTaskFactory = new UserTaskFactory();
$UserTasksObjects = $userTaskFactory->getTasksObjects($User->getRoleId());
//assign task object to $Auth
$Auth->setUserTaskObjects($UserTasksObjects);
//print_r($UserTasksObjects);
} else { //just for testing
//not logged in: redirect
echo 'no session user_id exists<br>';
}
################### End include on every site #########################
PHP-Code:
################### login script #########################
$action = (isset($_POST['action']) ? $_POST['action'] : '');
if($action == 'login'){
$login = $Auth->login($_POST['username'], $_POST['password']); //true or false
//login backend user
//$login = $Auth->loginBackend($_POST['username'], $_POST['password']);
if ($login) {
//login successful redirect or whatever
echo 'login succesful<br>';
} else {
//login failed, show error message
echo 'login failed<br>';
}
}
################### login script #########################
und noch als Besipiel zum prüfen ob User Rechte hat:
PHP-Code:
################### testing user permission #########################
//check if User has permission to do a certain task
if ($Auth->hasPermission('edit', 'article_seo')) {
echo 'edit article seo allowed for this user';
} else {
echo 'edit article seo NOT allowed for this user';
}
################### END testing user permission #########################
Was meint Ihr ist das ein guter Weg? Irgendwie sagt mein Bauchgefühl das mit der Abrstakten Klasse ist nicht so gut.
Kommentar