0

我目前正在开发一个项目,该项目允许用户注册并登录到自己的用户区域并添加/编辑/删除注释片段。

我目前正在处理编辑类,我想知道如何才能使其他用户无法访问相同的 url 并编辑某人的笔记?(所有笔记都存储在数据库的同一张表中)

schema = id、title、description、snippet、user_id

例如,如果 user1 想在http://domain.com/edit/1上编辑他的笔记(绑定到他在数据库中的 user_id),我如何阻止 user2 访问相同的 url 并编辑他的笔记?

这是控制器

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Mysnippets extends CI_Controller {

function __construct()
{
    parent::__construct();

    if (!$this->tank_auth->is_logged_in()) {
        redirect('/login/');
    } 

    $this->load->model('dashboard_model');

    $this->data['user_id']  = $this->tank_auth->get_user_id();
    $this->data['username']= $this->tank_auth->get_username();  
}

public function index()
{
    $this->data['private_snippets']  = $this->dashboard_model->private_snippets();
    $this->load->view('dashboard/my_snippets', $this->data);    
}

function edit_snippet($snippet_id) {

    $snippet = $this->dashboard_model->get_snippet($snippet_id);

    //validate form input
    $this->form_validation->set_rules('title', 'Title', 'required');

    if (isset($_POST) && !empty($_POST))
    {       
        $data = array(
            'title' => $this->input->post('title'),
        );

        if ($this->form_validation->run() === true)
        {
            $this->dashboard_model->update_snippet($snippet_id, $data);
            $this->session->set_flashdata('message', "<p>Product updated successfully.</p>");                
            redirect(base_url().'mysnippets/edit_snippet/'.$snippet_id);
        }           
    }

    $this->data['message'] = (validation_errors() ? validation_errors() : $this->session->flashdata('message'));

    $this->data['snippet'] = $snippet;

    //display the edit product form
    $this->data['title'] = array(
        'name'      => 'title',
        'type'      => 'text',
        'value'     => $this->form_validation->set_value('title', $snippet['title']),
    );

    $this->load->view('dashboard/edit_snippet', $this->data);
}
}

继承人模型:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Dashboard_model extends CI_Model {

public function public_snippets()
{
    $this->db->select('id, title, description, author, date_submitted');
    $query = $this->db->get_where('snippets', array('state' => 'public'));
    return $query->result_array();
}

public function private_snippets()
{
    $this->db->select('id, title, description, date_submitted');
    $query = $this->db->get_where('snippets', array('user_id' => $this->tank_auth->get_user_id()));
    return $query->result_array();
}

public function add_snippet($data)
{
    $this->db->insert('snippets', $data);
    $id = $this->db->insert_id();
    return (isset($id)) ? $id : FALSE;
}

public function get_snippet($snippet_id) {
    $this->db->select('id, title');
    $this->db->where('id', $snippet_id);
    $query = $this->db->get('snippets');

    return $query->row_array();
}

public function update_snippet($snippet_id, $data)
{
    $this->db->where('id', $snippet_id);
    $this->db->update('snippets', $data);
}




}

继承人的观点:

    <?php echo $message;?>

    <?php $snippet_id = $snippet['id']; ?>
    <?php echo form_open("mysnippets/edit_snippet/$snippet_id");?>


    <?php echo form_input($title); ?>
    <?php echo form_submit('submit', 'Submit');?>

    <?php echo form_close(); ?>

有没有办法可以限制它所以如果另一个用户试图去那个 url 我可以重定向他们或显示错误消息

4

3 回答 3

0

我只需在模型中的以下函数中添加一行:

public function get_snippet($snippet_id) {
    $this->db->select('id, title');
    $this->db->where('id', $snippet_id);
    //users can access only their own snippets 
    $this->db->where('user_id', $this->session->userdata('user_id'));
    $query = $this->db->get('snippets');
    return $query->row_array();
}

这会阻止他们访问信息,但我会做一些事情来阻止他们甚至能够首先尝试,即不给他们选择。

于 2013-04-23T13:12:03.137 回答
0

这样的事情可能会奏效。

public function edit_snippet(snippet_id) 
{
    $snippet = $this->dashboard_model->get_snippet($snippet_id); 

    // this depends on what you are using for sessions; 
    // recommend you use db sessions
    if($snippet->user_id != $this->session->userdata('user_id');)
    {
        redirect('/mysnippets');
    } 
    else 
    {
        //allow editing
于 2013-04-22T19:07:47.123 回答
0

您可以检查您正在编辑的 id 是否与您登录时提供的会话 id 相同。

它可能是这样的:

if ($snippet_id !=  $this->session->userdata('login_id'))
{
   //redirect to another page
}
于 2013-04-23T07:42:58.327 回答