gpt4 book ai didi

java - 在 Controller 方法中的方法上使用 @PreAuthorize 注释

转载 作者:行者123 更新时间:2023-12-02 11:42:55 25 4
gpt4 key购买 nike

我有一个基于 Spring WebMVC 和 Spring Security 的 Web 应用程序。我想在 @Controller 类中的方法内的方法上使用带有 SpEL 的 @PreAuthorize 注释。类似这样的事情:

@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {
if(methodController()){
return "forMethodPreAuthorize";
}
else return null;
}

@PreAuthorize("hasRole('ADMIN')")
public final boolean methodController(){
return true;
}

但是这不起作用。方法 methodController() 会为所有用户调用,即使没有 ADMIN。但尽管如此,该代码可以正常工作,并且该方法仅适用于管理员:

@PreAuthorize("hasRole('ADMIN')")    
@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {

return "forMethodPreAuthorize";
}

我不明白,因为什么是错误?最终我使用组件扫描来搜索 Controller 类和定义

security:global-method-security pre-post-annotations="enabled"

在 ServletContext xml 配置中。

最佳答案

当您直接从 exampleForMethodPreAuthorize() 调用 methodController() 时,如果未通过代理调用,则该调用。只有代理调用才能通过带注释的行为得到增强。

归功于此答案:https://stackoverflow.com/a/28168213/1849366 。它还建议了两种解决方法。

选项 1:将 methodController() 方法移至另一个 bean。

选项 2:通过代理调用方法 methodController(),如下所示。

@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {
if(context.getBean(MyController.class).methodController()){
return "forMethodPreAuthorize";
}
else return null;
}

关于java - 在 Controller 方法中的方法上使用 @PreAuthorize 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411041/

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