gpt4 book ai didi

java - Spring @Secured 和 @PreAuthorize 在普通(非 Web)应用程序中没有效果

转载 作者:行者123 更新时间:2023-12-01 23:30:26 24 4
gpt4 key购买 nike

我创建了一个 Application具有两种安全方法的 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" );
}
}

我调用run()该 bean 上的方法,我从 Spring XML 上下文中获取:

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"/>

我使用 Maven 依赖项 Spring 3.2.4

最佳答案

2 件事

Spring 使用基于代理的 AOP 解决方案。这意味着只有外部方法调用会被拦截,您正在进行内部方法调用并且绕过代理。

其次,确保您使用的是基于类的代理(您没有使用接口(interface),因此 JDK 动态代理将无法工作)。添加proxy-target-class="true"给您<global-method-security .. />元素。确保类路径上有 cglib,因为这是基于类的代理所必需的。

关于java - Spring @Secured 和 @PreAuthorize 在普通(非 Web)应用程序中没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19403908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com