サーバーの任意のリソースでどのユーザーにもアクセスを許可する方法については、セッションのすべてのデータを保存してから、各ユーザーの要求で、ユーザー(またはむしろ、ユーザーの役割)には、このリソースにアクセスするのに十分な権限があります。
私はcodeigniterとしてフレームワークを使用することが推奨されています(それはどのように動作するか、何千ものチュートリアルがあります)、Ben Edmunds製のライブラリ呼び出しion-authがあります。ログイン、サインアップ(アカウントを有効にするための自動電子メール送信 - 設定する場合)、回復パスワード、ユーザーにアクセスするための安全な機能の2つがあります。権限については
、私が使用することは、このライブラリです:
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class Permissions
{
public function __construct()
{
}
public function __call($method, $arguments)
{
if (!method_exists($this->ion_auth_model, $method))
{
throw new Exception('Undefined method Ion_auth::' . $method . '() called');
}
return call_user_func_array(array($this->ion_auth_model, $method), $arguments);
}
public function __get($var)
{
return get_instance()->$var;
}
public function control(){
// controla la session
if(!$this->session->userdata('id')) redirect(base_url("/login"), "refresh");
// valida los permisos
$group = $this->permissions_model->lookUpGroup($this->session->userdata('user_id'));
$menu = $this->permissions_model->lookUpPermission($this->uri->segment(1), $group->group_id);
//echo "url: ".$this->uri->segment(1)." grup: ".$group->group_id."<br>";
//var_dump($menu);
//die();
if((!$menu || empty($menu)) || $menu->read == 0 && $menu->menu_id != 12){
redirect(base_url("/dashboard"), "refresh");
}
// retorna permisos
$menu = $this->permissions_model->getByLink($this->uri->segment(1));
return $permisos = $this->permissions_model->permissions($menu->id, $this->session->userdata('user_id'));
}
public function getMenu(){
$ci = &get_instance();
if($ci->session->userdata("id"))
{
$user_id = $ci->session->userdata("id");
$father_query = "SELECT u.id usuario, ug.user_id, ug.group_id, p.menu_id, p.read, p.insert, p.update, p.delete, p.group_id, m.*
FROM users u
JOIN users_groups ug ON u.id = ug.user_id
JOIN permisos p ON ug.group_id = p.group_id
JOIN menus m ON p.menu_id = m.id
WHERE u.id = ".$user_id." AND m.active=1
AND m.parent=0
ORDER BY m.orden
";
$query_padres = $ci->db->query($father_query);
if($query_padres->num_rows()>0)
{
foreach($query_padres->result() as $field)
{
$consulta_hijos = "SELECT u.id usuario, ug.user_id, ug.group_id, p.menu_id, p.read, p.insert, p.update, p.delete, p.group_id, m.*
FROM users u
JOIN users_groups ug ON u.id = ug.user_id
JOIN permisos p ON ug.group_id = p.group_id
JOIN menus m ON p.menu_id = m.id
WHERE u.id = ".$user_id." AND m.active=1
AND m.parent=".$field->id."
AND p.read=1
ORDER BY m.orden";
$sub_query = $ci->db->query($consulta_hijos);
if($sub_query->num_rows()>0){
$submenus = '';
$active_menu = '';
$active_menu_collapse = '';
foreach ($sub_query->result() as $result_dos) {
if ($ci->uri->segment(1) == $result_dos->link && $ci->uri->segment(2) == $result_dos->sublink) {
$submenus .= "<li class='active'><a href='". base_url($result_dos->link."/".$result_dos->sublink)."'><i class='".$result_dos->iconpath."'></i> ".$ci->lang->line($result_dos->descripcion)."</a></li>";
$active_menu = 'active';
$active_menu_collapse = 'collapse in';
}else{
$submenus .= "<li><a href='". base_url($result_dos->link."/".$result_dos->sublink)."'><i class='".$result_dos->iconpath."'></i> ".$ci->lang->line($result_dos->descripcion)."</a></li>";
}
}
echo "<li class='".$active_menu."'>
<a href='javascript:;'><i class='".$field->iconpath."'></i><span class='title'>".$ci->lang->line($field->descripcion)."</span><span class='arrow'></span></a>
<ul class='sub-menu'>
".$submenus."
</ul>
</li>";
}
else if (($ci->uri->segment(1) == $field->link && $ci->uri->segment(2) == $field->sublink) || $ci->uri->segment(1) == '') {
echo " <li class='active'>
<a href='".base_url($field->link."/".$field->sublink)."'>
<i class='".$field->iconpath."'></i>
<span class='title'>".$ci->lang->line($field->descripcion)."
<span class='selected'></span>
</a>
</li>";
}else{
echo "<li>
<a href='".base_url($field->link."/".$field->sublink)."'>
<i class='".$field->iconpath."'></i>
<span class='title'>".$ci->lang->line($field->descripcion)."</span>
<span class='selected'></span>
</a>
</li>";
}
}
}
}
}
}
本の後、私は(1あなたは正しいアクセスを保証するすべてのコントローラを拡張し、そこから)コアフォルダの父コントローラを作成。コアフォルダ上のコントローラの例:
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class Main_Father extends CI_Controller {
public function __construct() {
parent::__construct();
//session_start();
$this->load->helper('url');
if($this->getPermissions())
{
//make some things before pass control to the authentic controller
}
else
redirect(base_url());
}
private function getPermissions()
{
$this->user = $this->ion_auth->user()->row();
if($this->user)
{
//$this->data["permissions"] = $this->permissions->control();
if($this->permissions->control())
{
//make any function
return true;
}
else return false;
}
else
{
if(strpos(base_url(uri_string()),"login")==false)
redirect(base_url('/login'.$url));
else return false
}
}
}
最後の要素...Permission_model
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class Permissions_model extends CI_Model {
function __construct() {
parent::__construct();
}
function get_all(){
$query = $this->db->get('groups');
return $query->result();
}
function getAll(){
$user_row = $this->ion_auth->user()->row();
if (!$this->ion_auth->in_group(1, $user_row->id)){
$query = $this->db
->select('p.*, g.name AS grupo, m.descripcion AS menu')
->join('groups g','p.group_id = g.id')
->join('menus m', 'p.menu_id = m.id')
->where('p.group_id !=', 1)
->get('permisos p');
}else{
$query = $this->db
->select('p.*, g.name AS grupo, m.descripcion AS menu')
->join('groups g','p.group_id = g.id')
->join('menus m', 'p.menu_id = m.id')
->get('permisos p');
}
return $query->result();
}
//buscar
function lookUp(/*$perpage,$start*/){
$query = $this->db
->select('permisos.id AS id,
menus.descripcion AS menu,
groups.id AS id_grupo,
groups.description AS grupo,
permisos.read AS Leer,
permisos.insert AS Insertar,
permisos.update AS Actualizar,
permisos.delete AS Borrar,
permisos.exportar AS Exportar,
permisos.imprimir AS Imprimir')
->join('menus', 'menus.id = permisos.menu_id', 'inner')
->join('groups', 'groups.id = permisos.group_id', 'inner');
if($where = $this->input->post('buscar', TRUE))
$query = $this->db->where('permisos.id =', $where)
->or_where("menus.descripcion LIKE '%".$where."%'")
->or_where("groups.description LIKE '%".$where."%'");
$query = $this->db
->get('permisos');
return $query->result('array');
}
//count_buscar
function count_lookUp($perpage,$start){
$query = $this->db
->join('menus', 'menus.id = permisos.menu_id', 'inner')
->join('groups', 'groups.id = permisos.group_id', 'inner');
if($where = $this->input->post('buscar', TRUE))
$query = $this->db->where('id =', $where);
$query = $this->db->limit($perpage,$start)
->get('permisos');
return $query->num_rows();
}
function getByLink($link){
$query = $this->db
->select('id')
->where('link',$link)
->get('menus');
return $query->row();
}
//buscarPermiso
function lookupPermission($url, $perfil){
$query = $this->db
->select('p.read,p.menu_id')
->join('menus m', 'm.id = p.menu_id')
->where('p.group_id', $perfil)
->like('m.link', $url)
->get('permisos p');
return $query->row();
}
//buscarGrupo
function lookUpGroup($usuario){
$query = $this->db
->select('group_id')
->where('user_id', $usuario)
->get('users_groups');
return $query->row();
}
function permissions($menu, $id_usuario) {
$query = $this->db
->select('u.id, up.group_id, p.*')
->join('users_groups up', 'up.user_id = u.id')
->join('permisos p', 'p.group_id = up.group_id')
->where('u.id =', $id_usuario)
->where('p.menu_id =', $menu)
->limit('1')
->get('users u');
return $query->row();
}
}
私はそれがあなたを助けることを願っています。
PS:1º)getMenu関数が大好きではありません。MVCパターンの大砲を尊重しません。また、クエリは安全ではありません(パラメータ化されたメソッドを使用する必要がありますか?)。 2º)この関数で作成されたHTMLは変更できます。 3º)ここに記述されているコードのほとんどは私のものではありません... ion_authライブラリはBen Edmundsによって作成され、パーミッションコードは未知の「アーティスト」によって作成されています。 4º)あなたが厄介であれば、permissions_modelアップグレード可能なものには多くのものがあります...
しばらくしてdbを呼び出すと、セッションにアクセスできる可能性があります –
これを行うための組み込み方法はありません。自分でロジックを書きます。あなたが提供したコードに基づいて、あなたはすでにそのようなコードを書く方法の基礎をはっきりと知っています。今は創造的で実装する必要があります。私はあなたが得る答えを一切使っていないでしょう。 –