在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
注解指定的控制器的端点权限?
3条答案
按热度按时间irlmq6kh1#
我建议将
hasAuthority('SOME_AUTHORITY')
移到Springbean中的单独方法中,并在filter和@PreAuthorize
注解中使用该方法。这样,您将拥有验证逻辑的公共位置,并保持代码的一致性。如果您需要代码示例,请告诉我。
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
ao218c7q3#
筛选器动态拦截请求和响应,以转换或使用请求或响应中包含的信息。筛选器通常自己不创建响应,而是提供可以“附加”到任何终结点的通用功能。
OncePerRequestFilter. Spring保证OncePerRequestFilter对于给定的请求只执行一次。
在您的示例中,您在AuthTokenFilter中扩展了OncePerRequestFilter,并且正如您在注解中提到的,如果用户具有有效的详细信息(在本示例中设置身份验证对象),则在此筛选器中授权用户。