有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

没有jsp的java Spring安全性

我将在我的Javascript前端+Spring MVC项目(一个用户管理web应用程序)中使用Spring安全性。我试图弄清楚,将这些前端html代码(尤其是在与后端代码位于同一服务器的jsp文件中)放在同一服务器中是否有任何安全好处,这样我就可以利用某些jsp标记。或者我可以把它完美地变成一个ajax应用程序,在不同的服务器上为前端服务。而且仍然充分使用spring security


共 (3) 个答案

  1. # 1 楼答案

    您可以使用Spring Security来保护服务器端的安全,这意味着您的问题的简短答案是:“我能完美地将其变成ajax应用程序吗[…]?”对

    对于Ajax应用程序,我的建议是使服务器端成为RESTful API,因此我假设情况就是这样

    有两个因素有助于“安全”:身份验证和授权

    身份验证意味着客户端提供一些凭证(例如密钥、OAuth令牌、用户/密码组合),使您确信他或她确实是他们声称的那个人(即用户id 12345)。此身份验证将作为会话的一部分由应用程序保留。由于Http是无状态的,因此每个向服务器发出的后续请求都需要发送所述会话的标识,以便服务器可以查找它。您可以找到here所有您需要了解的关于Spring Security身份验证的信息。如果不知道你的用户计划如何进行身份验证,我就不能说得更具体了

    授权更简单:用户id 12345可能无法访问所有内容。例如,他可以访问/widgets/gidgets,但不能访问/widgets/fidgets。要实现这一点,最简单的方法是通过@PreAuthorize注释。了解更多信息here。例如:

    @RestController
    @RequestMapping("/widgets")
    public class WidgetController{
        @RequestMapping("/gidgets")
        @PreAuthorize("hasRole('GIDGET_MANAGER')")
        List<Gidget> getGidgets(){
            return gidgetService.getGidgets();
        }
    
        @RequestMapping("/fidgets")
        @PreAuthorize("hasRole('FIDGET_MANAGER')")
        List<Fidget> getFidgets(){
            return fidgetService.getFidgets();
        }
    }
    

    这在幕后的作用是,它根据路径拦截请求,验证当前已验证的用户是否具有与您指定的名称相同的角色,并允许在肯定的情况下执行该方法。否则,它将完全跳过方法执行,并向客户端返回401个未经授权的响应

  2. # 2 楼答案

    这里我假设:

    • javascript前端
    • 主要服务于JSON的Spring MVC rest应用程序

    从安全角度来看,spring security只能保护后端应用程序,您应该记住前端安全性(在浏览器视图中隐藏链接或命令)只是一种错觉,因为用户总是可以伪造请求,甚至是Ajax请求

    从用户体验的角度来看,很明显,你永远不应该向用户展示这种可能性,当用户使用它时,告诉他不允许这样做。因此,前端必须知道授予用户的权限。Spring security附带了一些标签,可以在JSP页面的服务器端使用,但对于Javascript前端,您可以(应该?)使用这些标签实现一个特殊的URL服务器端,返回当前用户的能力,在用户通过身份验证后立即在此处发送请求,并将结果缓存到客户端会话(Windows.sessionStorage)。这样,javascript代码就知道应该向特定用户显示什么

  3. # 3 楼答案

    您可以使用spring安全性来保护在控制器中提供AJAX JSON调用级别的请求URL,这就是我的建议

    无论您如何在JS前端显示/隐藏功能、数据等,重要的是保护提供功能和数据的JSON调用。这样,即使最终用户试图入侵你的前端(他们可能会,因为这很容易),也要确保他们会因为缺乏访问权限而无法执行REST调用

    关于“你能”让这个和使用JSP标签相比更安全吗?绝对-确保您在通话级别的所有安全性都按上述方式得到了正确处理,您将被设置。您应该像构建单独的应用程序一样构建REST/JSON服务,该应用程序可以用于任何类型的前端