Как ограничить доступ к URL-адресу с помощью безопасности Spring и свойства из объекта безопасности Spring? - PullRequest
0 голосов
/ 06 сентября 2018

Я использую Spring 5.1 и Spring security 4.2. Я настроил правила доступа, используя файл XML. У меня вопрос, как мне написать правило перехвата (контроль доступа к URL) на основе свойства в контексте безопасности Spring? То есть у меня есть переменная

productList

в контексте безопасности типа java.util.ArrayList. Я хотел бы ограничить доступ к URL, если этот список пуст или пуст. Как мне написать это? У меня

<http name="defaultSecurity" security-context-repository-ref="myContextRepository"
    auto-config="false" use-expressions="true" authentication-manager-ref="authenticationManager"
    entry-point-ref="loginUrlAuthenticationEntryPoint">
    ...
    <intercept-url pattern="/myurl" access="length(principal.productList) > 0" />
    ...
</http>

но, конечно, выше

length(principal.productList) > 0   

выражение совершенно неверно. Есть ли правильный способ написать это?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Выражения, связанные с безопасностью, имеют довольно ограниченный набор операций в Spring. Вы можете расширить этот набор, предоставив пользовательскую реализацию интерфейса org.springframework.security.access.expression.SecurityExpressionOperations. Вот краткое руководство, как это сделать:

  1. Создайте оболочку над SecurityExpressionOperations и выполните нужные операции:
class MySecurityExpressionOperations implements SecurityExpressionOperations {
    private SecurityExpressionOperations delegate;

    public MySecurityExpressionOperations(SecurityExpressionOperations delegate) {
        this.delegate = delegate;
    }

    public boolean hasProducts() {
        MyUser user = (MyUser) delegate.getAuthentication().getPrincipal();
        return !user.getProductList().isEmpty();
    }

    // Other methods
}
  1. Расширить org.springframework.security.web.access.expression.WebExpressionVoter и заменить стандартный обработчик выражений:
class MyWebExpressionVoter extends WebExpressionVoter {
    public MyWebExpressionVoter() {
        setExpressionHandler(new DefaultWebSecurityExpressionHandler() {
            @Override
            protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
                SecurityExpressionOperations delegate = super.createSecurityExpressionRoot(authentication, fi);
                return new MySecurityExpressionOperations(delegate);
            }
        });
    }
 }
  1. Предоставление диспетчера принятия пользовательских решений для доступа:
<bean id="affirmativeBased" class="org.springframework.security.access.vote.AffirmativeBased">
    <constructor-arg>
        <list>
            <bean class="my.company.MyWebExpressionVoter"/>
        </list>
    </constructor-arg>
</bean>
  1. Применить диспетчер принятия решений по индивидуальному доступу:
<http pattern="/**" use-expressions="true" access-decision-manager-ref="affirmativeBased">
    <!-- ... -->
</http>
  1. Защита одного из URL-адресов с помощью дополнительной операции безопасности:
<intercept-url pattern="/products" access="hasProducts()"/>
0 голосов
/ 09 сентября 2018

, если вы хотите проверить количество элементов в productList , для этого есть обходной путь:

 <intercept-url pattern="/myurl" access="principal.productList.size() > 0" />
...