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

Ser*_*hez 8 spring annotations spring-mvc spring-security spring-el

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

我把注释:

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

问题是我不知道如何获取要在SPEL授权表达式中使用的注释的"son"属性的值.

我使用的符号如下:

@OnlyAccessForAdminOrParentOfTheSon(son = "#id")
@OnlyAccessForAdminOrParentOfTheSon(son = "#socialMedia.son")
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决这个问题.提前致谢.

Bhu*_*yal 2

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

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

public interface CustomAuthorization {
boolean onlyAccessForAdminOrParentOfTheSon(final UserDetails principal, final long id) ;
}
Run Code Online (Sandbox Code Playgroud)

执行 :

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

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

        return // add you authentication condition;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在您可以将它与 @PreAuthorize 注释和表达式一起使用

    @Service
    public final class HelloService {   

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

        }
Run Code Online (Sandbox Code Playgroud)

您可以将它与服务/控制器操作一起使用,也可以根据您的要求修改参数。