Внедрение учетных записей пользователей в систему входа Php - PullRequest
0 голосов
/ 24 ноября 2011

Я хочу установить и ОБЕСПЕЧИТЬ разрешения пользователя на моем веб-сайте.

У меня есть две группы пользователей: покупатели и продавцы.

Например, для покупателей у меня (в / логин / каталог):

<form method="post" action="check_buyer.php" id="LoggingInBuyer">
    <div style="width:265px;margin:0; padding:0; float:left;">
        <label>Username:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
             <span><a href="#">Forgot Username?</span></a>
        </label>
        <br />
        <input id="UserReg" style="width:250px;" type="text" name="userName" tabindex="1" class="required" />
    </div>
    <div style="width:265px;margin:0; padding:0; float:right;">
        <label>Password:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <span><a href="#">Forgot Password?</span></a></label>
        <br />
        <input id="UserReg" style="width:250px;" type="password"  name="userPass" tabindex="2" class="required" />
    </div>
    <div class="clearB"> </div>
    <input type="submit" style="width:100px; margin:10px 200px;" id="UserRegSubmit" name="submit" value="Login" tabindex="3" />
</form>

PHP-скрипт check_buyer.php:

<?php
session_start(); #recall session from index.php where user logged include()

function isLoggedIn()
{
    if(isset($_SESSION['valid']) && $_SESSION['valid'])
        header( 'Location: buyer/' ); # return true if sessions are made and login creds are valid
    echo "Invalid Username and/or Password";  
    return false;
}

require_once('../inc/db/dbc.php');

$connect = mysql_connect($h, $u, $p) or die ("Can't Connect to Database.");
mysql_select_db($db);

$LoginUserName = $_POST['userName'];
$LoginPassword = mysql_real_escape_string($_POST['userPass']);
//connect to the database here
$LoginUserName = mysql_real_escape_string($LoginUserName);
$query = "SELECT uID, uUPass, dynamSalt, uUserType FROM User WHERE uUName = '$LoginUserName';";

$result = mysql_query($query);
if(mysql_num_rows($result) < 1) //no such USER exists
{
    echo "Invalid Username and/or Password";
}
$ifUserExists = mysql_fetch_array($result, MYSQL_ASSOC);

function validateUser() {
    $_SESSION['valid'] = 1;
    $_SESSION['uID'] = $uID;
    $_SESSION['uUserType'] = 1; // 1 for buyer - 2 for merchant
}

$dynamSalt = $ifUserExists['dynamSalt'];  #get value of dynamSalt in query above
$SaltyPass = hash('sha512',$dynamSalt.$LoginPassword); #recreate originally created dynamic, unique pass

if($SaltyPass != $ifUserExists['uUPass']) # incorrect PASS
{
    echo "Invalid Username and/or Password";
}

else {
validateUser();
}
// If User *has not* logged in yet, keep on /login
if(!isLoggedIn())
{
    header('Location: index.php');
    die();
}
?>

Если введен действительный пользователь .. он переходит в / логин / каталог покупателя

<?php
session_start();
if($_SESSION['uUserType']!=1)
{ 
    echo 'the userid: ' . $userid . '<br>' . 'the type is ' . $userType . '<br>';
    die("You may not view this page. Access denied.");
}

function isLoggedIn()
{
    return (isset($_SESSION['valid']) && $_SESSION['valid']);
}

//if the user has not logged in
if(!isLoggedIn())
{
    header('Location: index.php');
    die();
}
?>

<?php 
    if($_SESSION['valid'] == 1){
        #echo "<a href='../logout.php'>Logout</a>";
        require_once('buyer_profile.php');
    }
    else{
        echo "<a href='../index.php'>Login</a>";
    }
?>

Проблема однажды вошла в систему как buyer, я могу просто ввести: login/merchant, и она меня туда доставит, хотя поле в сеансе $_SESSION['uUserType'] постоянно повторяется в = 1.

Как мне запретить пользователям просто вводить login/merchant в URL, и они могут получить к нему доступ?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Во-первых, вы не можете запретить пользователям вводить определенный URL-адрес. Единственный способ ограничить определенные скрипты или разделы кода для определенных пользователей - это с помощью кода [или, ну, в общем, определенных настроек Apache].

Этот код неверен, поскольку он (вероятно) написан для проверки существования сеанса, но он не проверяет, является ли сеанс ПОКУПАТЕЛЕМ :

function isLoggedIn()
{
    if(isset($_SESSION['valid']) && $_SESSION['valid'])
        header( 'Location: buyer/' ); # return true if sessions are made and login creds are valid
    echo "Invalid Username and/or Password";  
    return false;
}

Вам нужно также проверить $_SESSION['uUserType'].

Я бы инкапсулировал весь материал внутри класса:

class CUserRole {

  const USER_NO_ROLE  = 'user.noRole';
  const USER_BUYER    = 'user.buyer';
  const USER_MERCHANT = 'user.merchant';

  const PAGE_LOGIN    = 'index.php';


  static 
  public function getCurrentUserRole() {

    if ( ! isset( $_SESSION )) {
       return self::USER_NO_ROLE;
    }

    switch( $_SESSION['uUserType'] ) {
      case 1:
       return self::USER_BUYER;

      case 2:
       return self::USER_MERCHANT;

      default:
        die( 'Inconsistent/Invalid uUserType' );
    }

  }

  static 
  public function forwardIfNotRole( $aRole, $forwardAddress = self::PAGE_LOGIN ) {

    if ( $aRole != self::getCurrentUserRole() ) {

      header( 'Location: ' . forwardAddress );
      exit;

    }

  }

  static 
  public function evaluateCredentials( ) {

    // checks passed login parameters against the DB
    // and sets up the session with appropriate values

  }

}

Везде, где необходимо, добавьте эту строку в начале вашего скрипта:

CUserRole::forwardIfNotRole( CUserRole::USER_BUYER, 'some/where/address' );  

Или просто, чтобы переслать в index.php:

CUserRole::forwardIfNotRole( CUserRole::USER_BUYER );  

Это решение включает основную часть управления вашими ролями в отдельный класс.

Наконец,Я не вижу причины, по которой нужно установить это:

$_SESSION['valid'] = 1;

Использование статических методов - довольно простое решение, использование дизайна singleton pattern было бы намного лучше.

1 голос
/ 24 ноября 2011

У вас есть

session_start();
if( 2!== $_SESSION['uUserType'])
{ 
    ///login/merchant content goes here (login form, whole page, etc.)
} else {
   header("location: http://www.example.com/whatever/buyer_page.php"); 
    //redirect to whatever page you want
    //or instead of header you could do an 
    //echo "You're already logged in" or whatever message you want
}

На ваших страницах продавцов? (Каждая страница, на которую вы не хотите, чтобы покупатели имели доступ)

Важно отметить, что НЕТ HTML не может быть выведен до того, как вы используете заголовок ("location .... сюда входят пробелы за пределами тегов. Поэтому убедитесь, что до открытия нет пробелов".

...