如何向Spring MVC控制器方法添加自定义安全注释

Dan*_*Dan 7 java security rest spring spring-mvc

我在我的REST应用程序中使用Java 8,Spring MVC 4,Spring Boot和Gradle.

我想通过某些Spring MVC 4控制器中的自定义方法注释为我的REST应用程序添加安全性.

这是一个基本的例子.

HomeController.java

package myapp;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
@RequestMapping("/")
public class HomeController {

    @RequestMapping("/")
    public String index() {
        return "<h1>Hello, World!</h1><p>Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum</p>";
    }

    @CustomSecurityAnnotation
    @RequestMapping("/secure")
    public String secure() {
        return "<h1>Secured!</h1><p>Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum</p>";
    }
}
Run Code Online (Sandbox Code Playgroud)

我想CustomSecurityAnnotation运行一个自定义方法,它将检查传入REST请求的标头,查看HTTP标头Authorization,提取所提供的值(如果提供了一个),并在允许该方法之前对该值运行代码以验证请求继续.如果授权无效,注释应该能够覆盖响应并提供HTTP 401或403,并且如果我决定成功传递注释自定义方法,则允许注释下的方法运行.

我意识到我可以使用类似的东西PreAuthorize和其他MVC注释,但我正在寻找在单个注释内的方法中打包自定义逻辑,以便在我选择的任何控制器上的任何方法上使用.

谢谢!

Ken*_*nen 13

我们还在项目中创建了自定义注释.你需要做的是面向方面编程.

首先,您需要创建自己的注释来标记方法,如下所示:

public @interface CustomSecurityAnnotation {
}
Run Code Online (Sandbox Code Playgroud)

然后你必须编写执行方法时触发的逻辑.你为此写了一个方面.

@Aspect
@Component
public class CustomSecurityAspect {
    @Pointcut("@annotation(my.package.CustomSecurityAnnotation)")
    private void customSecurityAnnotation() {
    }

    @Around("my.package.CustomSecurityAspect.customSecurityAnnotation()")
    public Object doSomething(ProceedingJoinPoint pjp) throws Throwable {
        HttpServletRequest req = getRequest();
        // Check header values
        // Throw Spring's AccessDeniedException if needed
        return pjp.proceed();
    }

    private HttpServletRequest getRequest() {
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return sra.getRequest();
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我已经包含了一种检索当前HTTP请求的方法,因此您可以轻松检索要检查的标头.

如果是AccessDeniedException,Spring会自动将响应状态代码设置为HTTP 403.

不要忘记@EnableAspectJAutoProxy在@Configuration课堂上启用方面.