Avatar billede janos Nybegynder
05. marts 2006 - 10:34 Der er 16 kommentarer og
1 løsning

Login med begrænset adgang

Er det muligt at lave et Login som - afhængigt af brugernavn/password - sender brugerne til forskellige sider?

Jeg anvender pt. et javascript til ovennævnte, men vil gerne have noget med lidt større sikkerhed. Evt. i kombination med MySQL.
Er det muligt?

På forhånd tak.
Avatar billede radion Nybegynder
05. marts 2006 - 11:04 #1
Ja, det kan sagtens lade sig gøre.

Jeg bruger en niveau opdeling, dvs. i min database har jeg bla. følgende felter

brugernavn,kode,level

fx. henrik,h82ks87ajshf6faksdjahd,2

dernæst har jeg så et array

$arr_levelstart=array(0=>'side0.php',1=>'side1.php',2=>'side2.php');

når folk så logger ind, checker jeg deres level og de ryger videre til
Header('Location:'.$arr_levelstart[$level]);

håber det hjælper :)
Avatar billede janos Nybegynder
05. marts 2006 - 11:25 #2
Hej radion

Jeg er nybegynder inden for dette felt - så jeg behøver at få det penslet lidt mere ud:

MySQL er jeg  vist med på - der skal oprettes 3 felter med - brugernavn/kode/level
Der skal laves en login side med connection til databasen.

Side 1 - 2 osv. skal have indsat Header? er det korrekt

Array - der begynder jeg at stå af - er det kode der skal indsættes på en webside?

Kan du evt. lave et kort eksempel og gerne ridse lidt mere specifikt op?
Avatar billede Slettet bruger
05. marts 2006 - 11:43 #3
<?php
# Forudsætter du har en session med brugernavn og password
function userLevel($username)
{
  openmysql();
  $sql = mysql_query("SELECT level FROM foo WHERE brugernavn = '$username' LIMIT 1");
  closemysql();
return mysql_result($sql,0,0);
}

function checkLogin($brugernavn, $password)
{
  openmysql();
  $sql = mysql_query("SELECT brugernavn FROM foo WHERE brugernavn = '$brugernavn' AND password = '$password' LIMIT 1");
  closemysql();
 
  if(mysql_num_rows($sql) > 0)
    return true;
  else
    return false;
}

$arr_levelstart=array(0=>'side0.php',1=>'side1.php',2=>'side2.php');
$brugernavn = $_SESSION["brugernavn"]; // kunne fx. være _POST["brugernavn"]
$password = $_SESSION["password"];

if(!checkLogin($brugernavn, $password))
  header("Location: login_form.php");

$userlevel = userLevel($brugernavn);
header('Location:'.$arr_levelstart[$level]);

?>

bare et eksempel (ikke testet)
Avatar billede janos Nybegynder
05. marts 2006 - 12:15 #4
Hej ksvendsen

Tak for dit indlæg, du har sikkert helt ret, men nu er jeg endnu mere forvirret. Igen - jeg er nybegynder og må have det serveret lidt mere specifikt.

Det eksempel du har vist - er det selve login scriptet som skal indsættes på login.php? Hvis ja, hvor skal det indsættes?
Avatar billede radion Nybegynder
05. marts 2006 - 13:23 #5
Her er lige lidt omkring arrays :)
http://www.webcafe.dk/artikler/php/arrays/

Ksvendsens kode er faktisk nøjagtig hvad du har spurgt om :) Den henter den level fra databasen som brugernavnet er knyttet sammen med
Så checker den om brugernavn og kode er rigtig
og til sidst sender den folk videre til den side der passer sammen med brugernavnets level

og de sider der hænger sammen med levels bliver defineret i
$arr_levelstart=array(0=>'side0.php',1=>'side1.php',2=>'side2.php');

hvor 0,1,2 er levels, og side0.php,side1.php,side2.php er de sider man bliver sendt videre til :)
Avatar billede janos Nybegynder
05. marts 2006 - 13:48 #6
radion/ksvendsen

Jeg vil kigge nærmere på det I er kommet med og forsøge at få en mening ud af det - jeg vender tilbage - men nok tidligst mandag, da jeg er på vej på arbejde :-(
Avatar billede janos Nybegynder
06. marts 2006 - 17:40 #7
Hej igen - jeg har eksperimenteret og læst og tror at jeg er blevet lidt klogere, MEN jeg følger at der er et stykke vej endnu.
Ved hjælp af bl.a. Dreamweaver er jeg nået frem til følgende kode som er indsat på login.php:

<?php require_once('Connections/janos.php'); ?>
<?php
// *** Validate request to login to this site.
session_start();

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($accesscheck)) {
  $GLOBALS['PrevUrl'] = $accesscheck;
  session_register('PrevUrl');
}

