Spring MVC用户验证

时间:2012-08-01 19:02:46

标签: spring spring-mvc spring-security

我正在使用Spring MVC开发一个小应用程序。这是某种广告牌,用户可以在其中放置多种类型的内容。我已使用security-config.xml为我的应用程序(User,Admin,Anon)中的不同角色成功配置了安全性。现在您必须登录发布,只有管理员用户可以看到管理面板等。

现在我的问题是我必须为每个用户设置安全性,即修改内容的用户是制作内容的用户。当我调用我的函数之前,如果用户登录和内容的创建者都是相同的,那么最直接的方法当然是检查Java。像这样:

@RequestMapping("/listing/deletecontent.html")
public String deleteUserContent(@RequestParam String contentId) {
    //Get the logged user
    UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    User user = userService.loadUserByUsername(userDetails.getUsername());

    //Check if the user logged and the content owner are the same
    if (user == the_user_that_created_the_content)
          listingService.deleteContent(Integer.valueOf(contentId));

    return "redirect:/listing/usercontent.html";
}

我不是为什么,但我不喜欢这种方法。它只是在我需要的地方一遍又一遍地“复制粘贴”相同的验证,而且感觉不对。我在想,也许Spring有一些类型的功能允许我在security-config.xml中设置,可能调用一个类来使用 contentId 参数对每个URL进行此验证,然后重定向它如果通过测试,则为“真实”URL。我不知道,那就是我想问你的意思。 ¿你怎么看待这种方法? ¿也许我太挑剔而且不是那么糟糕? ¿你知道一个“更好”的方法吗?

非常感谢, 海梅

1 个答案:

答案 0 :(得分:0)

我建议关闭Spring Security参考中的expression-based access control chapter。所以,据我所知,你不应该自己检查权限 - 只需使用@PreAuthorize注释。尝试ACL模块或如果它不符合您的要求,可能更好地实现自定义PermissionEvaluator

P.S。还有这样的事情:@PreAuthorize("principal.id == #content.createdBy.id")