SAM的魔法屋

[转]RDBC

角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)与Privilege(权限,表示对Resource的一个操作,即Operation+Resource)。
 

 

  Role作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给User或Group。Privilege是权限颗粒,由Operation和Resource组成,表示对Resource的一个Operation。例如,对于新闻的删除操作。Role-Privilege是many-to-many的关系,这就是权限的核心。
 

 

  基于角色的访问控制方法(RBAC)的显著的两大特征是:1.由于角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,减小了授权管理的复杂性,降低管理开销。2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。
 

 

  RBAC基本概念:
 

 

  RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What(Which)进行How的操作”。
 

 

  Who:权限的拥用者或主体(如Principal、User、Group、Role、Actor等等)
 

 

  What:权限针对的对象或资源(Resource、Class)。
 

 

  How:具体的权限(Privilege,正向授权与负向授权)。
 

 

  Operator:操作。表明对What的How操作。也就是Privilege+Resource
 

 

  Role:角色,一定数量的权限的集合。权限分配的单位与载体,目的是隔离User与Privilege的逻辑关系.
 

 

  Group:用户组,权限分配的单位与载体。权限不考虑分配给特定的用户而给组。组可以包括组(以实现权限的继承),也可以包含用户,组内用户继承组的权限。User与Group是多对多的关系。Group可以层次化,以满足不同层级权限控制的要求。
 

 

  RBAC的关注点在于Role和User, Permission的关系。称为User assignment(UA)和Permission assignment(PA).关系的左右两边都是Many-to-Many关系。就是user可以有多个role,role可以包括多个user。
 

 

  凡是用过RDBMS都知道,n:m 的关系需要一个中间表来保存两个表的关系。这UA和PA就相当于中间表。事实上,整个RBAC都是基于关系模型。
 

 

  Session在RBAC中是比较隐晦的一个元素。标准上说:每个Session是一个映射,一个用户到多个role的映射。当一个用户激活他所有角色的一个子集的时候,建立一个session。每个Session和单个的user关联,并且每个User可以关联到一或多个Session.
 

 

  在RBAC系统中,User实际上是在扮演角色(Role),可以用Actor来取代User,这个想法来自于Business Modeling With UML一书Actor-Role模式。考虑到多人可以有相同权限,RBAC引入了Group的概念。Group同样也看作是Actor。而User的概念就具象到一个人。
 

 

  这里的Group和GBAC(Group-Based Access Control)中的Group(组)不同。GBAC多用于操作系统中。其中的Group直接和权限相关联,实际上RBAC也借鉴了一些GBAC的概念。
 

 

  Group和User都和组织机构有关,但不是组织机构。二者在概念上是不同的。组织机构是物理存在的公司结构的抽象模型,包括部门,人,职位等等,而权限模型是对抽象概念描述。组织结构一般用Martin fowler的Party或责任模式来建模。
 

 

  Party模式中的Person和User的关系,是每个Person可以对应到一个User,但可能不是所有的User都有对应的Person。Party中的部门Department或组织Organization,都可以对应到Group。反之Group未必对应一个实际的机构。例如,可以有副经理这个Group,这是多人有相同职责。
 

 

  引入Group这个概念,除了用来解决多人相同角色问题外,还用以解决组织机构的另一种授权问题:例如,A部门的新闻我希望所有的A部门的人都能看。有了这样一个A部门对应的Group,就可直接授权给这个Group。

引用 http://baike.baidu.com/view/73432.html?wtp=tt

Filed under: LINUX+APACHE+MYSQL+PHP @ 2009-03-15 23:58

utf 8 BOM

折腾了我半天

我为了省事,直接在记事本里转换程序编码 gb2312 -> utf8

然后程序一直报错

数据编码总有问题

后来查到了罪魁祸首 BOM

“php在处理BOM头的时候,有时候存在错误,可能造成你在使用 header 或 session_start 之类的函数时,出现 文件已经输出的错误,多数都是因为BOM头送出去了。。因为在php看来,成了一个空格。所以使用无BOM的格式! ”

