java - 如何创建一个接受基本身份验证 header 或 oauth2 访问 token 的端点?

标签 java spring-boot spring-security oauth-2.0

我已经使用 Spring Boot Security 设置了 OAuth2 身份验证服务器,一切运行良好。接下来我想做的是创建一个 super 用户,它可以仅使用基本的身份验证 header 向每个端点发送请求,而不会影响其他用户的身份验证流程。 Spring Boot 安全性可以做到这一点吗?

谢谢, 克里斯

最佳答案

是的,这是可能的。

一个选项是使用 ROLES,因此您可以使用 @Secured 注释选择访问每个端点的用户。

其他选项包括实现您自己的过滤器以在请求之前运行。 这是一个使用 JWT token 过滤和验证的简单示例:

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;
    }


关于java - 如何创建一个接受基本身份验证 header 或 oauth2 访问 token 的端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54768979/

相关文章:

java - Spring Security 身份验证 - 有关文档的问题

Java,线程启动时主代码停止

java - 如何为junit编写通用的tearDown方法?

java - MapStruct 实现在 Spring Boot Web 应用程序中不起作用

spring - 在 apache tomcat 6.0.14 中使用 spring 3 最新源代码

java - Spring Security 中的 CSS

java - 从 Java 应用程序登录 MySql

java - 如何在任意位置以 O(1) 的时间进行插入和读取?

java - 这两个正则表达式有什么区别?

spring - 带有枚举的 QuerySyntaxException