Java 如果我们从配置中保护RESTAPI,那么在spring中使用方法级安全性有意义吗

Java 如果我们从配置中保护RESTAPI,那么在spring中使用方法级安全性有意义吗,java,spring,spring-security,Java,Spring,Spring Security,我想问一下,是否有必要保护我在带有Pre和Post注释的REST控制器中调用的方法。我通过java配置配置了安全性,如下所示: @Override protected void configure(HttpSecurity http) throws Exception { http .and() .formLogin() (...) .and() .authorizeRequests() .antMatchers("/a

我想问一下,是否有必要保护我在带有Pre和Post注释的REST控制器中调用的方法。我通过java配置配置了安全性,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .and()
        .formLogin()

    (...)

    .and()
        .authorizeRequests()
        .antMatchers("/api/**").hasAuthority("ROLE_USER");
}
因此/api下的每个请求都应该由角色\用户授权。我试图在互联网上找到一些关于这方面的信息,但我唯一能找到的是:


然而,我真的想不出一个黑客会以某种方式访问服务层中的方法的用例。

除了使某些功能成为可能之外,使用这两种技术还提供了额外的安全层

方法级安全性用于授权用户。Spring security在允许访问之前执行两个基本操作

  • 验证(谁是用户)
  • 授权(用户拥有哪些权限)
  • 因此,例如,如果用户拥有ROLE_user的权限,并且稍后在体系结构中,您决定将权限分配给某些角色

    例如,让我们考虑一个角色“角色用户” 并且以下权限已分配给用户

    • 可以查看数据吗
    • 可以添加子用户吗 等等
    因此,当一些用户拥有CAN_ADD_SUB_用户的权限,而另一些用户没有权限时,方法级别的安全性就派上了用场

    当然,为了获得权限和权限,您必须使用spring配置。但一旦配置,它就提供了应用程序可能需要的额外安全级别


    有关更多信息,请参阅此链接

    REST是无状态的。您应该在每个请求中发送类似于访问令牌的内容:

    https://{server}/api/customers?access_token=BGhznFGDS
    
    您还可以通过Header属性发送此信息。验证层(过滤器)决定是否可以调用控制器方法


    我更喜欢实现我自己的,以获得100%的控制。

    服务层中的URL安全性和方法安全性针对不同的用例

    如果您只需要控制只有具有特定角色的用户才能调用具有给定前缀的URL(此处为API),那么URL安全性就是您所需要的句号

    如果您有一个复杂的应用程序,其中可以从不同的控制器调用某些服务方法,并且您希望确保没有未能限制访问,那么方法安全性可以通过确保只有有效用户才能执行某些业务操作来提供帮助

    如果您有一个复杂的安全模型,例如多个办公室,每个办公室都有一个经理,可以对自己的员工数据进行读写访问,那么直接使用业务模型对象在服务层上实现方法安全性是一个不错的选择


    顺便说一句,在控制器中使用方法安全性,或者在rest控制器上使用更糟糕的方法安全性,通常是设计的味道:如果您可以在控制器中使用方法安全性,则通常使用URL安全性更好。如果这似乎有道理,那么您可能已经将业务逻辑导入到了一个又肥又丑的控制器中。不要说Spring AOP在默认情况下使用JDK代理实现方法安全,因为控制器通常不实现接口。

    我认为黑客无法调用服务层的方法。但基于URL模式限制角色访问有时很困难。我认为它应该是URL模式和基于方法的组合,因为基于方法的安全性也可以防止开发人员错误(开发人员为最终用户调用服务方法,该方法应仅用于管理相关任务)。@SergeBallesta问题是关于安全REST Api的。服务层只能通过
    @Controller
    访问我是否误解了这个问题?