ubuntu下配置 elasticsearch6 的一点问题

本来想图省事, 怕Linux下的各种报错, 于是提前照着网上的说明改了yml文件, 最后发现无论怎么操作elasticsearch都起不来,一怒之下删了Ubuntu镜像,重新安装了Java jdk环境和elasticsearch, 原生配置,才发现了问题。

[2018-02-07T13:07:44,917][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [aggs-matrix-stats]
[2018-02-07T13:07:44,917][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [analysis-common]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [ingest-common]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [lang-expression]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [lang-mustache]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [lang-painless]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [mapper-extras]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [parent-join]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [percolator]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [rank-eval]
[2018-02-07T13:07:44,918][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [reindex]
[2018-02-07T13:07:44,919][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [repository-url]
[2018-02-07T13:07:44,919][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [transport-netty4]
[2018-02-07T13:07:44,919][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] loaded module [tribe]
[2018-02-07T13:07:44,919][INFO ][o.e.p.PluginsService     ] [Hl7YsCM] no plugins loaded
[2018-02-07T13:07:57,635][INFO ][o.e.d.DiscoveryModule    ] [Hl7YsCM] using discovery type [zen]
[2018-02-07T13:07:58,696][INFO ][o.e.n.Node               ] initialized
[2018-02-07T13:07:58,702][INFO ][o.e.n.Node               ] [Hl7YsCM] starting ...
[2018-02-07T13:07:59,203][INFO ][o.e.t.TransportService   ] [Hl7YsCM] publish_address {192.168.67.131:9300}, bound_addresses {[::]:9300}
[2018-02-07T13:07:59,287][INFO ][o.e.b.BootstrapChecks    ] [Hl7YsCM] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2018-02-07T13:07:59,310][INFO ][o.e.n.Node               ] [Hl7YsCM] stopping ...
[2018-02-07T13:07:59,374][INFO ][o.e.n.Node               ] [Hl7YsCM] stopped
[2018-02-07T13:07:59,375][INFO ][o.e.n.Node               ] [Hl7YsCM] closing ...

第一次启动时,我发现它自动关闭了, 报告了两个错误, 第一个网上说把bootstrap 改为false就可以了, 因为我没有在版本6的config里找到选项,所以就没理它, 第二个 [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 人家提醒的已经很明显了, 去/etc/sysctl.conf 里, 把虚拟内存设大点就好了,最后再次 ./elasticsearch 启动, 看到started提示, 打开 http://192.168.x.x:9200/ 看到欢迎页面,说明elasticsearch6 配置成功。

注意,启动前,elasticsearch.yml文件要修改一下

network.host 后面的IP要改成你的内网IP或者 0.0.0.0 (测试环境可以这样,线上如果没有设置密码保护的话容易引发安全风险),然后再把前面的#去掉, 保存即可。

发表在 elasticsearch | 标签为 , , , , | ubuntu下配置 elasticsearch6 的一点问题已关闭评论

使用 python eml-parser 对 eml文件进行格式化

python下有个工具是可以对eml文件进行格式化的,介绍在这里

 https://pypi.python.org/pypi/eml-parser

首先要安装包,如果你设置了全局环境变量的话,只需要cmd下执行就可以,如果没有设置全局变量,首先要切换到你python的安装目录,然后再切换到scripts目录,执行

 pip install eml-parser

当你看到这个提示时,说明安装成功

Successfully installed cchardet-2.1.1 eml-parser-1.8 file-magic-0.3.0 python-dateutil-2.6.1 six-1.11.0 typing-3.6.4

这个时候,可以来试验一下是否可用。发现报错,于是到项目地址下载源码包查看,发现支持的版本有

  classifiers=['Development Status :: 5 - Production/Stable',
'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)',
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: Implementation :: CPython',
'Topic :: Communications :: Email'
],

重新下载正确版本,重复以上步骤,重复以上步骤后,我发现依然报错,官方提示是OSX系统才需要安装libmagic,后来我在python3.6.0环境下,先后安装python-magic和libmagic,再安装eml-parser, 执行import eml_parser才没有报错,那下面来实验一下是否可用

import eml_parser
import json
import datetime

def json_serial(obj):
    if isinstance(obj, datetime.datetime):
        serial = obj.isoformat()
        return serial


with open('t.eml', 'rb') as fhdl:
    raw_email = fhdl.read()

parsed_eml = eml_parser.eml_parser.decode_email_b(raw_email)

print(json.dumps(parsed_eml, default=json_serial))

成功输出json格式化后的eml文件数据

发表在 python | 标签为 , , | 使用 python eml-parser 对 eml文件进行格式化已关闭评论

thinkphpcms  二

占坑明天写。

发表在 Uncategorized | thinkphpcms  二已关闭评论

tpphpcms数据库设计一

在使用tp进行cms开发之前, 首先要设计数据库的表结构,表结构设计完成后, 进行tp框架的搭建,项目的命名,控制器的命名 搭建完成后逐步开始完成控制器类,模型类,模版展示,然后是整合,测试和后期维护。

在进行设计之前, 要考虑到项目的整体,都有哪些功能, 哪些模块, 单元、分类、文章、用户、权限、都有哪些字段,最好设计的时候, 画出所属关系的关联图, 这样进行设计的时候, 思路会更加清晰。

以下是我的用户表

CREATE TABLE `my_user` (
`id` int(10) UNSIGNED NOT NULL,
`username` varchar(150) NOT NULL COMMENT ‘用户名’,
`password` varchar(100) NOT NULL COMMENT ‘密码’,
`name` varchar(255) NOT NULL COMMENT ‘昵称’,
`email` varchar(100) NOT NULL COMMENT ‘邮箱’,
`reg_date` date NOT NULL,
`last_login_date` date NOT NULL,
`active` tinyint(1) NOT NULL COMMENT ‘是否激活’,
`params` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


— Indexes for dumped tables


— Indexes for table `my_user`

ALTER TABLE `my_user`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `username` (`username`),
ADD UNIQUE KEY `email` (`email`);


— 在导出的表使用AUTO_INCREMENT


— 使用表AUTO_INCREMENT `my_user`

ALTER TABLE `my_user`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

ID字段为int型, 无符号的从非负数开始,然后再加一个auto自增,意思就是从0开始存储自增一直到65535,目的是解决大型数据的排列问题。

username字段为vachar型, 长度是我随便设的, 这个稍微设置的长一点没关系, 预估名称的最长再多一点就可以了,加了unique代表该字段所属内容是不能出现重复的。并且不能为空。

password同样为vachar型, 使用varchar的目的是它比char要灵活一些, 能存储的数据长度更长,支持存储字符也支持存储数字

下面好像没啥可介绍的, 就说一下重点,

ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里我设置的是innodb,其实现在默认设置就是这个了, 该存储引擎是比较好的,使用的时候会更加灵活, 支持的功能会更多一点, 如果想要执行效率高, 可以使用myisam。

发表在 php | 标签为 , , | tpphpcms数据库设计一已关闭评论

cms开发概述

由于在迁移数据的过程中失误删掉了cms的数据库,所以表结构和内容需要重新搭建和整合,想着整合的时候顺便重新复习一下代码,故有此系列文章。

在开发cms的时候, 首先应该进行需求分析, cms都需要哪些功能,哪些功能对应哪些模块,都需要用到什么函数什么方法,分析完成后, 就需要进行设计, 这个网站的前台是一个什么样的展示形式,后台通过什么模式来管理,都有哪些管理模块,设计完成后, 就需要对开发环境进行搭建, 对开发基础模型进行搭建, 是使用框架还是原生代码, 搭建好后, 就可以对代码进行编写, 编写完成后就需要进行测试, 测试完成后进行上线。上线后进行后期维护。 这就是cms开发的大致流程。

发表在 php | 标签为 | cms开发概述已关闭评论

win+apache应用网站的SSL(https)功能

应用之前的准备工作:

1. 确认自己安装的apache是否包含https功能,可以切换到apache bin目录, 如果该目录下不存在openssl.exe, 就说明你安装的apache是不包含该功能的, 需要手工安装openssl,或者安装LAMP套件(比如XAMPP)。

2. 当你确认自己的环境是支持openssl的之后, 就需要准备一个域名, 先临时解析到ssl官方指定的ip段(证书申请成功后可以停止解析,这个只为验证使用。)

官方指定的验证ip段:109.123.64.0 – 109.123.127.255

使用之前你可以先ping一下, 如果是存活的, 说明是可用的, 这里我选择的ip是

109.123.127.235

对应domain: honey.liang1234.com (记录类型为A记录)

ping一下honey.liang1234.com, 发现解析生效, 就可以开始进行证书申请工作, 首先打开第一个需要的网址

https://ssl.uk2.net/cgi-bin/certificate-apply.pl

填入honey.liang1234.com, 选择下一步, 会提示让你选择域名whois里的邮箱,这个时候你必须要确保这个邮箱收信和登陆时没有问题的, 确认无误后, 即可进行下一步。

到了下一步后, 会让你填写一些info信息和server端密钥信息, 这个时候, 需要登陆服务器, 切换到apache bin目录, 依次执行

openssl genrsa -out liang1234-privkey.pem 2048
openssl req -new -key liang1234-privkey.pem -out liang1234.csr

执行这个之前, 需要注意的是, server软件平台不要选错了, 如果你是apache, 就要选择apache modssl, 如果是其他平台, 选择对应的平台即可, 确认无误后, 登陆服务器开始依次执行命令

这个时候, 你可能会遇到这样一个错误提示

D:\xampp\apache\bin>openssl genrsa -out liang1234-privkey.pem 2048
WARNING: can’t open config file: c:/openssl-1.0.2j-win32/ssl/openssl.cnf
Generating RSA private key, 2048 bit long modulus
……..+++
………………………+++
e is 65537 (0x10001)

找不到openssl.cnf文件

没关系, 可以这样, 设置一个临时变量

不过,设置之前, 要先找一下自己的cnf文件在哪里

我的是在

D:\xampp\apache\conf

所以就可以这样

set “OPENSSL_CONF=D:\xampp\apache\conf\openssl.cnf”

完成以后再次执行上一条报错的命令, 发现没有错误,成功执行了, 然后我们再执行第二条命令生成密钥

执行第二条命令的时候, 会要求你输入一些信息, 注意, 这里的信息, 尤其是 server name信息, 不要写错。

完成最后一步输入密码的动作以后, 在当前目录下找到domain.csr文件, 文本模式打开, 复制里面的内容, 回到

https://ssl.uk2.net/cgi-bin/certificate-apply.pl

复制到 Paste your CSR into the textarea below: 然后继续submit

成功后, 会提示一个thank you页面, 这个时候, 请你务必记住is number后面的内容, 最好的办法是复制下来放到txt里,然后去打开自己的邮箱(就是你之前whois里的和在生成私钥的时候设置的那个) 打开邮箱后, 你会看到这样的一封邮件

ORDER #51969127 – Domain Control Validation for 你的域名

打开, 再打开里面的click 地址, 填入提供的验证码.

提示thank you后, 就可以关闭当前页面了, 回到

https://ssl.uk2.net/cgi-bin/retrieve-certificate.pl

输入host name (就是你申请证书的域名)
order number (之前保存到text的那个)

然后 submit

就会提示

Retrieve Your SSL CertificateYour certificate is ready to download.Certificate for: honey.liang1234.comValid from: Sat Feb 18 00:00:00 2017Valid until: Sun Feb 18 23:59:59 2018

然后点击下面的download zip 下载证书就可以了。 有时候会不成功, 需要等待两三分钟然后重试。 到此, 证书的申请工作
准备完毕。

打开ZIP包, 你会看到4个crt文件, 先打开域名.crt, 然后再依次打开另外三个, 把内容都复制到域名crt里面, 保存。

这就是个可以使用的证书了。

那么, 怎么使用呢?

首先, 把域名.crt文件上传到服务器, 可以放到conf目录, 也可以放到一个自己记得住的目录, 不要放到htdocs下。
然后继续下一步

打开vhost文件, 进行配置

//SSLlisten端口
DocumentRoot D:/xampp/htdocs/honey.liang1234.com //SSL DOMAIN DOCUMENTROOT
ServerName honey.liang1234.com //SSL DOMAIN
ServerAdmin liang007@outlook.com //DOMAIN EMAIL
ErrorLog “D:/wwwlogs/www.liang1234.com-error_log” //ERROR LOG
CustomLog “D:/wwwlogs/www.liang1234.com-access_log” common //ERROR LOG
SSLEngine on
SSLCertificateFile D:/xampp/apache/bin/honey_liang1234_com.crt //public key
SSLCertificateKeyFile D:/xampp/apache/bin/liang1234-privkey.pem //private key(就是你之前在服务器上生成的, 一般是在apache的bin目录下面)
<Directory “D:/xampp/htdocs/honey.liang1234.com”> // 同上
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
DirectoryIndex index.html index.php // 默认首页类型
重启apache, 打开首页,出现绿标, 即配置成功。

如果重启apache无法成功, 又无法知道具体的错误原因, 这里有个小技巧就是, 你可以cmd切换到apache bin 下, 然后执行 httpd -k start 就会直接提示出错误原因。 这就是win下配置ssl的全文, 其实都是相通的。

如果你看着此文照着配置出了linux下的, 说明如何配置ssl你已经掌握了。

发表在 php, 安全控制 | 标签为 , , , , , | win+apache应用网站的SSL(https)功能已关闭评论

Thinkphp Rbac应用篇二

最近因为很多事情都没有做完一直没好意思更新,今天趁着天亮前的空档索性更新一下好了,内容很基础,就是RBAC的实际应用,如果不熟悉的可以看一下上篇。Rbac不完全深入详解

我们在前期的时候知道了rbac的认证流程,其实下面要写代码的话也是依照这个认证流程来的,下面继续来看,翻看Controller.class代码的时候发现这么一行

    public function __construct() {
        Hook::listen('action_begin',$this->config);
        //实例化视图类
        $this->view     = Think::instance('Think\View');
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
    }

我们看到, 它在初始化控制器的时候有一句判断, 检测对象自身是否包含初始化方法, 如果包含就就使用当前实例化对象进行读取。这样的话,我们就可以重写该方法,然后让每一个控制器都去继承它,这样再去被继承的控制器里编写验证代码,就会被自动加载。前面知道了, rbac验证首先应该判断是否需要认证, 判断前要先检测是否开启认证,如果未开启认证就进入else。 其实这个各凭喜好,你要愿意开启认证进入else也行,前面我们已经在config里配置了所需要的数组, 这里只需要使用C读取配置信息就可以了。

首先是第一层判断

什么情况下是需要认证的场景?

USER_AUTH_ON = True;

NOT_REQUIRE_MODULE 中不存在指定的模块信息

所以, 这里的第一层判断就可以这么写

       if(C('USER_AUTH_ON') && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE'))))

首先读取认证开关选项信息, 如果为真就代表认证已经开启, 又因为加了逻辑与,所以两边条件都得满足, 解释全就是,如果读取到了USER_AUTH_ON为真并且在NOT_AUTH_MODULE数组中没有检测到指定的模块名, 就代表当前需要认证。确定需要认证的时候, 因为我们要使用RBAC类中的方法进行权限检测, 所以要导入它

  import('Org.Util.Rbac');

我们知道, 认证相对意义上包括认证通过和认证不通过,所以导入后就要进行权限是否通过判断

 //权限认证的过滤器方法
    static public function AccessDecision($appName=MODULE_NAME) {
        //检查是否需要认证
        if(self::checkAccess()) {
            //存在认证识别号,则进行进一步的访问决策
            $accessGuid   =   md5($appName.CONTROLLER_NAME.ACTION_NAME);
            if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
                if(C('USER_AUTH_TYPE')==2) {
                    //加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
                    //通过数据库进行访问检查
                    $accessList = self::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
                }else {
                    // 如果是管理员或者当前操作已经认证过,无需再次认证
                    if( $_SESSION[$accessGuid]) {
                        return true;
                    }
                    //登录验证模式,比较登录后保存的权限访问列表
                    $accessList = $_SESSION['_ACCESS_LIST'];
                }
                //判断是否为组件化模式,如果是,验证其全模块名
                if(!isset($accessList[strtoupper($appName)][strtoupper(CONTROLLER_NAME)][strtoupper(ACTION_NAME)])) {
                    $_SESSION[$accessGuid]  =   false;
                    return false;
                }
                else {
                    $_SESSION[$accessGuid]  =   true;
                }
            }else{
                //管理员无需认证
                return true;
            }
        }
        return true;
    }

我们查看源码得知, rbac的验证是由AccessDecision使用自身静态方法来进行验证的, 这里会经过几个检测, 那么我们取反, 就代表验证不通过/获取验证所需要的信息不成功。

if(!Rbac::AccessDecision())

当验证不成功的时候, 我们就需要检测这个时候访问对方是否已经登陆, 这里就可以检测session中是否存在已定义的标记, 如果登陆后该标记是会存在的

if(!$_SESSION[C('USER_AUTH_KEY')])

如果没检测到标记, 就代表未登陆, 这个时候可以redirect到public/login。 相反的, 如果检测到了, 就代表已登陆, 已登陆的显示对应的模块信息。这个时候还需要一个判断, 检测是否开启游客授权访问, 如果开启了, 就继续读取游客id是否为预定义数值, 如果是就代表是正常游客, 如果不是就再提示一次登陆页面或者其他提示页面。

连贯一起就是

首先检测是否开启认证和当前模块是否不需要认证, 因为我们要排除直接访问的情况, 所以要这么写, 如果开启了认证并且不需要认证的数组为空, 就代表当前访问需要认证, 这个时候进入认证流程, 导入RBAC模块, 导入后, 验证是否成功, 如果在session中没有发现指定的标记就代表未登陆, 这个时候可以跳回验证页, 相反如果存在, 就代表已登陆, 这个时候可以继续判断, 是否开启了游客授权访问, 如果未开启, 就提示无权限, 如果已开启, 检测标记是否和预定义游客标记相符合, 如果符合, 游客访问成功, 如果不符合, 说明非法访问, 抛出页面。

发表在 php | 标签为 , , , , , | 2条评论

有关网站后台密码防御问题

看到了越来越多的网站被黑客或是通过sql注入或是通过其他途径获取到了加密后的密码,发现一个问题就是很多人加密通常只会使用md5这一个函数,打个比方,大部分人的登陆验证可能都是这么写的。(这只是一个例子,通过get获取敏感参数是不正确的)

<?php

$_SESSION['ps'] = '21232f297a57a5a743894a0e4a801fc3'; //ps = admin
if(md5($_GET['ps']) == $_SESSION['ps'])
{
    echo '登陆ok';
}
else
{
    echo '登陆不ok';
}

我把session中的密码和通过get到的密码进行比对,如果密码正确进入正确提示,但是这里有个问题,就是,如果密码设置的不够复杂, 会被人很轻易的破解,于是,有人就想到了, 我可以这样。

<?php

$_SESSION['ps'] = '21232f297a57a5a743894a0e4a801fc3'; //ps = admin
$psa = substr($_SESSION['ps'],5);
if(substr(md5($_GET['ps']),5) == $psa)
{
    echo '登陆ok';
}
else
{
    echo '登陆不ok';
}

可以看到, 这个时候, 连大众化密码admin后的md5都无法被md5破解网站识别了。 那我们再进一步

<?php

$_SESSION['ps'] = '0a113ef6b61820daa5611c870ed8d5ee'; //ps = 888
$_SESSION['city']= 'xuzhou'; //city
$psa = substr($_SESSION['ps'],5);
if(substr(md5($_GET['ps']),5) == $psa)
{
    if($_GET['city']== 'xuzhou' && $_SESSION['city'])
    {
        echo '登陆成功';
    }
}
else
{
    echo '登陆不ok';
}

这个时候, 输入密码也不会登陆成功, 因为还需要输入城市, 这也是现在国外很流行的二次验证模型, 国内看到基本上没有多少网站采用这个, 其实实现起来也不难, 把历史ip数据存入数据库进行比对就可以了。经过这样的处理, 就可以在相对程度上最大减少后台密码被黑客破解的可能, 当然有一个前提是, 你不能是明文密码, 最好后端的数据二次确认要做好,别有sql注入, 命令执行类的漏洞。 今天晚上更RBAC使用实例。

发表在 php, php security | 标签为 , , | 一条评论

Thinkphp Rbac不完全深入详解一

说到thinkphp rbac就得先说一下rbac, 那么什么是rbac?  rbac即(role based access control)就是基于角色的访问控制的意思。那么什么是基于角色的访问控制?还是跟上面一样,要想知道什么是基于角色的访问控制首先就得来理解什么是角色,那么,什么是角色? 角色,它是一种代称,可以代指某一种或者多种可视和非可视规则和不规则物,简单举例来说,我在家是儿子,而这个儿子就可以称为是一种角色,因为此时角色属于儿子,所以我便可以行使一些儿子可以拥有的权限,假如这个时候我8岁的话,便可以让长辈代替我穿衣,或者喂我吃饭。而这个儿子只是我拥有角色之一,我可以同时拥有多种角色,而每一种角色会拥有若干权限,我可以根据不同的角色限制不同的用户访问,而这个限制的行为就叫做基于角色的访问控制。

看到这里,想必什么是rbac你已经理解了,那么thinkphp rbac就很好理解了, 它就是thinphp个性化处理后的rbac, 就是rbac的定制版的意思, 我可以使用thinkphp这个框架,调用它集成的个性化处理后的rbac功能来实现基于角色的访问控制。

Rbac的认证流程

判断当前模块的当前操作是否需要认证,如果需要认证未认证就跳转到认证网关通过身份委托获取用户决策访问列表,如果不需要认证或者当前已认证就判断是否有访问权限。

Rbac的不详细原理

首先通过saveaccesslist保存当前用户权限信息, 这里其实就是以下面的格式存储在session中的。

$_SESSION[APPNAME][CONTROLLERNAME][ACTIONNAME];

如果当前模块的当前操作已定义,就代表该controller拥有执行actionname动作的权限,比如

http://localhost/index.php/Admin/edit

就代表当前登录的用户具备执行admin模块的edit动作的权限。

说了流程和原理, 下面来讲一下具体的配置, 我们知道,无论是做网站还是给网站增加新功能, 都是需要对数据库表进行增删改查的, 所以这个时候, 就要对rbac功能进行数据库表结构设计,我们此次需要的表有以下几个

tp_user 账户信息表 //其实可以再分一个管理员表的, 这里可以把管理员表和注册用户表放到一起, 用id隔开, 比如uid 0 即admin。

tp_node 节点权限信息表 //这里放的是各个节点的权限信息,相当于介绍。

tp_role  账户角色信息表 //这里存的是账户角色信息,比如id为1的为管理员,它的uid为0。

tp_role_user 账户角色分配表 //给具体的账户分配角色用的,关联user表和role表。

tp_access 权限分配表 // 为具体的角色分配具体的节点权限。

到此我们便设计好了表信息, 大概来说一下归属, 首先user表和role表进行关联, 为具体id指定具体角色, 再然后role_user表和user表role表进行关联, 指定具体角色权限,再然后access表和role_user表进行关联, 如果role_id为1, 就说明这个时候登陆的是超级管理员,这个时候应该获取节点为1的权限。

到此,我们就大概明白了rbac的表设计, 因为我们需要使用thinkphp内置的功能,所以需要配置一些信息来读取修改具体所属的权限和属性信息, 下面就来看一下config里都需要哪些所需要配置的信息

因为thinkphp把这些信息是以数组的形式在value里保存的, 所以这个时候我们只需要修改键然后return就可以了, 键大致有以下几个

User_Auth_On=>true //false为关闭认证

User_Auth_Type=>1 //1为登陆认证,2为强制认证

User_Auth_Key=>sessionid //认证session标记

Admin_Auth_Key=>administrator //认证管理员名

User_Auth_Gateway=>’public/login’ //认证网关

User_Auth_Model=>’User’ //认证表模型

REQUIRE_Auth_Module=>” //需要认证的模块

Not_Auth_Module=>” //不需要认证的模块

Auth_PWD_ENCODER=>’md5′ //认证密码加密方式

GUEST_Auth_On=>false //是否开启游客授权访问

GUEST_Auth_ID=>0 //游客访问id

RBAC_USER_TABLE=>” //认证用户表

RBAC_NODE_TABLE=>” //节点表

RBAC_ROLE_TABLE=>” //角色表

RBAC_ACCESS_TABLE=>” //权限分配表

有人可能觉得哇塞这么多, 这个怎么记, 其实不用刻意去记的, 如果真忘了, 可以去rbac.class.php的注释里看, 到此, 前期准备就差不多了,当我们在config里文件把这个配置弄好以后, 下面就可以进行使用了

使用见下篇

发表在 php, thinkphp | 标签为 , , , , | 2条评论

昨天发现空调突然不制冷了, 本来怀疑是室内机器什么地方坏了, 今天找到修空调的人检修,最后发现,外机变成了老鼠窝,老鼠吃喝拉撒都在外机主板上,导致外机因为主板损坏无法工作。。。

发表在 Uncategorized | 标签为 | 已关闭评论