gpt4 book ai didi

java - @PreAuthorize 不适用于从另一个函数调用的函数

转载 作者:行者123 更新时间:2023-11-30 07:11:09 25 4
gpt4 key购买 nike

我正在尝试了解 Spring Security。我使用 java-config 而不是 xml。我尝试创建一个 Controller ,然后测试 @PreAuthorize 表示法。但在我给定的代码中,此 @PreAuthorize 仅当我将其与 getActiveSessions 函数一起使用时才有效,但当我将其与 getName 一起使用时则无效功能。所以这段代码按预期工作

public class DemoSessionController extends SessionController{

@RequestMapping("/welcome/{a}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String getActiveSessions(@PathVariable String a) {
// TODO Auto-generated method stub
String str = getName(a);
return str;
}

public String getName(String name) {
// TODO Auto-generated method stub
return "This is "+name+"";
}
}

但这并不

public class DemoSessionController extends SessionController{

@RequestMapping("/welcome/{a}")
public String getActiveSessions(@PathVariable String a) {
// TODO Auto-generated method stub
String str = getName(a);
return str;
}

@PreAuthorize("hasRole('ROLE_ADMIN')")
public String getName(String name) {
// TODO Auto-generated method stub
return "This is "+name+"";
}
}

有人可以解释为什么第二种情况不起作用以及如何让它起作用吗?谢谢!!

最佳答案

正如评论中提到的,只有从外部调用对象时才会处理注释。有几种解决方案。

您可以将需要注释的方法拆分为单独的对象,例如一个 AdminObject,其注释为

@PreAuthorize("hasRole('ROLE_ADMIN')")

在类(class)层面。这样您就不需要为每个方法都添加注释。您应该将类​​中的内部方法标记为私有(private),以防止它们被外部使用。这需要重新排序应用程序逻辑,但将所有管理任务放在一个对象中可能会有所帮助。

另一个解决方案显然是为方法执行的所有任务添加所需的注释,包括公共(public)方法使用的方法执行的任务。

编辑1:

添加了示例类以使建议的解决方案更加清晰

public class UserSessionController extends SessionController{
@Inject
private AdminFacade adminFacade;

@RequestMapping("/welcome/{a}")
public String getActiveSessions(@PathVariable String a) {
return adminFacade.getName(a);
}
}

@PreAuthorize("hasRole('ROLE_ADMIN')")
public class AdminFacade {

public String getName(String name) {
return "This is "+name;
}
public String getDetailsForAdmin(String param) {
return "admin details";
}
}

关于java - @PreAuthorize 不适用于从另一个函数调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226739/

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