“这就是utf-8的签名导致的问题。
UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。如果多个文件设置了签名,在二进制流中就会包含多个UTF-8签名,而IE是无法识别多个UTF-8签名的,所以用一个空行来代替,在某些程序处理中还会出现一个类似“锘?”的字符。

“Unicode规范中有一个BOM的概念。BOM——Byte Order Mark,就是字节序标记。在这里找到一段关于BOM的说明: 另外unicode网站的FAQ-BOM详细介绍了BOM。官方的自然权威,不过是英文的,看起来比较费劲。
UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。我在研究Firefox的时候就知道,在Firefox早期的版本里,扩展是不能有BOM的,不过Firefox1.5以后的版本已经开始支持BOM了。现在又发现,PHP也不支持BOM。

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在
在Bo-Blog的wiki看到,同样使用PHP的Bo-Blog也一样受到BOM的困扰。其中有提到另一个麻烦:“受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。”这个应该就是Wordpress后台出现空白页面的原因了,因为任何一个被执行的文件包含了BOM,这三个字符都将被送出,导致依赖cookies和session的功能失效。
解决的办法嘛,如果只包含英文字符(或者说ASCII编码内的字符),就把文件存成ASCII码方式吧。用UE等编辑器的话,点文件->转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。如果包含中文字符的话,可以用UE的另存为功能,选择

“UTF-8 无BOM”即可。”

Filed under: LINUX+APACHE+MYSQL+PHP @ 2009-02-19 23:03

今日元宵

好久没来更新了,回家过年刚回来。

今天正好元宵节,外头好热闹,鞭炮礼花响不停。

元宵节非常热闹,舞狮子,乡下村里有游行。

至于什么是元宵俺也不晓得,以前小不懂事,无所谓,热闹就好。现在大了,懂事了,自然疑问就多了,什么是元宵呢?

好多历史和传说,贴都不想贴了,也懒得看了呵呵。

参考 http://baike.baidu.com/view/1949.htm

不过图片最能代表一切,收藏几张喜欢的图,对我来说记忆深刻。

猜灯谜

舞龙灯

舞狮

吃汤圆

看着这图好饿了,闪人,买点汤圆过自个儿过元宵。

Filed under: 修身·养性·齐家 @ 2009-02-09 07:21

除夕的由来

  相传,中国古时候有一种叫“夕”的怪兽,头长触角,凶猛异常。"夕"长年深居海底,每到一年的最后一天才爬上岸,吞食牲畜伤害人命。因此,每到一年的最后一天,村村寨寨的人们扶老携幼逃往深山,以躲避"夕"兽的伤害。 

  有一年的最后一天,桃花村的人们正急急忙忙上山避难,从村外来了个乞讨的老人,只见他手拄拐杖,臂搭袋囊,银须飘逸,目若朗星。乡亲们有的封窗锁门,有的收拾行装,有的牵牛赶羊,到处人喊马嘶,一片匆忙恐慌景象。这时,谁还有心关照这位乞讨的老人。只有村东头一位老婆婆给了老人些食物,并劝他快上山躲避“夕”兽,那老人捋髯笑道:"婆婆若让我在家呆一夜,我一定把‘夕’兽撵走"。老婆婆惊目细看,见他鹤发童颜、精神矍铄,气宇不凡。可她仍然继续劝说,乞讨老人笑而不语。婆婆无奈,只好撇下家,上山避难去了。

  半夜时分,"夕"兽闯进村。它发现村里气氛与往年不同:村东头老婆婆家,门贴大红纸,屋内烛火通明。"夕"兽浑身一抖,怪叫了一声。"夕"朝婆婆家怒视片刻,随即狂叫着扑过去。将近门口时,院内突然传来"砰砰啪啪"的炸响声,"年"浑身战栗,再不敢往前凑了。原来,“夕”最怕红色、火光和炸响。这时,婆婆的家门大开,只见院内一位身披红袍的老人在哈哈大笑。"夕"大惊失色,狼狈逃蹿了。 

  第二天是正月初一,避难回来的人们见村里安然无恙十分惊奇。这时,老婆婆才恍然大悟,赶忙向乡亲们述说了乞讨老人的许诺。乡亲们一齐拥向老婆婆家,只见婆婆家门上贴着红纸,院里一堆未燃尽的竹子仍在“啪啪”炸响,屋内几根红蜡烛还发着余光……;欣喜若狂的乡亲们为庆贺吉祥的来临,纷纷换新衣戴新帽,到亲友家道喜问好。这件事很快在周围村里传开了,人们都知道了驱赶"夕"兽的办法。 

  从此以后,人们把这一天叫做除夕。 

  从此每年除夕,家家贴红对联、燃放爆竹;户户烛火通明、守更待岁。初一一大早,还要走亲串友道喜问好。这风俗越传越广,成了中国民间最隆重的传统节日“过年”。

