Java Spring@Secured和@PreAuthorize在普通(非web)应用程序中无效

Java Spring@Secured和@PreAuthorize在普通(非web)应用程序中无效,java,spring,security,spring-security,Java,Spring,Security,Spring Security,我使用两种安全方法创建了一个应用程序Spring组件: @Component public class Application { public void run() { onlyAdminMethod(); onlyAdminMethod2(); } @Secured( "ROLE_ADMIN" ) public void onlyAdminMethod() { System.out.println( "Adm

我使用两种安全方法创建了一个
应用程序
Spring组件:

@Component
public class Application {

    public void run() {
        onlyAdminMethod();
        onlyAdminMethod2();
    }

    @Secured( "ROLE_ADMIN" )
    public void onlyAdminMethod() {
        System.out.println( "Admin-only method called" );
    }

    @PreAuthorize( "hasRole('ROLE_ADMIN')" )
    public void onlyAdminMethod2() {
        System.out.println( "Admin-only method 2 called" );
    }
}
我调用该bean上的
run()
方法,该方法取自SpringXML上下文:

ClassPathXmlApplicationContext context = 
     new ClassPathXmlApplicationContext("applicationContext.xml");  
context.getBean( Application.class).run();
不会发生任何事情-即使没有身份验证,也会正常调用方法
SecurityContextHolder.getContext().getAuthentication()
返回
null

我的Spring XML

<context:annotation-config />
<context:component-scan base-package="practice" />

<security:authentication-manager>
   <security:authentication-provider>
      <security:user-service>
         <security:user name="admin" password="stackoverflow" authorities="ROLE_USER,ROLE_ADMIN" />
      </security:user-service>
   </security:authentication-provider>
</security:authentication-manager>

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>

我对Spring3.2.4使用Maven依赖项


Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些方法调用绕过了代理

其次,确保您使用的是基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将代理目标class=“true”
添加到
元素中。确保类路径上有cglib,因为基于类的代理需要cglib


Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些方法调用绕过了代理

其次,确保您使用的是基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将代理目标class=“true”
添加到
元素中。确保类路径上有cglib,因为基于类的代理需要cglib


Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些方法调用绕过了代理

其次,确保您使用的是基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将代理目标class=“true”添加到
元素中。确保类路径上有cglib,因为基于类的代理需要cglib


Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些方法调用绕过了代理



其次,确保您使用的是基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将代理目标class=“true”添加到
元素中。确保类路径上有cglib,这是基于类的代理所必需的。

Spring使用基于代理的AOP解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些调用绕过了代理。@M.Deinum Unfortunatelly,在将这两个方法提取到
@Service MyService
类并将其添加为
@Autowired
之后,我仍然可以不间断地调用这两个
MyService
方法。请确保您也在使用基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将
代理目标class=“true”
添加到
全局方法安全性
元素中。确保你的类路径上也有cglib,因为这是基于类的代理所必需的。@M.Deinum明天会检查它,如果有帮助,我会接受。@M.Deinum工作得很好,所以如果你发布它,我会接受你的答案。Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些调用绕过了代理。@M.Deinum Unfortunatelly,在将这两个方法提取到
@Service MyService
类并将其添加为
@Autowired
之后,我仍然可以不间断地调用这两个
MyService
方法。请确保您也在使用基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将
代理目标class=“true”
添加到
全局方法安全性
元素中。确保你的类路径上也有cglib,因为这是基于类的代理所必需的。@M.Deinum明天会检查它,如果有帮助,我会接受。@M.Deinum工作得很好,所以如果你发布它,我会接受你的答案。Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些调用绕过了代理。@M.Deinum Unfortunatelly,在将这两个方法提取到
@Service MyService
类并将其添加为
@Autowired
之后,我仍然可以不间断地调用这两个
MyService
方法。请确保您也在使用基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将
代理目标class=“true”
添加到
全局方法安全性
元素中。确保你的类路径上也有cglib,因为这是基于类的代理所必需的。@M.Deinum明天会检查它,如果有帮助,我会接受。@M.Deinum工作得很好,所以如果你发布它,我会接受你的答案。Spring为AOP使用基于代理的解决方案。这意味着只截获外部方法调用,您正在进行内部方法调用,而那些调用绕过了代理。@M.Deinum Unfortunatelly,在将这两个方法提取到
@Service MyService
类并将其添加为
@Autowired
之后,我仍然可以不间断地调用这两个
MyService
方法。请确保您也在使用基于类的代理(您没有使用接口,因此JDK动态代理无法工作)。将
代理目标class=“true”
添加到
全局方法安全性
元素中。确保您的类路径上也有cglib,因为基于类的代理需要cglib。@M.Deinum明天会检查它,如果有帮助,我会接受。@M.Deinum工作正常,所以如果您发布它,我会接受您的答案。