我们的 Tapestry5 应用程序中有一个 ViewRecordScreen,其 URL:
http://host:8080/app/viewRecord
要从我们的搜索屏幕查看记录,您只需单击页面链接即可。但是,如果您右键单击该链接并选择“复制链接地址”,您会得到:
http://host:8080/app/searchresults:viewRecord/12345678
我现在可以通过更新 id 来操作该 url 以查看其他记录。在 Tapestry 5 中防止 URL 操作的最佳方法是什么(我假设我必须编写一些服务器端验证代码,但我希望 Tapestry 可能有一些我不知道的东西可以提供帮助。)
提前致谢。
最佳答案
与任何应用程序一样,安全性是开发人员的责任。您不能信任 URL,并且应始终确保用户有权查看/编辑实体,而不是盲目地让他们这样做,因为 URL 是这么说的。
您可能知道,Tapestry 可以使用 ValueEncoder 自动在客户端字符串和服务器端对象之间进行转换。 s。如果您使用 Tapestry-hibernate,它将自动为您的所有实体创建 ValueEncoder。然后,您可以在服务器端使用实体作为激活上下文或事件上下文,Tapestry 将根据 ID 生成 URL。
如果您希望拦截从字符串到服务器端对象的强制转换,您可能需要装饰 ValueEncoderSource使用您自己的自定义安全检查。这很可能会从 session 中查找登录的用户。
我个人认为,您不应该修饰 ValueEncoderSource。您应该拥有用于获取和更新实体的服务。服务应将 User 对象作为参数,并应在获取/更新之前进行验证。可以从传递到服务层的页面/组件中的 session 中查找用户。
例如:
public interface FooService {
public Foo[] getAllFoos(User user);
public Result updateFoo(User user, Foo foo);
public Result createFoo(User user, Foo foo);
}
关于java - Tapestry 5 URL 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078767/