spring-security Spring安全性:如何在Filter中获取端点的权限

yrwegjxp  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(146)

在spring Boot 项目中,我有一个控制器,它有一个带有@PreAuthorize注解的端点

@RestController
@RequestMapping("/path")
class SomeController {

    @PostMapping
    @PreAuthorize("hasAuthority('SOME_AUTHORITY')")
    public ResponseEntity<Object> doSomething() {

    }
}

我还有一个过滤器可以扩展OncePerRequestFilter

public class AuthTokenFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain f) throws IOException, ServletException {
        //here I want to get the authorities specified in the controllers' endpoints
    }
}

问题是如何获得由上面的过滤器中的@PreAuthorize注解指定的控制器的端点权限?

irlmq6kh

irlmq6kh1#

我建议将hasAuthority('SOME_AUTHORITY')移到Springbean中的单独方法中,并在filter和@PreAuthorize注解中使用该方法。这样,您将拥有验证逻辑的公共位置,并保持代码的一致性。
如果您需要代码示例,请告诉我。

xghobddn

xghobddn2#

您可以使用类似于AuthorizationMethodPointcuts的切入点,以Spring Security的方式来实现这一点。AuthorizationManagerBeforeMethodInterceptor使用这个切入点读取这些注解。
GitHub链接到spring-security以供参考。
https://github.com/spring-projects/spring-security/tree/main/core/src/main/java/org/springframework/security/authorization

ao218c7q

ao218c7q3#

筛选器动态拦截请求和响应,以转换或使用请求或响应中包含的信息。筛选器通常自己不创建响应,而是提供可以“附加”到任何终结点的通用功能。

OncePerRequestFilter. Spring保证OncePerRequestFilter对于给定的请求只执行一次。

在您的示例中,您在AuthTokenFilter中扩展了OncePerRequestFilter,并且正如您在注解中提到的,如果用户具有有效的详细信息(在本示例中设置身份验证对象),则在此筛选器中授权用户。

  • 一旦您到达端点,Spring将执行AuthTokenFilter逻辑
  • 如果详细信息有效,则AuthTokenFilter将在Spring上下文中设置身份验证。
  • Spring Security在不同类型的注解(如@PreAuthorize、@Secured)的帮助下支持方法级别的授权。但是要启用基于注解的安全性,我们需要在任何@Configuration类上添加@EnableGlobalMethodSecurity注解。例如:
@Configuration
  @EnableGlobalMethodSecurity(
    prePostEnabled = true, 
    securedEnabled = true, 
    jsr250Enabled = true)
  public class MethodSecurityConfiguration {
      //default configuration class
  }
  • HttpSecurity绑定到URL端点,而@PreAuthorize绑定到控制器方法,并且实际上位于与控制器定义相邻的代码中。
  • 权限/角色应该在AuthTokenFilter(在您的情况下)内的Authentication对象中设置,且这些角色可以使用@PreAuthorize注解进行验证。
  • @预授权将在AuthTokenFilter筛选器之后触发

相关问题