当前位置: 首页 > 知识库问答 >
问题:

针对特定终结点的多种安全配置

勾通
2023-03-14

我想知道是否有办法提供两种不同类型的身份验证?用户应该使用基本身份验证来记录、注册、获取endpoint的用户数据/login/register/User。当我调用/api时,它应该只使用头中提供的JWT令牌进行身份验证。

但是当我调用/api时,我会在没有任何身份验证的情况下获取所有数据。当用户登录并调用/user时,API允许JWT访问/API

我的代码:

基本身份验证的配置:

@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors()
                .and()
            .csrf().disable();
        http
            .authorizeRequests()
                .antMatchers("/user").authenticated()
                .antMatchers("/register").permitAll()
                .and()
            .formLogin().permitAll()
                .defaultSuccessUrl("/user");
    }

JWT auth的配置:

@Configuration
@Order(2)
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .antMatcher("/api/**")
            .addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic().disable();
    }

共有1个答案

蒋俊
2023-03-14

我也有同样的问题,我希望对一些endpoint进行基本身份验证,而对其他一些endpoint,我希望使用其他身份验证方法。就像你的一样。您需要对一些endpoint进行基本身份验证(/login/register/user),并对其他endpoint进行JWT身份验证(/api/**)。

我在spring security中使用了一些关于多个入口点的教程,但不起作用。

通过创建自定义筛选器,将基本身份验证与JWT身份验证分开。

>

/Basic前缀(用于/Basic请求)创建一个新的自定义过滤器,并检查基本身份验证

@Component
public class BasicAuthenticationFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;

    //Check for the requests that starts with /basic 
    if (httpServletRequest.getRequestURI().startsWith("/basic/")) {

        try {
            //Fetch Credential from authorization header
            String authorization = httpServletRequest.getHeader("Authorization");
            String base64Credentials = authorization.substring("Basic".length()).trim();
            byte[] credDecoded = Base64.getDecoder().decode(base64Credentials);
            String credentials = new String(credDecoded, StandardCharsets.UTF_8);
            final String username = credentials.split(":", 2)[0];
            final String password = credentials.split(":", 2)[1];

            //Check the username and password
            if (username.equals("admin") && password.equals("admin")) {
                //continue
                chain.doFilter(request, response);
            } else
                throw new AuthenticationCredentialsNotFoundException("");
        } catch (Exception e) {
            throw new AuthenticationCredentialsNotFoundException("");
        }

    } else chain.doFilter(request, response);

  }

}

只为JWT编写主安全配置,并允许/basicURL

@Configuration
@EnableWebSecurity
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/basic/**").permitAll().and()
            .csrf().disable()
            .antMatcher("/api/**")
            .addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic().disable();
}
 类似资料:
  • 我正在使用apache camel,希望有多条路由。路线如下。

  • 我正在尝试设置一个使用Jaeger/Prometheus的Spring应用程序。我已经通过prometheus.yaml文件成功配置了Prometheus,但我不明白如何配置Jaeger目标endpoint。我必须创建一个新的yaml文件并在其中指定配置吗?如果是,使用哪种语法?

  • 你好,我有一个与SAAS模型和多租户相关的问题。 据我所知,SAAS多租户应用程序意味着所有客户机的通用功能,以及一些用户界面和功能的定制。 如果我需要为一些客户进行额外的客户特定定制,我如何实现它? 我了解SalesForce的方法 至于答案,我很高兴看到你们在数据库级别的定制,后端架构,或者这个主题的任何链接方面都有经验。

  • 在我的控制器中,我有两个endpoint,其中一个是安全的,另一个是公共的: 仅当我已记录且具有正确角色的令牌放置在请求标头中时,受保护的终结点才有效。但是,当我想在没有令牌的情况下访问公共终结点时,我总是得到状态401,但有错误 需要完全身份验证才能访问此资源 这是我的安全配置: 和授权服务器配置: 我还尝试将更改为:没有更改。我的首选方法是使用注释处理安全性。谢谢。

  • #include <stdio.h> #include <pthread.h> int a = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(10); } } void *thread2_func(void

  • 问题内容: 我正在将Primefaces 3.2与JSF 2.0一起使用。 我正在使用 而对于ajaxStatus: 我在同一页面上还有很多其他primefaces组件,但是我只希望在按下此特定按钮时呈现p:ajaxStatus。有什么好的解决办法吗?ajaxStatus在每个ajax事件上呈现。 问题答案: 如果您有少量按钮,则可以对其进行设置,然后在不进行此设置的情况下保留所需的按钮。 这样,