python利用session进行访问限制的想法

873 查看

近期在开发一个平台,平台的展示项需要分权,对应部门进行限制访问,决定利用session进行权限限制。

具体做法

  1. 用户访问login页面,完成登录密码验证后,在缓存中查找到用户的level;
  2. 将该level值赋予新定义的session新属性session.level,webpy的session处理本身不具备level这个属性,此为自定义

    session.png
  3. 后续访问其它页面时与该页面的权值进行比较,如果小于页面权值则禁止访问。

下面是具体实现,暂未具体设计用户数据权限表,所以粗略写了几个模拟成员来模拟功能,若是急用觉得也还合适。

#用户密码
allowed = (   
    ('admin', '123123'),
    ('cuibing', '123123')
)
#权限模拟,利用字典模拟了一个类似switch
def getlevel(username):
    level = {        
        'admin':3,
        'cuibing':1
    }
    return level.get(username)
下面是登录时的login类
class Login:    
    def GET(self):        
        return render.login()    
    def POST(self):        
        i = web.input()        
        username = i.get('username')        
        passwd = i.get('password')        
        if (username, passwd) in allowed:        
             #账户校验成功标记
            session.logged_in = True
             #此处就是赋予权值的过程。
            session.level = getlevel(username)
            raise web.seeother('/')
        else:
            return web.seeother('/loginerror')
以tables页为例进行权限校验
class Tables:
    def GET(self):
        if session.get('logged_in', False):  
        #这里如果没有logged_in的值就会默认返回False
            try:
                if not session.logged_in:    
                #防止未登录的url直接跳转
                    return web.seeother('/login')
                elif session.level < 2:      
                #前面的铺垫工作终于起作用了,这里我将table页的权制设定为2
                    return "You have no permission to visit this page!"                
                else:
                    return render.tables()
            except Exception, e:
                ErrStr = "tables:"+ str(e)
                logs.writeog(ErrStr)         
                #这里利用logging写了一个日志系统
                return web.seeother('/fasle')
        else:
                raise web.seeother('/login')

利用“cuibing”这个账户试验一下效果:

cuibing的level是 1,tables页的权限设置为了2.

login.png

验证.png

基本效果达到了 :)