Есть ли способ прочитать метаданные Spring Security?

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

Проблема с этим подходом заключается в том, что даже шаблоны URL, которые разрешены или разрешены при аутентификации, проходят через мой фильтр авторизации. Я не хочу явно настраивать сопоставление моего фильтра в фильтре авторизации, поскольку считаю, что это избыточно (уже присутствует в WebSecurityConfigurerAdapter). Могу ли я в любом случае получить доступ к метаданным Spring Security или каким-либо другим способом пропустить фильтр авторизации для URL-адресов, которые помечены как permissionAll () или 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 {

    }
}

Не могли бы вы поделиться своим настраиваемым фильтром?

chaoluo 31.10.2018 14:59

@chaoluo Я добавил свой фильтр авторизации и в комментариях указал, что он будет делать.

Viswa Teja Nariboina 31.10.2018 16:15

Я думаю, вы можете ввести свой собственный сопоставитель запросов в этот фильтр, чтобы пропустить эти URL-адреса

chaoluo 01.11.2018 06:16

да. Это работает. Но я хотел бы использовать для этого саму конфигурацию безопасности Spring HttpSecurity. Думаю, я нашел способ. Я могу зарегистрировать ObjectPostProcessor и извлечь информацию securityMetadataSource из FilterSecurityInterceptor. Спасибо за быстрый ответ @chaoluo.

Viswa Teja Nariboina 01.11.2018 14:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
172
1

Ответы 1

Я решил это, расширив 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;
    }
}

Другие вопросы по теме