大家好,我需要有关codeigniter角色或权限的帮助。我有一个用户角色(管理员):
表用户是数据库:
id int(11)
email varchar(100)
password varchar(128)
name varchar(100)
在我的管理面板中我有(page.php控制器)=页面管理,页面顺序,(agent.php控制器)=添加,编辑,删除...,(健身房)=添加,编辑,删除... ,(article.php控制器)
我有21个部分,每个部分我有一个以上的处理,我想要的是分配给每个部分一个管理员,而不是可以编辑和查看他的部分。所以我将有21个section_admin和一个(或更多)global_admin,而不是管理所有内容
我在名为type的users表中添加了另一个字段: type varchar(50) 它将有两个值section_admin或global_admin。我搜索了但是我发现没有教程告诉我这是怎么做的。
我不知道如何在我的系统中集成角色管理。有人能帮我吗?
控制器:user.php
class User extends Admin_Controller
{
public function __construct ()
{
parent::__construct();
}
public function index ()
{
// Fetch all users
$this->data['users'] = $this->user_m->get();
// Load view
$this->data['subview'] = 'admin/user/index';
$this->load->view('admin/_layout_main', $this->data);
}
public function edit ($id = NULL)
{
// Fetch a user or set a new one
if ($id) {
$this->data['user'] = $this->user_m->get($id);
count($this->data['user']) || $this->data['errors'][] = 'User could not be found';
}
else {
$this->data['user'] = $this->user_m->get_new();
}
// Set up the form
$rules = $this->user_m->rules_admin;
$id || $rules['password']['rules'] .= '|required';
$this->form_validation->set_rules($rules);
// Process the form
if ($this->form_validation->run() == TRUE) {
$data = $this->user_m->array_from_post(array('name', 'email', 'password'));
$data['password'] = $this->user_m->hash($data['password']);
$this->user_m->save($data, $id);
redirect('admin/user');
}
// Load the view
$this->data['subview'] = 'admin/user/edit';
$this->load->view('admin/_layout_main', $this->data);
}
public function delete ($id)
{
$this->user_m->delete($id);
redirect('admin/user');
}
public function login ()
{
// Redirect a user if he's already logged in
$dashboard = 'admin/dashboard';
$this->user_m->loggedin() == FALSE || redirect($dashboard);
// Set form
$rules = $this->user_m->rules;
$this->form_validation->set_rules($rules);
// Process form
if ($this->form_validation->run() == TRUE) {
// We can login and redirect
if ($this->user_m->login() == TRUE) {
redirect($dashboard);
}
else {
$this->session->set_flashdata('error', 'That email/password combination does not exist');
redirect('admin/user/login', 'refresh');
}
}
// Load view
$this->data['subview'] = 'admin/user/login';
$this->load->view('admin/_layout_modal', $this->data);
}
public function logout ()
{
$this->user_m->logout();
redirect('admin/user/login');
}
public function _unique_email ($str)
{
// Do NOT validate if email already exists
// UNLESS it's the email for the current user
$id = $this->uri->segment(4);
$this->db->where('email', $this->input->post('email'));
!$id || $this->db->where('id !=', $id);
$user = $this->user_m->get();
if (count($user)) {
$this->form_validation->set_message('_unique_email', '%s should be unique');
return FALSE;
}
return TRUE;
}
}
模型user_m.php:
protected $_table_name = 'users';
protected $_order_by = 'name';
public $rules = array(
'email' => array(
'field' => 'email',
'label' => 'Email',
'rules' => 'trim|required|valid_email|xss_clean'
),
'password' => array(
'field' => 'password',
'label' => 'Password',
'rules' => 'trim|required'
)
);
public $rules_admin = array(
'name' => array(
'field' => 'name',
'label' => 'Name',
'rules' => 'trim|required|xss_clean'
),
'email' => array(
'field' => 'email',
'label' => 'Email',
'rules' => 'trim|required|valid_email|callback__unique_email|xss_clean'
),
'password' => array(
'field' => 'password',
'label' => 'Password',
'rules' => 'trim|matches[password_confirm]'
),
'password_confirm' => array(
'field' => 'password_confirm',
'label' => 'Confirm password',
'rules' => 'trim|matches[password]'
),
);
function __construct ()
{
parent::__construct();
}
public function login ()
{
$user = $this->get_by(array(
'email' => $this->input->post('email'),
'password' => $this->hash($this->input->post('password')),
), TRUE);
if (count($user)) {
// Log in user
$data = array(
'name' => $user->name,
'email' => $user->email,
'id' => $user->id,
'loggedin' => TRUE,
);
$this->session->set_userdata($data);
}
}
public function logout ()
{
$this->session->sess_destroy();
}
public function loggedin ()
{
return (bool) $this->session->userdata('loggedin');
}
public function get_new(){
$user = new stdClass();
$user->name = '';
$user->email = '';
$user->password = '';
return $user;
}
public function hash ($string)
{
return hash('sha512', $string . config_item('encryption_key'));
}
}
答案 0 :(得分:1)
如何在项目中合并权限系统的方式太多了,这完全取决于您的需求。如果我理解你的问题,我会就你的情况给我一个基本的想法:
我不确定我是否理解你的问题。
让我知道。
答案 1 :(得分:0)
省去麻烦并使用它:Flexi-Auth。例如,您将拥有所需管理类型的角色和权限。
答案 2 :(得分:0)
我不确定你想要实现的目标,但我会大致解释一下我会做什么:
1)定义网址方案
例如,如果您有一个汽车爱好者的网站,每个品牌可能都是自己的部分:
somesite.com/section/honda
somesite.com/section/ford
somesite.com/section/toyota
这些URL slugs(本田,福特,丰田等)实际上成为您尝试访问的部分的标识符。每一个都是独特的。
然后,您需要确保/ section /之后的每个slug都是参数而不是函数调用。您可以通过进入/application/config/routes.php并定义如下路由来完成此操作:
$route['section/(:any)'] = section_controller/$1;
// $1 is the placeholder variable for the (:any) regex. So anything that comes after /section will be used as a parameter in the index() function of the section_controller class.
<强> 2。创建一个名为“section”的新数据库和相应的模型
现在只需给它两个字段:* section_id *和* section_name *。这将存储每个独特的部分。模型的代码是这样的:
class Section extends CI_Model
{
public $section_name;
public $section_id;
public function loadByName($section_name)
{
$query = $this->db->select('section_id', 'section_name')
->from('section')
->where('section_name', $section_name);
$row = $query->row();
$this->section_name = $row->section_name;
$this->section_id = $row->section_id;
return $row;
}
public function loadById($section_id)
{
$query = $this->db->select('section_id', 'section_name')
->from('section')
->where('section_id', $section_id);
$row = $query->row();
$this->section_name = $row->section_name;
$this->section_id = $row->section_id;
return $row;
}
}
第3。在用户表中,创建一个名为* section_id *
的附加字段这将是他们作为管理员的部分的ID的引用。例如,如果Toyota section_id是381,则使用381作为用户表中section_id字段中的数字。
<强> 4。请求页面时,根据slug名称查找section_id。
在你的控制器文件中,你应该在index()方法的某处加载section模型,如下所示:
class Section_controller extends CI_Controller
{
public function index($section_name)
{
// I will assume you've already loaded your logged in User somewhere
$this->load->model('Section');
$this->Section->loadByName($section_name);
if ($this->User->section_id == $this->Section->section_id)
{
// Render the page with appropriate permissions
}
else
{
// Throw an error
}
}
}
我不会详细介绍所有这些;您必须阅读Codeigniter文档,以掌握如何处理路由,控制器,数据库查询等。
答案 3 :(得分:0)
如果您只有2个角色,那么它可以轻松实现。你知道用户是管理员,如果用户&gt;是管理员,那么它会激活管理员有权访问的所有部分。如果用户那么他赢了,能够获得访问权。
如果你有足够的时间去做任务,那么如果你愿意使用tankauth认证库,那就去tankauth吧。您也可以使用篝火(HMVC)进行用户身份验证。