Как создать конечную точку, которая принимает либо базовый заголовок аутентификации, либо токен доступа oauth2? - PullRequest
0 голосов
/ 19 февраля 2019

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

Спасибо, Крис

1 Ответ

0 голосов
/ 19 февраля 2019

Да, это возможно.

Одна из опций использует ROLES, поэтому вы можете выбрать, какой пользователь будет обращаться к каждой конечной точке с помощью аннотации @Secured.

Другая опция заключается в реализации собственного фильтра.запускать перед запросами.Это простой пример с использованием фильтра токенов JWT и проверки:

public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

@Override
    public void configure(HttpSecurity http) {
        JWTFilter customFilter = new JWTFilter();
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }

}

public class JWTFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// Here go your implementation
        String jwt = resolveToken(httpServletRequest);
        if (isTokenValid(jwt)) {
            Authentication authentication = getAuthenticationFromToken(jwt);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

private String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("YOUR-AUTHORIZATION-HEADER");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7, bearerToken.length());
        }
        return null;
    }


...