如何利用PostgreSQL数据库实现一个用户认证系统?
用户认证系统有很多功能。在这个例子中,将展示如何在PostgreSQL数据库环境下一步一步完成一个用户认证系统
因为要用到make模板和postgreSQL数据库,所以要:
import web
from web.contrib.template import render_mako
import pg
首先,为创建一个用户表。虽然这个表结构非常简单,但对于大部分项目来说都足够用了。
CREATE TABLE example_users
(
id serial NOT NULL,
user character varying(80) NOT NULL,
pass character varying(80) NOT NULL,
email character varying(100) NOT NULL,
privilege integer NOT NULL DEFAULT 0,
CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
)
登录和注销对应两个网址:
"Login" 对应登录页
"Reset" 对应注销页
urls = ( '/login', 'login', '/reset', 'reset', )
要判断用户是否已登录,是非常简单的,只要有个变量记录用户登录的状态即可。在login/reset类中使用这段代码:
def logged():
if session.login==1:
return True
else:
return False
我把我的用户划为四类:管理员,用户,读者(已登录),访客(未登录)。根据example_users表中定义的不同权限,选择不同的模板路径。
def create_render(privilege):
if logged():
if privilege==0:
render = render_mako(
directories=['templates/reader'],
input_encoding='utf-8',
output_encoding='utf-8',
)
elif privilege==1:
render = render_mako(
directories=['templates/user'],
input_encoding='utf-8',
output_encoding='utf-8',
)
elif privilege==2:
render = render_mako(
directories=['templates/admin'],
input_encoding='utf-8',
output_encoding='utf-8',
)
else:
render = render_mako(
directories=['templates/communs'],
input_encoding='utf-8',
output_encoding='utf-8',
)
return render
现在,让我们用个轻松的方法来解决:
否则,还是到login.html。
class login: def GET(self): if logged(): render = createrender(session.privilege) return "%s" % ( render.logindouble() ) else: render = create_render(session.privilege) return "%s" % ( render.login() )
好了。现在写POST()方法。从.html文件中,我们得到表单提交的变量值(见login.html),并根据变量值得到example_users表中对应的user数据
如果没通过,就重定向到login_error.html。
def POST(self): user, passwd = web.input().user, web.input().passwd ident = db.query("select * from exampleusers where user = '%s'" % (user)).getresult() try: if passwd==ident[0][2]: session.login=1 session.privilege=ident[0][4] render = createrender(session.privilege) return "%s" % ( render.loginok() ) else: session.login=0 session.privilege=0 render = createrender(session.privilege) return "%s" % ( render.loginerror() ) except: session.login=0 session.privilege=0 render = createrender(session.privilege) return "%s" % ( render.login_error() )
对于reset方法,只要清除用户session,再重定向到logout.html模板页即可。
class reset:
def GET(self):
session.login=0
session.kill()
render = create_render(session.privilege)
return "%s" % (
render.logout()
)
嗯,我认为没有人想看这个,但我喜欢把所有的信息都提供出来。最重要的就是login.html。