Spring Security和超级

时间:2014-08-19 10:03:51

标签: spring spring-security

在我的应用程序中,我正在使用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个值。

1 个答案:

答案 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,并且可以在子类中定义角色列表。

在不知道你对授权表达式有什么要求的情况下,我不能确定这是否能解决问题,但我成功地将其用于超类中的缓存方法,其中键取决于子类中的值。