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