如何向Spring MVC控制器方法添加自定义安全注释
问题内容:
我正在将Java 8,Spring MVC 4,Spring Boot和Gradle用于我的REST应用程序。
我想通过某些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>";
}
}
我想CustomSecurityAnnotation
运行一个自定义方法,该方法将检查传入的REST请求的标头,查看HTTP标头Authorization
,提取提供的值(如果已提供),并对该值运行代码以验证请求,
然后再 允许该方法执行以下操作:继续。如果授权无效,则注释应具有覆盖响应并提供HTTP
401或403的能力,如果我确定注释自定义方法成功传递,则允许注释下的方法运行。
我意识到我可以对PreAuthorize
其他MVC注释执行类似的操作,但是我正在考虑将自定义逻辑打包到单个注释内的方法中,以便在我选择的任何控制器上的任何方法上使用。
谢谢!
问题答案:
我们还在项目中创建了一个自定义注释。您需要完成一些面向方面的编程。
首先,您需要创建自己的注释来标记您的方法,如下所示:
public @interface CustomSecurityAnnotation {
}
然后,您必须编写在执行方法时触发的逻辑。您为此写了一个 方面 。
@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();
}
}
如您所见,我已经包含了一种检索当前HTTP请求的方法,因此您可以轻松地检索要检查的标头。
如果是AccessDeniedException
,Spring会自动将响应状态代码设置为HTTP 403。
不要忘记@EnableAspectJAutoProxy
在您的@Configuration
课程中启用来启用方面。