本文为作者为jas,欢迎转载,但请注明文章出处~^_^~ 作者介绍:林霖(jas) 2004年毕业于一所备受改名之苦的普通本科院校。此人狂爱开源技术。 1. 为什么要进行权限控制 在网络通信极其发达的现代社会,人类的活动越来越依赖网络,人们不断的把以前只能现实中完成的人类活动搬到网络上。人们可以在通过网络自由的进行商业活动、娱乐、通信交流等。涉及到的商业利益,个人利益越来越大,于是就产生了很多网络安全的问题。
如何在网络上保证自己的信息不被其他人盗窃也就的越来越引人注目。
2. 如何保护自己 自然界的生物在对其他物体进行攻击或逃跑之前会先对对方进行的身份和新闻的判断。狗在攻击之前,肯定是先嗅嗅你,判断你是否是陌生人。这是对你身份进行认证。如果你是主人,他当然不会攻击你,但如果你是陌生人,就会得到他不同对待。而如果也对它进行攻击的话它可能会逃跑,这也是它对你的行为的判断的结果。
同样我们可以把这种行为引入到网络中。要保护自己,就要先对要求对你产生行为的事物进行身份认证。而在我们如何来做到这点呢,有很多方法。你可以给使用你的资源的人或事物分配只有你能辨别的唯一标识符。但是一旦你的资源被放置到网络上,那么所有都可以通过网络来尝试使用它们,那些人可能是你分配了标识符的人,也可能是一个完全陌生的人。所以你就要在他们一连接到你的应用就给他们每个人分配唯一的标识。这就产生的session会话。每个用户一旦跟应用连接,我们就跟每个人建立唯一不同的会话。于是我们就可以通过session来取得用户的信息并辨认他的身份。
于是剩下的问题就是如何利用好session来保护你的应用,如何使它发挥最大的功效。
现在我们来看看几种使用方法。同时你会看到我是如何保护我的应用的。
3. 利用Session保护你的资源和创建灵活的权限控制机制 1. 第一种就是我们最常用的。每当有人要使用你要保护的资源时,你都手工的判断你的session里的用户是否具有此权限。看看下面伪代码,我们保护资源的一般流程。
If (Session.getUserName()&Session.hasRight() )
{
我的保护资源;
}
else
{
你无权访问我的资源;
}
你可以发现在每次有请求要使用你的保护资源是,你都要手工的判断一次是否有使用权限。
于是我们思考:为什么不创建一个框架让系统自动的来判断这些资源,而我们要做的就是指出我们要保护的资源,其他的让我们的框架来忙就行了。于是就产生了认证框架。而在cocoon里我们可以很容易的作到。
2. Cocoon authentication framework .这就是我们要研究的session的第二种方法。但是先让我们跳过,后面会详细的介绍如何使用这个框架。
3. 上面我们让framework来做一些重复性的工作,下一步我们研究一个重点就是,如何能给我的系统实现一个灵活的权限控制机制。
我们可以想象当一个系统很庞大的时候,有很多模块,我们如果每个模块的有自己的控制体系或者控制方法的话,那将是非常混乱的事情。那为什么我们不统一控制起来呢?于是我想到了一种可以灵活处理解决的方法。那就是给所有模块的功能统一编号。然后跟给定的用户的、用户组、或角色映射起来。用户要去使用某个功能,某个模块,就要先查看这个映射。看是否有使用权限。比如:
n 系统将划分不同的使用用户,每类用户属于某一个角色,一共有3种角色guest,poweruser,admin
所以有一个角色表roles.它的结构如下:
角色表roles:
1. 角色id:(r_id)
2. 角色名字:(r_name)
3. 描述:(r_des)
具体表结构如下:
n 系统将系统将给不同的功能给定id,然后给每个功能给定不同的权限,最后将功能和功能的操作权限映射(map)到角色。而用户由于属于某一类用户而具有某一功能的的特定权限。
例:我们有一个功能是给admin留悄悄话。这个功能的我们给定功能id为301,其中3代表某一个大的模块功能,这里为留言,01则为具体的写悄悄话的权限,以此类推,302为在留言模块里删除悄悄话或其他一些操作。
于是我们可以将这个功能映射不同的角色,如果功能对应角色映射如下的话:
301——poweruser——yes
那么我们就认为该属于poweruser的用户可以有使用给主人留悄悄话的权限。
如果对应角色映射如下的话:
301——poweruser——no
那么我们认为属于角色poweruser的用户将不能给主人留悄悄话。
n 而相对于每一个用户我们将他归到一个角色上去。没个用户只能属于一个角色.
这样带来的统一管理的好处是非常明显的,另外一个巨大的好处就可以把我们可以非常方便的改变自己的功能模块的使用权限到用户的映射。