我在这里疯了。这似乎应该是如此简单,也许它只是盯着我,我没有看到它。我有特定的说明在Kohana 3.2中创建一个登录页面,该页面使用AJAX处理表单并使用纯文本用户名和密码对模型进行身份验证。这只是一项明显旨在让我难堪的练习,呵呵。所以不,安全不是问题。没有数据库,也没有内容可供利用。
我目前使用auth配置文件中的默认“文件”驱动程序使用Auth工作的登录表单。
应用/配置/ auth.php
return array(
'driver' => 'file',
'hash_method' => 'sha256',
'hash_key' => 'testkey',
'lifetime' => 30000,
'session_type' => Session::$default,
'session_key' => 'auth_user',
// Username/password combinations for the Auth File driver
'users' => array(
'admin' => 'be4039381cf04bb778de68e6520a77c7d8b5e6d146f932f0759e681a46bfc120',
),
);
但是我一直在搜索和搜索如何更改此项以使用AJAX提交和授权的示例。我在is_ajax和Controller_Templates等海里游泳。我现在使用Kohana大约28个小时。有人会帮我解决这个问题吗?
应用/视图/用户/ login.php中
<?= Form::open('user/login',array('class'=>'form-signin')); ?>
<h2 class="form-signin-heading">Sign in</h2>
<?php if (isset($message)) : ?>
<h3 class="message">
<?= $message; ?>
</h3>
<?php endif; ?>
<!-- Username Field -->
<?php $uArray = array('type'=>'text','class'=>'input-block-level','placeholder'=>'Username = admin'); ?>
<?= Form::input('username',NULL,$uArray); ?>
<!-- Password Field -->
<?php $pwArray = array('class'=>'input-block-level', 'placeholder'=>'Password = password'); ?>
<?= Form::password('password',NULL,$pwArray); ?>
<!-- Checkbox -->
<?= Form::checkbox('remember','remember'); ?>
<?= Form::label('remember', 'Remember Me',array('class'=>'checkbox','label'=>'Remember')); ?>
<br />
<!-- Submit Buton -->
<?= Form::submit('login', 'Login',array('class'=>'btn btn-large btn-primary')); ?>
<?= Form::close(); ?>
应用/类/控制器/ user.php的
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_User extends Controller_Template {
public function action_index()
{
$this->template->content = View::factory('user/index');
// Load the user information
$user = Auth::instance()->get_user();
// if a user is not logged in, redirect to login page
if ($user)
{
$this->template->content = View::factory('user/welcome')
->bind('user', $user);
}
}
public function action_login()
{
// if a user is already logged in then redirect them to the index.
if (Auth::instance()->logged_in())
{
// User is logged in, continue on
Request::current()->redirect('user/index');
}
$this->template->content = View::factory('user/login')
->bind('message', $message);
if (HTTP_Request::POST == $this->request->method())
{
// Attempt to login user
$remember = array_key_exists('remember', $this->request->post()) ? (bool) $this->request->post('remember') : FALSE;
$user = Auth::instance()->login($this->request->post('username'), $this->request->post('password'), $remember);
// If successful, redirect user
if ($user)
{
$this->template->content = View::factory('user/welcome')
->bind('user', $user);
}
else
{
$message = 'Login failed';
}
}
}
public function action_logout()
{
// Log user out
Auth::instance()->logout();
// Redirect to login page
Request::current()->redirect('user/login');
}
}
应用/类/模型/ user.php的
<?php defined('SYSPATH') OR die('No Direct Script Access');
我对Kohana不熟悉,我甚至不确定该放入模型中。现在,Auth正在使用它自己的文件来存储用户数组。但我的指示是让模型存储用户名和密码。
提前感谢您提供的任何帮助!
答案 0 :(得分:1)
好的我昨晚发现了。我将回答我自己的问题以供将来参考。虽然我仍然使用Auth来处理用户会话,但我没有对它进行身份验证。我正在使用
Auth::instance()->force_login($username)
按照我的要求对模型进行身份验证后强制登录。
首先,我更改了登录页面以简化并添加一些AJAX。
<强> /application/views/user/login.php 强>
<form id="loginForm" class="form-signin">
<h2 class="form-signin-heading">Sign in</h2>
<div class="message" id="message"></div>
<!-- Username Field -->
<input type="text" id="username" class="input-block-level" placeholder="Username = admin" />
<!-- Password Field -->
<input type="password" id="password" class="input-block-level" placeholder="Password = password" />
<!-- Submit Buton -->
<input type="submit" id="login" value="Sign In" class="btn btn-large btn-primary" />
</form>
<script type="text/javascript">
$(document).ready(function() {
$("#login").click(function() {
var action = $("#loginForm").attr('action');
var form_data = {
username: $("#username").val(),
password: $("#password").val(),
is_ajax: 1
};
$.ajax({
type: "POST",
url: '/user/checkLogin',
data: form_data,
success: function(response)
{
if(response == 'success')
window.location.replace('/user');
else
$("#message").html("<div class='alert alert-error'><button type='button' class='close' data-dismiss='alert'>×</button>Invalid username and/or password.</div>");
}
});
return false;
});
});
</script>
然后我添加了一个带有明文用户名和密码的简单模型。 (这也是概念的主旨,绝不是一种安全的认证方式)。
<强> /application/classes/model/user.php 强>
<?php defined('SYSPATH') OR die('No Direct Script Access');
Class Model_User extends Model
{
public function checkLogin($username, $password)
{
// These are the username and password to verify against
$user = "admin";
$pass = "password";
// Compare and return boolean
if ($username === $user && $password === $pass){
return TRUE;
} else {
return FALSE;
}
}
}
然后我将checkLogin操作添加到用户控制器(因为这是我在登录页面上从我的AJAX调用的)来处理登录。
<强> /application/classes/controller/user.php 强>
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_User extends Controller_Template {
public function action_index()
{
// Load the user information
$user = Auth::instance()->get_user();
// if a user is logged in, redirect to welcome page
if ($user){
$this->template->content = View::factory('user/welcome')
->bind('user', $user);
} else {
$this->template->content = View::factory('user/index');
}
}
public function action_checkLogin()
{
//disable auto rendering if requested using ajax
if($this->request->is_ajax()){
$this->auto_render = FALSE;
}
// Check for post
if($this->request->post()){
// Instantiate the Model Object
$user = new Model_User();
// Get post variables
$username = $this->request->post('username');
$password = $this->request->post('password');
// Check the login
if($check = $user->checkLogin($username,$password)){
// Login the user using auth
$user = Auth::instance()->force_login($username);
// Respond with a success
echo 'success';
} else {
// Respond with a fail
return "fail";
}
}
}
public function action_login()
{
// Load the user information
$user = Auth::instance()->get_user();
// if a user is logged in, redirect to welcome page
if ($user){
$this->template->content = View::factory('user/welcome')
->bind('user', $user);
} else {
$this->template->content = View::factory('user/login')
->bind('message', $message);
}
}
public function action_logout()
{
// Log user out
Auth::instance()->logout();
// Redirect to login page
Request::current()->redirect('user/login');
}
}
现在我有一个很好的简单登录页面,它使用Kohana框架中的AJAX对模型进行身份验证。这不是火箭手术,但有趣的是弄清楚这些不同的框架是如何运作的。希望它能帮助将来的某个人。干杯!
答案 1 :(得分:0)
我正在使用此答案尝试作为评论与代码进行通信,而不一定是作为答案。那说:
这适合你吗?
public function action_index()
{
$this->template->content = View::factory('user/index')
->bind('user', $user);
$ user没有在那里定义,所以我认为这会导致错误。
另外,我不确定你的用户模型在哪里发挥作用。如果没有数据库绑定到用户,那么kohana不依赖于用户模型,就像您使用ORM一样。那么,为什么需要在模型实例中存储任何内容,如果该实例仅在页面更改时被抛出?假设它意味着在登录时你会说$user = new User_Model();
之类的内容,然后分配私有变量或其他内容。
而这“但我的指示是让模型存储用户名和密码。”这个人的要求的目标是什么?教你?或者,如果登录后可以获得用户信息?