if (isset($_POST['brugernavn'])) {
  $loginUsername=$_POST['brugernavn'];
  $password=$_POST['adgangskode'];
  $MM_fldUserAuthorization = "niveau";
  $MM_redirectLoginSuccess = "velkommen.php";
  $MM_redirectLoginFailed = "login_fejl.php";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_jan, $jan);
     
  $LoginRS__query=sprintf("SELECT brugernavn, adgangskode, niveau FROM brugere WHERE brugernavn='%s' AND adgangskode='%s'",
  get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
 
  $LoginRS = mysql_query($LoginRS__query, $jan) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
   
    $loginStrGroup  = mysql_result($LoginRS,0,'niveau');
   
    //declare two session variables and assign them
    $GLOBALS['MM_Username'] = $loginUsername;
    $GLOBALS['MM_UserGroup'] = $loginStrGroup;         

    //register the session variables
    session_register("MM_Username");
    session_register("MM_UserGroup");

    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];   
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>

Er én af jer i stand til at tilrette den efter mit behov?

På side0.php har jeg følgende kode:

<?php
session_start();
$MM_authorizedUsers = "bruger";
$MM_donotCheckaccess = "false";

// *** Restrict Access To Page: Grant or deny access to this page
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
  // For security, start by assuming the visitor is NOT authorized.
  $isValid = False;

  // When a visitor has logged into this site, the Session variable MM_Username set equal to their username.
  // Therefore, we know that a user is NOT logged in if that Session variable is blank.
  if (!empty($UserName)) {
    // Besides being logged in, you may restrict access to only certain users based on an ID established when they login.
    // Parse the strings into arrays.
    $arrUsers = Explode(",", $strUsers);
    $arrGroups = Explode(",", $strGroups);
    if (in_array($UserName, $arrUsers)) {
      $isValid = true;
    }
    // Or, you may restrict access to only certain users based on their username.
    if (in_array($UserGroup, $arrGroups)) {
      $isValid = true;
    }
    if (($strUsers == "") && false) {
      $isValid = true;
    }
  }
  return $isValid;
}

$MM_restrictGoTo = "login_fejl.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) { 
  $MM_qsChar = "?";
  $MM_referrer = $_SERVER['PHP_SELF'];
  if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
  if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
  $MM_referrer .= "?" . $QUERY_STRING;
  $MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
  header("Location: ". $MM_restrictGoTo);
  exit;
}
?>

Kan den tilrettes?

På forhånd tak.
Avatar billede janos Nybegynder
07. marts 2006 - 21:47 #8
Hej ksvendsen og radion

Da jeg endnu ikke har hørt fra jer tager jeg det som udtryk for, at I ikke kan hjælpe mere. Som tak for den hjælp i allerede har givet vil jeg gerne dele pointene mellem jer - så smid lige nogle svar.

Mvh.
Avatar billede radion Nybegynder
07. marts 2006 - 22:21 #9
Jeg vil foreslå dig at læse på www.webcafe.dk de har en glimrende startguide til php + mysql, maskinlavet kode som i dreamveawer, eller andres kode er altid sværere at rette til, da man skal gennemlæse og forstå alt.. prøv dig i stedet frem, og skriv her  på eksperten når det kniber :)
Avatar billede Slettet bruger
07. marts 2006 - 22:38 #10
Jeg har skam lavet lidt matriale til dig... har ikke testet det... men har været lidt stresset den her uge..
Brug det som udgangspunkt måske.. har prøvet og lavet det så effektivt som muligt.. men stadig simpelt (Svær sammensætning)

Config:
<?php
session_start();
$arr_levelstart=array(    1=>'level1.php',
                        2=>'level2.php',
                        3=>'level3.php');

function userLevel($username)
{
  openmysql();
      $sql = mysql_query("SELECT level FROM foo WHERE brugernavn = '$username' LIMIT 1");
  closemysql();
return mysql_result($sql,0,0);
}

function checkLogin($level = null)
{
    if(!isset($_SESSION["brugernavn"]) || !isset($_SESSION["password"]))
    {
        header("Location: login.php");
        exit();
    }
   
    $brugernavn = $_SESSION["brugernavn"];
    $password = $_SESSION["password"];
   
    if(userLevel($brugernavn) < $level) // tjekker om bruger har adgang
    {
        header("location: index.php"); // Hvis ikke, sender vi ham til medlems forsiden
        exit();
    }
   
    openymsql();
        $sql = mysql_query("SELECT id FROM foo WHERE brugernavn = '$brugernavn' AND password = '$password' LIMIT 1");
       
    closemysql();
    if(mysql_num_rows($sql) <= 0)
    {
        header("Location: login.php");
        exit();
    }
}

function validateLogin($brugernavn, $password)
{
  openmysql();
      $sql = mysql_query("SELECT id FROM foo WHERE brugernavn = '$brugernavn' AND password = '$password' LIMIT 1");
  closemysql();
 
  if(mysql_num_rows($sql) > 0)
    return true;
  else
    return false;
}

?>

Login.php
<?php
require("config.php");
$error = null;

if(isset($_GET["login_action"]))
{
    $brugernavn = $_POST["brugernavn"];
    $password = $_POST["password"];
   
    if(validateLogin($brugernavn, $password))
    {
        $userlevel = userLevel($brugernavn);
        $_SESSION["brugernavn"] = $brugernavn;
        $_SESSION["password"]= $password;
        header('Location:'.$arr_levelstart[$level]);
    }
    else
        $error = "<i>Forkert brugernavn/password</i>";
}

