Spring AOP不工作

f0ofjuux  于 2023-09-29  发布在  Spring
关注(0)|答案(2)|浏览(133)

我试图创建一些注解,在访问一些受保护的资源之前检查securitycontext的权限。我写了一个示例代码,与我想要实现的非常相似,但是当我调用SomethingProtected()时,似乎方面的@Before部分从未真正被触发。如果你能帮忙的话,我将不胜感激。
我有:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.METHOD)
  3. public @interface NeedsPermissions {
  4. boolean read() default true;
  5. }

  1. @Aspect
  2. public class NeedsPermissionsAspect {
  3. @Before("execution(* *.*(..)) && @annotation(NeedsPermissions)")
  4. public void CheckPermissions(JoinPoint pjp, NeedsPermissions needsPermissions) throws Throwable {
  5. System.out.println("aspect");
  6. if (needsPermissions.read() == true) {
  7. SecurityContext securityContext = SecurityContext.getSecurityContext();
  8. MyUser user = securityContext.getUser();
  9. if (!user.read){
  10. throw new Exception("Not Allowed");
  11. }
  12. }
  13. }
  14. }

  1. @Configuration
  2. @EnableAspectJAutoProxy
  3. public class NeedsPermissionsConfig {
  4. }

  1. public class ProtectedResource {
  2. @NeedsPermissions
  3. public void SomethingProtected(){
  4. System.out.println("Something protected");
  5. }
  6. }

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
  7. <aop:aspectj-autoproxy/>
  8. <!-- Aspect -->
  9. <bean id="needsPermissionsAspect" class="NeedsPermissionsAspect">
  10. <!-- configure properties of aspect here as normal -->
  11. </bean>
  12. </beans>
wn9m85ua

wn9m85ua1#

我尝试用这个来改变你的注解

  1. @Configuration
  2. @EnableAspectJAutoProxy(proxyTargetClass = true)
  3. public class AppConfig {
  4. }
pvabu6sv

pvabu6sv2#

在我的例子中,我可以告诉你,在Spring 3.X中,配置中的注解是不必要的。有依赖性就足够了:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

这样你就可以使用AspectJ注解:

  1. import org.aspectj.lang.JoinPoint;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.Around;
  4. import org.aspectj.lang.annotation.Aspect;
  5. import org.aspectj.lang.annotation.Before;
  6. import org.aspectj.lang.annotation.Pointcut;

您需要同时使用@Aspect和@Component来注解类。+
还要确保切入点指向包中的正确位置,否则在日志中看不到任何内容,因为切入点找不到方法。例如,如果在“com.demo.messaging.MyClass.myMethod”下找到该方法,则需要类似于

  1. @Pointcut("execution(* com.demo.messaging.*.*(..))")
展开查看全部

相关问题