Есть ли способ прочитать метаданные Spring Security? - PullRequest
0 голосов
/ 31 октября 2018

Я использую Spring Security и у меня есть собственный фильтр авторизации без явного сопоставления URL. Я добавил свой фильтр авторизации после UsernamePasswordAuthenticationFilter.class.

Проблема с этим подходом заключается в том, что даже для шаблонов URL, которые либо разрешены, либо разрешены с проверкой подлинности, проходят мой Фильтр авторизации. Я не хочу явно настраивать свое сопоставление фильтра на Фильтре авторизации, так как считаю, что это избыточно (уже присутствует в WebSecurityConfigurerAdapter). Можно ли в любом случае получить доступ к метаданным Spring Security или каким-либо другим способом пропустить фильтр авторизации для URL-адресов, помеченных как allowAll () или authenticated ()?

public class AuthorizationFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
        throws IOException, ServletException {

        //Calls a webservice to fetch the authorities based on the URL pattern.
        //Adds the authentication principal with Authorities to SecurityContextHolder.
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Я решил эту проблему, расширив WebExpressionVoter, как показано ниже:

public class CustomAuthoritiesVoter extends WebExpressionVoter {

    private static final String SUPPORTED_CLASS = "org.springframework.security.web.access.expression.WebExpressionConfigAttribute";


    @Override
    public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) {
        String exp = getExpressionString(attributes);

        if (null != exp && !StringUtils.equalsAny(exp, "authenticated", "permitAll")) {
            //Call service to fetch the authorities based on the userID and URL
            //Set Authentication principal along with fetched Authorities using SecurityContextHolder
        }

        return super.vote(authentication, fi, attributes);
    }

    private String getExpressionString(Collection<ConfigAttribute> attributes) {
        try {
            for (ConfigAttribute attribute : attributes) {
                if (attribute.getClass().isAssignableFrom(Class.forName(SUPPORTED_CLASS))) {
                    return attribute.toString();
                }
            }
        } catch (ClassNotFoundException e) {
            log.warn(e.getMessage(), e);
        }

        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...