Спасибо ericacm , но он не работает по нескольким причинам:
- Свойства DefaultMethodSecurityExpressionHandler являются частными (кладжи видимости отражения нежелательны)
- По крайней мере, в моем Eclipse я не могу разрешить объект MethodSecurityEvaluationContext
Отличия в том, что мы вызываем существующий метод createEvaluationContext, а затем добавляем наш настраиваемый корневой объект. Наконец, я только что вернул объектный тип StandardEvaluationContext, так как MethodSecurityEvaluationContext не разрешается в компиляторе (они оба из одного интерфейса). Это код, который у меня сейчас в разработке.
Сделайте MethodSecurityExpressionHandler использовать наш пользовательский корень:
public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler {
public CustomMethodSecurityExpressionHandler() {
super();
}
@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
StandardEvaluationContext ctx = (StandardEvaluationContext) super.createEvaluationContext(auth, mi);
ctx.setRootObject( new CustomSecurityExpressionRoot(auth) );
return ctx;
}
}
Это заменяет корень по умолчанию, расширяя SecurityExpressionRoot . Здесь я переименовал hasRole в hasEntitlement:
public class CustomSecurityExpressionRoot extends SecurityExpressionRoot {
public CustomSecurityExpressionRoot(Authentication a) {
super(a);
}
public boolean hasEntitlement(String expression) {
return hasRole(expression);
}
}
Наконец, обновите securityContext.xml (и убедитесь, что на него есть ссылка из вашего файла applcationContext.xml):
<!-- setup method level security using annotations -->
<security:global-method-security
jsr250-annotations="disabled"
secured-annotations="disabled"
pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler"/>
</security:global-method-security>
<!--<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">-->
<bean id="expressionHandler" class="com.yourSite.security.CustomMethodSecurityExpressionHandler" />
Примечание: аннотация @Secured не примет это переопределение, поскольку она проходит через другой обработчик проверки. Итак, в приведенном выше xml я отключил их, чтобы предотвратить дальнейшую путаницу.