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

时间:2017-08-18 11:20:44

标签: spring spring-mvc spring-security annotations 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 "";
}

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

我使用的符号如下:

@OnlyAccessForAdminOrParentOfTheSon(son = "#id")
@OnlyAccessForAdminOrParentOfTheSon(son = "#socialMedia.son")

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

1 个答案:

答案 0 :(得分:1)

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

您需要创建一个自定义服务/组件,该服务/组件将使用带有表达式的@PreAuthorize注解a根据您的要求来激活请求。

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注释一起使用

    @Service
    public final class HelloService {   

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

        }

您可以将其与service / controller操作一起使用,也可以根据需要修改参数。