web2py request.args(0) 权限

0 投票
3 回答
1504 浏览
提问于 2025-04-16 23:19

我正在做一个项目,这个项目需要有很多用户。每个用户可以创建很多支持请求(也就是帮助请求),并且可以查看和编辑自己的请求,但他们不能访问其他用户的请求。

举个例子:

def edit_ticket():
    record = db.e_ticket(request.args(0),active=True) or redirect(URL('error'))
    form=crud.update(db.e_ticket,record,next='view_ticket/[id]')
    return dict(form=form)

在这种情况下,如果用(request.args(0)),用户可以通过把请求的ID改成其他ID,来编辑系统中的任何请求,这样就不安全了,比如说“edit_ticket/[id]”。

所以我把request.args(0)换成了auth.user_id,我觉得这是个不错的解决办法!但是当用户数量多的时候,只有第一个和第二个用户能编辑他们的请求,其他用户就不行了,尝试编辑时会收到错误信息,比如“edit_Ticket/[id]”。

Error the document doesn't exist

我该怎么做才能防止用户越权访问?

祝好

3 个回答

0

web2py 有内置的用户访问控制功能。你可以参考一下 web2py 的书

用户需要登录才能编辑他们的票据,所以你可以用 @auth.requires_login() 来装饰 edit_ticket() 函数。在 edit_ticket() 函数里,你可以先检查一下用户的 ID 是否和票据的 ID 匹配。

0

也许你可以看看如何使用授权和CRUD(还有如何设置特定数据库记录的权限)。

需要注意的是,你不能把request.args(0)替换成auth.user_idrequest.args(0)指的是电子票(e_ticket)记录的ID,而不是用户的ID。如果电子票表中有一个字段是用户ID(比如,e_ticket.user_id),那么你可以把user_id=auth.user_id作为一个条件添加进去。

next='view_ticket/[id]'

你应该使用URL()函数来创建网址,比如URL(f='view_ticket',args=[id])。另外,[id]应该是什么呢?我在代码中没有看到关于id的任何引用。

1

这里不应该是:

db.e_ticket(request.args(0),user_id==auth.user_id,active==True)

而应该是:

db.e_ticket(request.args(0),user_id=auth.user_id,active=True) -

因为在这里我们传递的是函数的参数,而不是查询条件。

撰写回答