我需要在多个控制器上实现授权表达式。为此,我决定创建一个便于其使用的个性化注释。问题是授权表达式需要一个参数(一个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")
有人知道如何解决这个问题。提前谢谢。
答案 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操作一起使用,也可以根据需要修改参数。