2014-09-18 1 views
1

В моем приложении siro я хочу определить AuthenticationFilter для всех путей, кроме REST.Shiro Path Pattern исключить

ie /rest/... не проходит через него, но все остальное будет.

Я использую Shiro-Guice поэтому мой фильтр расстановки имеют вида

addFilterChain("/rest/**" ,restFilter) 
addFilterChain("/**", filter) //I want this one to work on everything except my rest filter 

Я смотрел на this question о Ant стиле картины пути, но там не кажется, что поддержка регулярных выражений.

+0

Что вы спрашиваете для работы из коробки даже с по умолчанию 'AntPathMatcher'. Сиро использует политику [first match wins] (http://shiro.apache.org/web.html#urls-) для цепей фильтров, а также для фильтров внутри цепочки. –

ответ

3

Вы не можете этого сделать. Способ работы siro заключается в том, что он проверяет фильтры в том порядке, в котором они настроены. Сначала он проверяет первый фильтр, если он не может аутентифицироваться, он перейдет к следующему. Для этого нет шаблона исключения.

Вы можете написать свой собственный фильтр сиро, который будет отрицать авторизацию на другом URL-адресе.

Я не знаю, как это будет работать в Guice, но в shiro.ini вы можете сделать что-то вроде:

[main] 
myfilter = UrlBasedAuthzFilter 
restFilter = YourRestFilterClass 
[urls] 
/rest/** = restFilter 
/** = myfilter 

и класс фильтра:

public class UrlBasedAuthzFilter extends AuthorizationFilter { 

    @Override 
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException { 
     if (request.getServletContext().getContextPath().startsWith("/rest"){ 
      return false; 
     } 
     return super.isAccessAllowed(request, response, mappedValue); 
    } 
} 
+1

Значит, вы можете это сделать. Вы можете изменить совпадение шаблонов на фильтре на 'RegexPatternMatcher', а не на' Ant'. Тогда вы можете просто использовать java-регулярные выражения. Я все же предпочитаю ваш путь. – user2573153

+0

А, я не думал об этом. Хорошая находка! – Wouter