使用方面的 Spring Boot 角色验证控制器

楚伟俊

我有几个按角色分隔的控制器函数,而不是在每个控制器方法中进行角色验证,我发现它似乎可以通过使用 Aspect 来完成,但是在我的实现中有些地方不对,因为 Aspect 中的代码从来没有跑

注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ForMerchantOnly {}

方面:

@Aspect
@Configuration
public class ForMerchantOnlyAspect {
    private static final Logger logger = LogManager.getLogger(ForMerchantOnlyAspect.class);

    @Before("@annotation(com.example.api.annotation.ForMerchantOnly) && args(request)")
    public void before(HttpServletRequest request) throws ServiceException {
        if (!(request instanceof HttpServletRequest)) {
            throw new RuntimeException("request should be HttpServletRequesttype");
        }

        String domain = request.getServerName();
        System.out.println("Aspect showing domain " + domain);
        // -- other code
    }
}

控制器

@ForMerchantOnly
@GetMapping("/list")
public ResponseEntity<ApiResp> list() {
    System.out.println("Show something");
    return ResponseEntity.ok().body();
}

我假设当我通过 chrome 浏览器调用控制器 /list 方法时,它会输入代码,ForMerchantOnlyAspect但它只是直接进入控制器方法。我错过了什么吗?

RG

Aspect 无法工作,因为它找不到匹配的 joinpoint 。没有具有注释@ForMerchantOnly和类型参数的控制器方法HttpServletRequest

文档

args:限制匹配连接点(使用 Spring AOP 时的方法执行),其中参数是给定类型的实例。

以下方面可用于要求。范围指示符within将范围设置为建议。

@Before("@annotation(com.example.api.annotation.ForMerchantOnly) && within(com.example.api..*)")
  public void before() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest();

        System.out.println("Aspect showing domain " + request.getServerName());
    }

另请注意,Aspect 最好使用注释@Component@Configuration用于配置。

您还可以查看Spring 安全框架的方法安全性,它可以使用注释来保护方法。

从文档

从 version 2.0 开始,Spring Security 大大改进了对为您的服务层方法添加安全性的支持。它提供对 JSR-250 注释安全性以及框架原始 @Secured 注释的支持。从 3.0 开始,您还可以使用新的基于表达式的注释。您可以将安全性应用于单个 bean,使用intercept-methods 元素来装饰bean 声明,或者您可以使用AspectJ 样式切入点保护整个服务层中的多个bean。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot Logger方面

Spring-Boot WebMvcTest:如何使用Authentication对象参数测试控制器方法?

如何使用带有内容的Spring Boot控制器下载csv文件?

控制器[Spring-Boot]中的身份验证对象错误

Kotlin Spring Boot中的控制器验证

如何使用Spring Boot为传记后端创建实体类和控制器?

验证Spring Boot控制器中HTTP POST请求中的请求主体是否为null

尝试在控制器Spring Boot上使用@Autowire存储库时获取NoSuchBeanDefinitionException?

控制器未使用Spring Boot和Thymeleaf从HTML的跨度中接收值

Spring Boot控制器404

Spring Boot菜单组件控制器

Spring Boot的JSON和HTML控制器

使用Spring Boot REST控制器和JSON的空字段

如何使用Spring Boot创建404控制器?

使用Spring Boot时主控制器上的404错误

无法使用Spring Boot自动配置访问REST控制器

如何访问Codenvy Spring Boot Web控制器?

Spring Boot REST控制器验证

使用Spring Boot,Kotlin和Junit进行休息控制器单元测试

如何使用Spring Boot正确设置JDBC控制器类?

在Spring Boot 1.41中将@WebMcvTest与@PathVariable带注释的控制器结合使用

使用 Spring Boot 从复选框列表中获取选定的值到控制器

在启动时从文件中读取数据以在 Spring Boot 中的控制器中使用

Spring Boot 1.5.2 控制器层测试

控制器中的 Spring Boot 覆盖功能

来自控制器的 Spring Boot 查询

Spring Boot:控制器 - 404 未找到

如何使用 spring boot 和 mockito 对控制器方法进行单元测试

如何在 Spring Boot REST 控制器中使用请求和路径参数?