在我的应用程序中,我正在使用Spring Security并定义了下一个类。
public abstract class AbstractService {
public void save(){
.....
}
}
@Service
@PreAuthorize(SpelAuthorityExpressions.SOME_KIND_OF_ACCESS)
publist class UserService extends AbstractService {
}
@Service
@PreAuthorize(SpelAuthorityExpressions.SOME_KIND_OF_ACCESS_X)
publist class XService extends AbstractService{
}
我需要将子类中的@PreAuthorize
注释应用于超类方法(例如:save()
)。有没有办法通过避免覆盖超类方法来实现它?
AbstractService
将有多个子级(> 10),其中每个子级都有@PreAuthorize
个值。
答案 0 :(得分:1)
您可以尝试使用SPEL。
因为AFAIK,您必须注释方法或超类或超类本身,并且注释必须是普通字符串(或静态final,它是相同的)。但该字符串可能包含将引用目标对象的SPEL表达式。仅使用角色的示例:
@PreAuthorize("hasAnyRole(#root.target.requiredRoles)")
public abstract class AbstractService {
public abstract String getRequiredRoles();
public void save(){
.....
}
}
@Service
@PreAuthorize(SpelAuthorityExpressions.SOME_KIND_OF_ACCESS)
publix class UserService extends AbstractService {
@Override
public String getRequiredRoles() {
return "ROLE_USER, ROLE_CLIENT";
}
....
}
由于SPEL在运行时评估条件,它将使用overriden getter,并且可以在子类中定义角色列表。
在不知道你对授权表达式有什么要求的情况下,我不能确定这是否能解决问题,但我成功地将其用于超类中的缓存方法,其中键取决于子类中的值。