我对MVC风格的编程非常陌生。我有一个管理脚本,我希望能够将用户凭据集成到我的浏览器应用程序中。用户信息,例如用户名、电子邮件、姓名等。此系统的文档为生成此信息提供了清晰的说明。我已经在以下脚本中这样做了,该脚本工作正常,但它将始终返回"AUTH_NO_SESSION",因为我无法允许用户登录以获取此信息,这是我的问题:
用户信息 (user_cred.php)
include_once("includes.php");
$auth = new TAuthentication();
$accept_roles = array('plugin');
$auth_result = $auth->validateSession($accept_roles);
if ($auth_result->auth_code == AUTH_NO_SESSION) {
header('Access-Control-Allow-Origin: *');
echo "AUTH_NO_SESSION";
// means that no session was found, therefore the page is being accessed anonymously.
} elseif ($auth_result->auth_code == AUTH_OKAY) {
header('Access-Control-Allow-Origin: *');
echo "AUTH_OKAY";
// means that there was a session and the user owns all the required roles to access this content.
} elseif ($auth_result->auth_code == AUTH_INSUFFICIENT_ROLES) {
header('Access-Control-Allow-Origin: *');
echo "AUTH_INSUFFICIENT_ROLES";
// means that a session exists, but the user does not own the required roles to access this content.
} else {
// no code here
}
浏览器应用程序将从上面的文件侦听user_cred.php
检索用户数据。就从此 php 文件请求信息而言,一切正常。我面临的问题实际上是获取用户信息,唯一的方法是让用户登录他们的帐户。其他明智的是,什么都不会被给予。
浏览器应用程序
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","user_cred.php",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h2>Using the XMLHttpRequest object</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</body>
</html>
在管理系统中,有一个具有以下登录表单的view
文件。以便用户和访问网站。您还具有包含登录代码的主索引文件。以我有限的知识,我已经看过这个,并相信这两个文件将帮助我使用我的脚本,以便用户可以从浏览器应用程序登录并获取他们的用户凭据。我的想法是将 index.php 文件中的代码添加到 user_cred.php 文件中,以便我可以将这样的 url http://website.com/user_cred.php?username=admin&pass=test&signin=Login
添加到 javascript httprequest 中,并以这种方式获取用户信息
登录视图
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
<ul>
<li class="listitem">
<div class="row">
<label>Username:</label>
<input class="textbox" type="text" name="username" value="" maxlength="80"/>
</div>
<div class="row">
<label>Password:</label>
<input class="textbox" type="password" name="password" value="" maxlength="80"/>
</div>
</li>
<li class="listitem">
<div class="row">
<input class="form-button" type="submit" name="signin" value="Signin"/>
<a class="loginoptions indentmore" href="signup.php">Signup</a>
<a class="loginoptions" href="resetpassword.php">Forgot your password?</a>
</div>
</li>
</ul>
</form>
索引.php
include_once("includes.php");
class TSigninController extends TAbstractController {
public function run($allowedRoles = null)
{
$this->allowedRoles = $allowedRoles;
$this->execute();
}
protected function execute()
{
$this->auth_result = parent::validateSession(null);
if ($this->auth_result->auth_code == AUTH_OKAY)
{
$this->goToAfterSignInPage($this->auth_result->roles);
}
else if (!$this->getUserAction())
{
$this->loadview("signin");
}
else
{
$this->signin();
}
}
protected function signin()
{
$input = $this->getUserInput();
$model = $this->loadmodel("Users");
$account = $model->getUser($input["username"], $input["password"]);
if ($account == null || sizeof($account) == 0)
{
$data = array("error" => "Could not sign you in");
$this->loadview("signin", $data);
return;
}
if ($account["disabled"] == 1 || $account["admin_disabled"] == 1)
{
$data = array("error" => ($account["admin_disabled"] == 0) ? "This account is disabled." : "This account is been locked by the admin. Please contact the site admin!");
$this->loadview("signin", $data);
return;
}
$this->createNewSession($account);
$this->goToAfterSignInPage($account["roles"]);
}
protected function createNewSession($account) {
$model = $this->loadmodel("Sessions");
$sessionid = crypt($account["username"] . date('now'));
$_SESSION['SESSIONID'] = $sessionid;
$model->createNewSession($sessionid, $account["id"]);
}
public function goToAfterSignInPage($roles)
{
foreach($roles as $role)
{
if ($this->utils->stringsEqual($role["name"], "admin", false))
{
$this->redirect(SITE_URL . "/admin/dashboard.php");
return;
}
}
$this->redirect(SITE_URL . "/user/userprofile.php");
}
protected function getUserAction()
{
if ($this->post("signin"))
return "signin";
else
return null;
}
protected function getUserInput()
{
return array(
"username" => $this->post("username"),
"password" => $this->post("password")
);
}
}
$controller = new TSigninController();
$controller->run();
总之,我正在寻求帮助,以便我制作一个 php 脚本user_cred.php
允许用户从我的浏览器应用程序中访问他们的凭据。所以任何有MVC和PHP知识的人,我都会非常伟大。
由SharpUMS提供的MVC描述非常可怕。而获取 SharpUMS 源代码所需的努力让我认为它不是一个开源项目......哦,好吧。
$auth_result->auth_code === AUTH_NO_SESSION
true
可能有两个原因:
-
$_SESSION['SESSIONID']
为空 -
在数据库中找不到会话 ID:
来自: sharpums/_application/models/Session.php
SELECT s.userid, s.id, s.started_on, ( DATE_ADD( s.started_on, INTERVAL $this->sessionlength SECOND ) < NOW() ) expired FROM sessions s WHERE s.id = '$sessionid'
基本上,机器人原因可以追溯到索引.php。我猜,这种方法永远不会执行:
protected function createNewSession($account) {
$model = $this->loadmodel("Sessions");
$sessionid = crypt($account["username"] . date('now'));
$_SESSION['SESSIONID'] = $sessionid;
$model->createNewSession($sessionid, $account["id"]);
}
您应该尝试找出 signin()
方法在此时终止。
旁注
免费建议:由于以下原因,不要将SharpUMS作为您在MVC中应用或研究的基础:
- 确保单个数据库连接
TDatabase
使用全局状态来保持连接 - 它与古老的
mysql_*
API 紧密绑定,该 API 正在弃用中 TAbstractModel
并不是真正抽象的,它在构造函数中创建新的数据库实例- 设计问题:核心类取决于模型(核心外部)
-
TUtilities
类是一个巨大的垃圾场(参见 2.1 采用者模式) - 密码存储为简单的MD5哈希..听说LinkedIn事件了吗?
- 针对 SQL 注入的弱保护:利用
preg_*
和addslashes()
功能