Вот что вам нужно.Чтобы создать собственное выражение SpEL, выполните следующие действия:
1) Создайте собственный подкласс класса WebSecurityExpressionRoot .В этом подклассе создайте новый метод, который вы будете использовать в выражении.Например:
public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {
public CustomWebSecurityExpressionRoot(Authentication a, FilterInvocation fi) {
super(a, fi);
}
public boolean yourCustomMethod() {
boolean calculatedValue = ...;
return calculatedValue;
}
}
2) Создать пользовательский подкласс DefaultWebSecurityExpressionHandler метод класса и переопределения createSecurityExpressionRoot (аутентификация аутентификации, FilterInvocation fi) (не createEvaluationContext (...)) в нем, чтобы вернуть ваш CustomWebSecurityExpressionRoot экземпляр.Например:
@Component(value="customExpressionHandler")
public class CustomWebSecurityExpressionHandler extends DefaultWebSecurityExpressionHandler {
@Override
protected SecurityExpressionRoot createSecurityExpressionRoot(
Authentication authentication, FilterInvocation fi) {
WebSecurityExpressionRoot expressionRoot = new CustomWebSecurityExpressionRoot(authentication, fi);
return expressionRoot;
}}
3) Определите в вашем spring-security.xml ссылку на ваш компонент обработчика выражений
<security:http access-denied-page="/error403.jsp" use-expressions="true" auto-config="false">
...
<security:expression-handler ref="customExpressionHandler"/>
</security:http>
После этого вы можете использовать собственное пользовательское выражение вместостандартный:
<security:authorize access="yourCustomMethod()">