参考 http://baike.baidu.com/view/6008.html?wtp=tt#4

Filed under: 修身·养性·齐家 @ 2009-01-18 20:04

PHPExcel 应用一例

应编辑部要求设计一个简单的游戏模拟器,根据提供的游戏数据excel文件,我的实现方法,量不多就暂时不考虑数据库,就把数据放php文件里好了。

fetch_array the excel cells and export to file or database
  1. <?php
  2. /*
  3.  * 读取 game.xlsx 数据导出到对应的文件(也可以是数据库)里
  4.  */
  5. $PHPExcelPath = ‘./1.6.5/Classes/’;
  6. $file = ‘game.xlsx’;
  7. set_include_path(get_include_path() . PATH_SEPARATOR . $PHPExcelPath);
  8. require_once ‘PHPExcel/Reader/Excel2007.php’;
  9. $objReader = new PHPExcel_Reader_Excel2007();
  10. $objReader->setReadDataOnly(true);
  11. $objPHPExcel = $objReader->load($file);
  12. $sheetCount = $objPHPExcel->getSheetCount();
  13. $str = ‘<?php ‘;
  14. //该文件最后一个sheet工作区非数据,所以-2
  15. for ($i=0;$i<=$sheetCount-2;$i++) {
  16.     $arr = $objPHPExcel->getSheet($i)->toArray();
  17.     $record = count($arr);
  18.     //第一行是字段,所以不读
  19.     for ($j=2;$j<=$record;$j++) {
  20.         $str .=’$data['.$i.']['.$j.'][\'jnmc\']=\”.$arr[$j][0].’\';’;
  21.         $str .=’$data['.$i.']['.$j.'][\'xxdj\']=\”.$arr[$j][1].’\';’;
  22.         $str .=’$data['.$i.']['.$j.'][\'lx\']=\”.$arr[$j][2].’\';’;
  23.         $str .=’$data['.$i.']['.$j.'][\'xxff\']=\”.$arr[$j][3].’\';’;
  24.         $str .=’$data['.$i.']['.$j.'][\'jnxz\']=\”.$arr[$j][4].’\';’;
  25.         $str .=’$data['.$i.']['.$j.'][\'jnsm\']=\”.$arr[$j][5].’\';’;
  26.         //如果需要补充一下特殊字符的判断  \ /* ; …
  27.     }
  28. }
  29. $str .= ‘ ?>’;
  30. file_put_contents(’data.php’,$str);
  31. ?>

 

Filed under: LINUX+APACHE+MYSQL+PHP @ 2009-01-18 19:30

document.execCommand(’CreateLink’) 设置窗口选项

今天老大交待处理一个CMS后台编辑器超链接的设置问题,解决办法如下。

  •     //修改 by sam @2009年1月16日 给超链接加个打开窗口选项设置
  •  
  •     if (opt==null && what!=’createlink’) idEdit.document.execCommand(what)
  •  
  •     else if (what == ‘createlink’) {
  •         var sText = idEdit.document.selection.createRange();
  •         if (sText.text!=""){
  •             idEdit.document.execCommand("CreateLink");
  •                                 if(confirm("链接是否要以新窗口形式打开?")){
  •                     if (sText.parentElement().tagName == "A"){
  •                         sText.parentElement().target="_blank";
  •                     }
  •                 }
  •         } else {
  •             alert(’请先选中文字’);
  •         }
  •     }  

不过这个仅对文字有效,对图片无效果。记之~

Filed under: LINUX+APACHE+MYSQL+PHP @ 2009-01-16 01:03

善待自己

哈哈,好久没更新了。

最近工作有点小忙,年底了,活动多,事情也就多。

我隔壁的同事前不久刚遇到不幸的事——胃穿孔。

我查了一下资料是溃疡病的并发症,暴饮暴食容易引起,蛮严重的,不及时治疗还会有生命危险。

后来去看望他的时候,医生说他没有胃病史,是由于长期坐在电脑面前,饥饿过度引起的!

我听了感觉很吃惊,平时他三餐非常有规律,就因为工作中的胃过度状态???

想想自己,想想大家,很多人也许都会有这样的经历,或多或少。

人生真的是很无常!

总之,时刻要注意自己的身体,善待自己。把潜在的危险降到最低。

Filed under: 修身·养性·齐家 @ 2009-01-12 09:24

seagull 学习笔记(五) FrontController.php(2)

之前最开始申明(引用)了SGL(核心类)文件和一系列 Task 类。接下来,很快就有用到他们的地方了。注意一点,整个应用程序都是围绕着FrontController::run() 来运作的。

先看看 FrontController Class 的基本结构。

来重点分析一下整个应用程序是如何run的。

FrontController::run()
  1.      function run()
  2.      {
  3.         if (!defined(’SGL_INITIALISED’)) { //如果SGL_INITALISED常量未定义的话,就执行 init()…其实默认是未定义的,也就是这个最开始是会运行的。既然用if也就意味着某些情况可以不重复init。这个以后会遇到呵呵~
  4.             SGL_FrontController::init();
  5.         }
  6.         //  这里有用到单键模式和注册模式,寄存请求的数据。
  7.         $input = &SGL_Registry::singleton();
  8.         $req   = &SGL_Request::singleton();
  9.         if (PEAR::isError($req)) {
  10.             //  stop with error page
  11.             SGL::displayStaticPage($req->getMessage());
  12.         } 
  13.         //这里把客户端请求的数据由$input(寄存器)寄存起来。
  14.         $input->setRequest($req);
  15.         //  $c SGL配置文件对象 根据请求数据中的模块来加载对应的配置文件。
  16.         $c = &SGL_Config::singleton();
  17.         $c->ensureModuleConfigLoaded($req->getModuleName());
  18.         //实例化输出类为输出操作对象 如果配置文件里没有设置的话,默认引用 SGL_Output 类
  19.         $outputClass = SGL_FrontController::getOutputClass();
  20.         $output = &new $outputClass();
  21.         //测试数据库连接
  22.         SGL_FrontController::testDbConnection($output);
  23.         //指定模块初始化任务运行 如果有 /模块/init.php ,那么会引用这个文件…
  24.         SGL_Task_InitialiseModules::run();
  25.         // 参考 http://trac.seagullproject.org/wiki/Howto/PragmaticPatterns/InterceptingFilter
  26.         // 如果没有自定义过滤链路化,就使用默认链路,否则执行自定义的过滤链路。这里用了装饰者模式。核心处理用了之前提到的应用程序控制器模式。
  27.         if (!SGL_FrontController::customFilterChain($input)) {
  28.             $process =
  29.                 //  pre-process (order: top down) 预处理 至顶而下
  30.                 new SGL_Task_Init(
  31.                 new SGL_Task_SetupORM(
  32.                 new SGL_Task_StripMagicQuotes(
  33.                 new SGL_Task_DiscoverClientOs(
  34.                 new SGL_Task_ResolveManager(
  35.                 new SGL_Task_CreateSession(
  36.                 new SGL_Task_SetupLangSupport(
  37.                 new SGL_Task_SetupLocale(
  38.                 new SGL_Task_AuthenticateRequest(
  39.                 new SGL_Task_DetectAdminMode(
  40.                 new SGL_Task_MaintenanceModeIntercept(
  41.                 new SGL_Task_DetectSessionDebug(
  42.                 new SGL_Task_SetupPerms(
  43.                 //  post-process (order: bottom up) 后处理 至底而上
  44.                 new SGL_Task_BuildHeaders(
  45.                 new SGL_Task_BuildView(
  46.                 new SGL_Task_BuildDebugBlock(
  47.                 new SGL_Task_SetupBlocks(
  48.                 new SGL_Task_SetupNavigation(
  49.                 new SGL_Task_SetupGui(
  50.                 new SGL_Task_SetupWysiwyg(
  51.                 new SGL_Task_BuildOutputData(
  52.                 //  主处理程序!!!核心哦~我们程序员的主要工作也就是设计对应摸块的主处理程序~
  53.                 new SGL_MainProcess()
  54.                 )))))))))))))))))))));
  55.             $process->process($input, $output);
  56.         } else { //自定义过滤链
  57.             require_once dirname(__FILE__)  . ‘/FilterChain.php’;
  58.             $chain = new SGL_FilterChain($input->getFilters());
  59.             $chain->doFilter($input, $output);
  60.         }
  61.         if (SGL_Config::get(’site.outputBuffering’)) {
  62.             ob_end_flush();
  63.         }
  64.         //输出
  65.         echo $output->data;
  66.     }

 整体上看,基本上老大的工作就是这样了,很多细节的东西,比如 SGL_FrontController::init(); 等其他的工作,有时间可以多跟踪代码。

老大的工作就是初始化一些基本的任务,然后再分配任务,都是让负责该任务的真正执行对象去执行。seagull的面向对象特性就是体现在这里,把程序整成模块与对象化。

如果要说上面最重点的莫过于 $process 了,其他开始的什么任务初始化,装饰者模式的预处理和后处理,都是为了 new SGL_MainProcess() 的 process($input, $output)  这个做准备的。

主处理程序~

-
  1. /**
  2.  * Core data processing routine.
  3.  *
  4.  * @package SGL
  5.  * @author  Demian Turner <demian@phpkitchen.com>
  6.  */
  7. class SGL_MainProcess extends SGL_ProcessRequest
  8. {
  9.     function process(&$input, &$output)
  10.     {
  11.         SGL::logMessage(null, PEAR_LOG_DEBUG);
  12.         $req  = $input->getRequest();
  13.         $mgr  = $input->get(’manager’); //取得对应的模块控制器对象~
  14.         $mgr->validate($req, $input); //先验证客户端数据
  15.         $input->aggregate($output); //这个把什么this对象的源数据copy到$output对象中???这个不清楚哈`
  16.         //  process data if valid 如果客户端数据经过验证通过,就执行处理。。。
  17.         if ($mgr->isValid()) {
  18.             $ok = $mgr->process($input, $output);
  19.             if (SGL_Error::count() && SGL_Session::getRoleId() != SGL_ADMIN
  20.                     && SGL_Config::get(’debug.production’)) {
  21.                 $mgr->handleError(SGL_Error::getLast(), $output);
  22.             }
  23.         }
  24.         SGL_Manager::display($output);
  25.         $mgr->display($output); //模块控制器对象把反馈都交给$output对象
  26.     }
  27. }

数据经过客户端输入->预处理(环境检测,验证,过滤…等等)->对应的模块应用控制器处理(我之前有提到过的validate/process/display的工作流程模式)返回的内容全都交给$output对象->其他对象后处理包装(……等等)->最后 echo $output->data。

呵呵,上面只是自我粗俗的解释一翻。要清楚任何细节,一定需要在实践中才能更好更准确的理解。

理论归理论,程序归程序,只有多时间多做case才能更快掌握。~

Filed under: LINUX+APACHE+MYSQL+PHP, SEAGULL @ 2009-01-19 01:19

seagull 学习笔记(五) FrontController.php(1)

上面学了入口点在哪里,现在再深入一层,调用的 FrontController.php 一定得看一看,整个 SEAGULL 是涉及到很多典型的设计模式,还是那句话,不急着学那么多,先一步步跟踪下来,看看老大都做了些什么既可。

如果对 SEAGULL 有了一定的了解,可以发现一切都是在 FrontController.php 中进行的。

仔细分析 FrontController,最开头处有如下语句。
require_once dirname(__FILE__)  . ‘/../SGL.php’;
require_once dirname(__FILE__)  . ‘/Task/Init.php’;
先来跟踪一下SGL.php

我这个是eclipse的outline截图,可以发现,这个仅仅是一个类文件,一个SGL类,包含了一些方法,方法的作用看名字也很容易明白,这个在后续的程序中肯定会调用到(SGL::method()的形式会经常见到)。

再来看看 Task/init.php

打开可以看到这个文件里先引用了

require_once dirname(__FILE__) . ‘/../Task.php’;

这个Task.php 里比较简单,就2个类定义。

一个 Task抽象 类和和SGL_TaskRunner类。

Task/init.php中 引用完 Task.php 后,紧接着跟着一堆 SGL_Task_* 或个别其他的类 继承于Task的类。都定义了run()方法。仅仅都是定义而已,并没有真正做什么。

在类未实例化成对象前,这些都是类定义的程式,所以现在仅仅定义而已~。

这是FrontController最开始包含的东东,暂时什么也没做,但包含进来也就意味着(声明)了这些类,这个在后续调用中,至关重要。Task列表的一系列操作都需要这些。

待续…….

Filed under: LINUX+APACHE+MYSQL+PHP, SEAGULL @ 2009-01-19 13:14

爬鼓山 游涌泉

12月28日 多云

TIME EVENT FEEL
 06:30 闹钟《大城小爱》  梦里花落知多少
 06:59 起床  一边梦游一边洗刷
 07:30 上69路公交车,与柏林兄同行  车上最后一排直接躺下睡觉
 08:00 到达鼓山脚  百闻不如一见,有点小兴奋
 
 08:30 完成早餐开始爬山  吃饱了撑着
 08:40 肚子开始疼 特别糟糕,爬山肚子疼,主啊救救我吧。 
 08:50 半山腰救世主—–厕所出现了,拉肚子,难怪肚子疼。  佛与我同行,主与我同在。
 09:15 全速前进,到达涌泉寺后门 我们是迷路的羔羊 
 09:20 来到前门,办票  因为我们的来到,财源滚滚向佛流啊。
 10:00 和尚诵经,我们祷告祈福,左拜拜,右拜拜。  不过我都没拜,最多跪着双手合心,佛云:众生平等。
 
 10:30 神秘的古印度语言终于结束了,开始到处瞎逛逛  经书里是不是有什么宇宙的秘密呢? 
 

 11:30 食斋 正中口味,我向来特喜欢直接吃蔬菜,喀嚓喀嚓。 
 
 12:00 结束战斗,准备返回  有点舍不得这里的空气。 
 12:40 原途返回,才到半山腰,要控制脚步,不能失足。 我靠,上山容易,下山难,爆累,腿都会发抖了。 
 13:00 离开  爬山累,下山更累,身心疲惫,心情却很好,不枉此行。 

这是鼓山角度下福州的夜色?有待考证。夜游鼓山如何?

Filed under: 修身·养性·齐家 @ 2008-12-30 22:21
下一页 »

Powered by WordPress