0

我们的 Tapestry5 应用程序中有一个 ViewRecordScreen 和一个 URL:

http://host:8080/app/viewRecord

要从我们的搜索屏幕查看记录,您只需单击页面链接。但是,如果您右键单击链接并选择“复制链接地址”,您会得到:

http://host:8080/app/searchresults:viewRecord/12345678

我现在可以通过更新 id 来操作该 url 以查看其他记录。在 Tapestry 5 中防止 URL 操作的最佳方法是什么(我假设我必须编写一些服务器端验证代码,但是我希望 Tapestry 可能有一些我不知道的东西可以提供帮助。)

提前致谢。

4

2 回答 2

2

与任何应用程序一样,安全性是开发人员的责任。您不能信任 URL,您应该始终确保用户有权查看/编辑实体,而不是因为 URL 如此说明而盲目地让他们这样做。

您可能知道,Tapestry 可以使用ValueEncoder自动在客户端字符串和服务器端对象之间进行转换。如果您使用 Tapestry-hibernate,它将自动为您的所有实体创建 ValueEncoders。然后,您可以在服务器端使用实体作为激活上下文或事件上下文,tapestry 将根据 id 生成 URL。

如果您想拦截从字符串到服务器端对象的强制转换,您可能需要使用您自己的自定义安全检查来装饰ValueEncoderSource 。这很可能会从会话中查找登录用户。

在我个人看来,你不应该装饰 ValueEncoderSource。您应该有获取和更新实体的服务。服务应将用户对象作为参数,并应在获取/更新之前进行验证。可以从传递到服务层的页面/组件中的会话中查找用户。

例如:

public interface FooService {
    public Foo[] getAllFoos(User user);
    public Result updateFoo(User user, Foo foo);
    public Result createFoo(User user, Foo foo);
}
于 2013-08-06T13:29:31.473 回答
0

我认为处理它的最佳方法是跟踪有权执行此操作的用户。因此,在方法视图记录中,您可以检查用户是否已登录或类似情况。如果不是,则不执行该操作。您可以使用会话状态来跟踪用户状态 ( http://tapestry.apache.org/session-storage.html )

于 2013-08-06T12:48:51.010 回答