Joomla 用户密码的生成原理
作者:蘑菇 日期:2010-07-22 01:09
当然,Joomla对密码的加密方式有很多种,有ssha、md5、base64等等,但是因为我们很少触及这些设置,所以大多数还是在使用默认的md5加密方式。
有些人会问:为什么同样的密码每次加密后的结果都不一样呢?原因就是因为Joomla在加密的时候添加了一个随机key。由于这个key是随机的,所以每次加密后的结果也会不一样。
举例说明:
我的Joomla的明文密码是 123456,加密后的结果是
6fa7069f6c2b4a7abc376669113acab8:cW2r7QqdGQrp2Rw9sbxCxN85nSek6tlV
我们看到,加密后的字符串不是普通的md5格式,它被“:”分成了两段,这也是致使有些人怀疑它不是md5的原因。其实后面的这段是key,在每次添加新用户或修改密码时,这一串是随机生成的,而前边的密码才是md5加密后的密码,加密方法为:
md5(明文密码.key)
如上面的密码应该为
6fa7069f6c2b4a7abc376669113acab8 == md5('123456cW2r7QqdGQrp2Rw9sbxCxN85nSek6tlV')
在验证用户密码时也通过这个key做一下md5验证就可以了。
生成这个key和加密密码的函数分别为 getSalt() 和 getCryptedPassword()
它们在 libraries/joomla/user/helper.php 文件中被定义,在 libraries/joomla/user/user.php 的bind()方法中被调用。
从Joomla浅谈工厂方法(Factory - Method)模式
作者:蘑菇 日期:2010-07-12 20:59
在平时的代码工作中,你是否会遇到过这种情形,或者说有类似的感觉:在刚开始拿到一个项目时,会大概地理一下思路,想一下程序的简单架构,在反复的思考确认这是一种最好的设计模式的时候,你开始动工了,各种功能在这样的结构下也很快搭建了起来。但是项目最初的策划却总是不合我们的心意,于是我们再来修改功能模块,修改流程,使它更加趋于完美。这个时候,我们就要修改我们的代码,可能会添加一些功能,可能会改进一些程序,一开始你可能还对这些工作安排的非常妥当,还对这些代码的位置了如指掌,但是随着项目功能越来越完善,代码堆积也越来越多,你可能已经记不清类似的功能函数被重写了多少次,最后,一个看似完美的产品,却总是漏洞百出,可能大病不犯,小病不断,在修复这些bug的过程中,你开始厌倦了。
于是,我想,有必要来介绍一下工厂方法这种设计模式,使我们在做代码部署工作时,能更加妥当;在做功能完善的工作时,能更加得心应手。
我们先不去讲解什么是工厂方法模式,我们先从最简单的代码入手,来看一些代码优化的工作。
1、我们以session的操作为例,这样既可以帮助我们了解这个模式,也可以顺便让我们了解一下如何用其他方法存储session。
- <?php
- class JSession
- {
- function __construct(){
- //...
- }
- function read(){
- // read session
- }
- function write(){
- // write session
- }
- }
- ?>
这应该是一个最简单的session操作类了,由于我们只是说明这个设计模式,有一些其他的功能函数在这里就不列了。
2、下面我们的项目有个需求的变更,要求可以通过文件和数据库两种方式来存储session。那么我们将代码修改如下:
- <?php
- class JSession
- {
- function __construct(){
- //...
- }
- function read($type='file'){
- switch ( $type ) {
- case 'file' :
- // read session from file
- break;
- case 'database' :
- // read session from db
- break;
- default :
- // read session from file
- }
- }
- function write($type='file'){
- switch ( $type ) {
- case 'file' :
- // write session to file
- break;
- case 'database' :
- // write session to db
- break;
- default :
- // write session to file
- }
- }
- }
- ?>
这样,我们就完成了这个功能的扩展。
3、但是这样一来就有了一个弊端,如果日后我们想添加更多存储session的方式,那我们就是加更多的case段,代码被修改的
Joomla 调用module的方法
作者:蘑菇 日期:2010-04-18 22:46
Joomla调用module一般有以下几个方法:
1. 写在模板首页
这种方法会受到Itemid的限制
2. 写在文章里
这种方法不会受到Itemid的限制,是内嵌在文章里的。就是说只要显示文章,就会显示引入的module
3. 用JModuleHelper类引入
$modules = JModuleHelper::getModules("position"); //这里会取到放在同一个位置的所有module,得到的是一个数组
echo JModuleHelper::renderModule($modules[index]); //这里的index是放在同一位置的module的索引
Joomla 1.6的权限控制分析图例
作者:蘑菇 日期:2010-02-09 11:42
Joomla 1.6的权限控制分析
作者:蘑菇 日期:2010-02-06 16:21
joomla1.6是权限到组的,而没有做到权限到每个用户。首先用#__usergroups来保存组的信息,这里的lft,rgt估计是做权限覆盖用的,没细研究,不敢乱发言。如果当前用户的lft和rgt分别的3和7,那么我们就可以用lft<3 and rgt>7来取出当前用户的所有父结点(可能名称不是很准确)。
接下来我们来看#__assets表,这个表存储了真正的权限,components和contents以及一些需要权限控制的模块和数据库的每条记录都可以在这里进行权限控制,这个表的lft和rgt也和#__usergroups表类似,rules字段存储的是访问控制的信息,它是一个json字符串,我们可以把它变成数组,这样可以更直观一些。下面我们用com_content来举例,就能一目了然了。
我们首先把#__assets里面`name`='com_content'的rules拿出来,用json_decode解析一下,数组如下:
- stdClass Object
- (
- [core.admin] => stdClass Object
- (
- [7] => 1
- )
- [core.manage] => stdClass Object
- (
- [6] => 1
- )
- [core.create] => stdClass Object
- (
- [10] => 0
- [3] => 1
- [5] => 1
- )
- [core.delete] => Array
- (
- )
- [core.edit] => stdClass Object
- (
- [4] => 1
- )
- [core.edit.state] => stdClass Object
- (
- [5] => 1
- )
- )
上边对象里每个二级对象的属性是组的id值。
我们再点开Article Manager的Options->Permissions看看:

对比一下,发现结果了么?呵呵^_^
当然我们还可以把某篇文章的权限改一下,再打印出这些信息看看,也是类似的。
个人觉得这样有一个缺点,就是对于#__usergroups表,每更改一次用户,都要把所有的记录都修改一遍,因为要重新分配lft和rgt。#__assets应该也是这样的,所以如果数据量特别大的话,要更改某一条记录,就不免有些浪费数据库,有些牵一发而动全身的感觉,有些影响效率哦~~
查看图例: http://www.eduicc.com/read-9.html
- 1


