gpt4 book ai didi

spring - 获取 Spring SpEL 表达式上的 java 注释属性值

转载 作者:行者123 更新时间:2023-12-04 04:37:00 30 4
gpt4 key购买 nike

我需要在多个 Controller 上实现授权表达式。为此,我决定创建一个便于使用的个性化注释。问题是授权表达式需要一个参数(一个id),可以在每个 Controller 中以不同的方式获取。然后

我放了注释:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@PreAuthorize("@authorizationService.hasAdminRole() || ( @authorizationService.hasParentRole() && @authorizationService.isYourSon(#son) )")
public @interface OnlyAccessForAdminOrParentOfTheSon {
String son() default "";
}

问题是我不知道如何获得 的值“儿子”要在 SPEL 授权表达式中使用的注释的属性。

我使用的符号如下:
@OnlyAccessForAdminOrParentOfTheSon(son = "#id")
@OnlyAccessForAdminOrParentOfTheSon(son = "#socialMedia.son")

有人知道我该如何解决这个问题。

最佳答案

你不能这样实现,但是 spring Security 方法允许轻松定义一些自定义授权规则。这些规则可以授予或拒绝特定用户的某些操作。

您需要创建一个自定义服务/组件,它将根据您的要求使用带有表达式的 @PreAuthorize annotationa 来验证请求。

public interface CustomAuthorization {
boolean onlyAccessForAdminOrParentOfTheSon(final UserDetails principal, final long id) ;
}

执行 :
@Component("customAuthorization")
public final class CustomAuthorizationImpl implementes CustomAuthorization {

@Override
public boolean onlyAccessForAdminOrParentOfTheSon(final UserDetails principal, final long id) {

return // add you authentication condition;
}

}

现在您可以将它与带有表达式的 @PreAuthorize annotationa 一起使用
    @Service
public final class HelloService {

@PreAuthorize("@customAuthorization.onlyAccessForAdminOrParentOfTheSon(principal, #id)")
public String testMe(String id) {
return "test successfully";
}

}

您可以将它与服务/ Controller 操作一起使用,也可以根据需要修改参数。

关于spring - 获取 Spring SpEL 表达式上的 java 注释属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45755423/

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