1

さて、私はここで夢中になります。これはとてもシンプルなはずだと思われるもので、たぶんそれは私を顔で見つめているだけで、私はそれを見ていません。AJAXを使用してフォームを処理し、プレーンテキストのユーザー名とパスワードを使用してモデルに対してのみ認証するKohana3.2でログインページを作成するための具体的な手順があります。これは、私を困らせるように明確に設計された演習です。いいえ、ここではセキュリティは問題ではありません。悪用されるデータベースやコンテンツはありません。

私は現在、authconfigファイルのデフォルトの「file」ドライバーを使用してAuthを使用するだけでログインフォームを機能させています。

application / config / 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などの海で泳いでいます。コハナを約28時間使用しています。誰かが私がこれを理解するのを手伝ってくれますか?

application / views / user / 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(); ?>

application / classes / controller / 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');
    }

}

application / classes / model / user.php

<?php defined('SYSPATH') OR die('No Direct Script Access');

私はコハナに不慣れなので、モデルに何を入れるべきかさえわかりません。現在、Authは独自のファイルを使用してユーザー配列を保存しています。しかし、私の指示は、モデルにユーザー名とパスワードを保存させることです。

助けてくれてありがとう!

4

2 に答える 2

0

わかりました、昨夜それを理解しました。今後の参考のために、私自身の質問に答えます。Authを使用してユーザーセッションを処理している間は、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を使用してモデルを認証する簡単なログインページができました。ロケット手術ではありませんが、これらのさまざまなフレームワークがどのように機能するかを理解するのは興味深いことです。それが将来誰かに役立つことを願っています。乾杯!

于 2012-12-07T16:57:29.627 に答える
0

この回答を使用して、必ずしも回答として機能するわけではなく、コードでコメントとして通信しようとしています。それは言った:

これはあなたのために働いていますか?

public function action_index()
    {
        $this->template->content = View::factory('user/index')
            ->bind('user', $user);

$user はそこで定義されていないため、エラーが発生すると思います。また、ここでユーザーモデルがどこに作用するのかわかりません。ユーザーに関連付けられたデータベースがない場合、kohana は ORM を使用している場合のようにユーザー モデルに依存しません。では、ページが変更されたときにのみインスタンスが破棄される場合、モデル インスタンスに何かを格納する必要があるのはなぜでしょうか? ログイン時に次のように言うことを意味すると仮定すると$user = new User_Model();、プライベート変数または何かを割り当てます。

そして、この「しかし、私の指示は、モデルにユーザー名とパスワードを保存させることです。」この人の要求の目的は何ですか? 教えるため?または、ログインしている場合にユーザー情報を利用できるようにしますか?

于 2012-12-07T01:47:24.763 に答える