我正在编写一个服务器,其中有一个实体StoreOwner
,其拥有"拥有"或者与@OneToMany
实体有Store
的关系(一个商店所有者有1到N个商店)。每个Store
都有Offer
和Item
,每个商店与商店之间也有一个@OneToMany
关系(一个商店有1到N个商品,1到N个商品)。
我已经在每次登录(cookie)后使用GWT Xsrf保护和与登录用户关联的会话ID。
关于会话ID的一件事:会话ID在用户"识别"之后被放置在我的数据库中他自己输入了用户名和密码。无论用户是否被黑客入侵,丢失了hist笔记本电脑或正确输入了凭据:用户计算为我的服务器登录 - 它应该如何更好地知道?但是..
有一件事缺少恕我直言:如果登录(验证)的用户向服务器发送删除请求,并且他没有他所拥有的商店的ID,该怎么办?不拥有?目前,我在StoreService
:
// StoreService.java
@Transactional
public ItemDTO deleteItem(String sessionId, Long storeId, ItemDTO itemDto) {
// sessionId is the cookie I have placed in my database
// This way I want to ensure that I am only accessing a store
// that is associated with the logged in store owner (the user basically)
Store store = this.storeOwnerRepository.getStore(sessionId, storeId);
Item item = ConvertDTO.convertItem(store, itemDto);
// Check if the store ID that I got using the cookie is the
// same ID as the store ID from the item that should be deleted
if(item .getStore().getId() == store.getId()) {
item = this.storeOwnerRepository.deleteItem(item);
} else {
// If this didn't work we have a potentially hostile user:
throw new RuntimeException("Is somebody trying to delete items of a store he doesn't own?");
}
itemDto = ConvertEntity.convertItem(item);
return itemDto;
}
这是我第一次尝试编写更大的服务器应用程序而且我想阻止用户做这些事情。
我的问题有两个:[1]我正在做的事情是否真的会阻止登录用户将他不拥有的另一家商店的ID走私到我的服务器?另外,[2]我可以稍微简化一下吗?
我的问题是,随着应用程序的增长,可能会 - 时不时地 - 忘记这个检查
if(item .getStore().getId() == store.getId()) { /* .. */ }
当然,我可以将其移到我的StoreOwnerRepository
中,但我有更好的选择吗?