if(isset($_SESSION["brugernavn"]) && isset($_SESSION["password"]))
{
    unset($_SESSION);   
}

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Login</title>
</head>

<body>
<?=$error?>
<form action="?login_action=true" method="POST">
Brugernavn: <input type="text" name="brugernavn"  /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>

index.php
<?php
require("config.php");
checkLogin();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Alle medlemmers side :)</title>
</head>

<body>
<h2>Denne side vil alle medlemmer kunne se</h2>
<h2>Dit level er <?=userLevel($_SESSION['brugernavn'])?></h2>
</body>
</html>


level1.php
<?php
require("config.php");
checkLogin(1);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Level 1</title>
</head>

<body>
<h2>Velkommen til level 1, dit level er <?=userLevel($_SESSION['brugernavn'])?></h2>
<a href="index.php">Gå til siden for alle</a>
</body>
</html>


level2.php
<?php
require("config.php");
checkLogin(2);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Level 1</title>
</head>

<body>
<h2>Velkommen til level 2, dit level er <?=userLevel($_SESSION['brugernavn'])?></h2>
<a href="index.php">Gå til siden for alle</a>
</body>
</html>


level3.php

<?php
require("config.php");
checkLogin(3);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Level 1</title>
</head>

<body>
<h2>Velkommen til level 3, dit level er <?=userLevel($_SESSION['brugernavn'])?></h2>
<a href="index.php">Gå til siden for alle</a>
</body>
</html>




Håber du eller andre kan bruge det til noget... som sagt, det er ikke testet :)

Mysql database
id -> auto_increment - primary
brugernavn -> varchar(30)
password -> varchar (32) mener jeg :) så kan du også kryptere med md5
level -> varchar (10)
Avatar billede janos Nybegynder
08. marts 2006 - 12:42 #11
Hej ksvendsen - jeg vil snarest teste dit forslag og vender så tilbage. Foreløbig tak.
Avatar billede janos Nybegynder
08. marts 2006 - 20:30 #12
ksvendsen

Jeg har nu oprettet en database efter dine anvisninger og siderne: config.php - login.php - index.php - level1.php - level2.php - level3.php er lavet og placeret i samme mappe.
Når jeg indtaster en kombination af brugernavn/password får jeg følgende fejlmelding:

Fatal error: Call to undefined function: openmysql() in C:\Programmer\Apache Group\Apache2\htdocs\web\Login\config.php on line 45

Line 45 i config.php: openmysql();

Login siden har jeg forbundet med databasen - er der andre sider der skal forbindes? Jeg er lidt i tvivl om hvilken funktion config.php har.

Mvh.
Avatar billede Slettet bruger
09. marts 2006 - 20:56 #13
require_once("mysql_functions.php");


mysql_functions.php
<?php
/*
* MySQL Functions
* Basic file is coded by Webcafe.dk
* Futher development by KSvendsen
*
* Version: 1.2
*/
function openmysql()
{
        // Connection variables
        $localhost = "localhost";
        $user = "root";
        $password = "";
        $database = "loginsecurity_sample";


        // Die variables
        $conndie = "Kan ikke forbinde til " . $localhost . " fordi: "; // In english: Can't connect to - --- - because:
        $dbdie = "Kan ikke vælge databasen: " . $database; // In english: Could not choose database:

        $connection = mysql_connect( $localhost, $user, $password) or die( $conndie . mysql_error() );
        mysql_select_db( $database ) or die( $dbdie );
}

function query($sql)
{
        $result = mysql_query($sql) or die( "Query fejlede : " . mysql_error() );
}

function closemysql()
{
        mysql_close();
}

// MySQL Single Query
function mysqlsq($query)
{
    openmysql();
        $result = query($query);
    closemysql();
   
return $result;
}
?>
Avatar billede janos Nybegynder
09. marts 2006 - 21:46 #14
ksvendsen

øh - hvor kommer denne fil så ind? eller kom den i stedet for én af de andre?
Avatar billede Slettet bruger
09. marts 2006 - 22:32 #15
opret en fil der hedder mysql_functions.php og put indholdet (overstående) ind i.. (uden require_once)

og ændre config.php til

<?php
session_start();
require_once("mysql_functions.php")
$arr_levelsta...........
........................
........................
........................
Avatar billede janos Nybegynder
09. marts 2006 - 23:18 #16
:-( nu får jeg en fejl linje 4 i config.php - $arr_levelstart=array(1=>'level1.php', 2=>'level2.php', 3=>'level3.php');

ksvendsen det er megen tid og mange kræfter du har brugt på dette, så det er fuldt forståeligt, hvis du stopper nu.

Mvh.
Avatar billede Slettet bruger
10. marts 2006 - 00:55 #17
Det er fint :) (tak fordi du nævner det ;) <- respekt!


Hvad er fejlen? ... kan lige prøve og tjekke imorgen og rette eventuelle fejl :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester