SpringBoot项目访问任意接口出现401错误的解决方案

当我们使用SpringBoot项目访问任意接口时出现401错误,可能是因为项目的权限配置问题导致的。下面是解决它的完整攻略:

1.检查接口权限

首先我们需要检查接口权限,确定是否已经在项目中配置了相应的权限。我们可以通过查看Spring Security配置文件(一般为SecurityConfig.java)的代码或者在SpringBoot Admin管理后台中查看项目的接口权限配置。

如果确实存在接口权限,我们需要检查用户是否拥有该权限。可以在SecurityConfig.java文件中找到所有对应权限的用户,并检查他们的信息是否正确。

另外,如果我们已经确定了接口并检查了用户权限,还是无法访问接口,可能是因为我们没有正确配置Spring Security,需要进行如下操作:

2.添加Spring Security配置

在项目中添加Spring Security配置文件SecurityConfig.java,包括安全配置、认证方式、权限配置等,示例代码如下:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired
    private RestAuthenticationFailureHandler restAuthenticationFailureHandler;

    @Autowired
    private RestAuthorizationFailureHandler restAccessDeniedHandler;

    @Autowired
    private RestLogoutSuccessHandler restLogoutSuccessHandler;

    @Autowired
    private RestAuthenticationSuccessHandler restAuthenticationSuccessHandler;

    @Autowired
    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers("/static/**").permitAll()
                .antMatchers("/api/**").permitAll()
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
                .exceptionHandling()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
                .accessDeniedHandler(restAccessDeniedHandler)
                .and()
                .formLogin()
                .loginProcessingUrl("/login")
                .successHandler(restAuthenticationSuccessHandler)
                .failureHandler(restAuthenticationFailureHandler)
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(restLogoutSuccessHandler)
                .permitAll()
                .and()
                .headers()
                .frameOptions().disable()
                .and()
                .addFilterBefore(authenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class)
                .exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler)
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Collections.singletonList("*"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        config.setAllowCredentials(true);
        config.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
        source.registerCorsConfiguration("/**", config);
        return source;
    }

    @Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilter() {
        return new JwtAuthenticationTokenFilter();
    }

    @Bean
    public RestfulAccessDeniedHandler restfulAccessDeniedHandler() {
        return new RestfulAccessDeniedHandler();
    }

    @Bean
    public RestLogoutSuccessHandler restLogoutSuccessHandler() {
        return new RestLogoutSuccessHandler();
    }

    @Bean
    public RestAuthenticationSuccessHandler restAuthenticationSuccessHandler() {
        return new RestAuthenticationSuccessHandler();
    }

    @Bean
    public RestAuthenticationFailureHandler restAuthenticationFailureHandler() {
        return new RestAuthenticationFailureHandler();
    }

    @Bean
    public RestAuthorizationFailureHandler restAuthorizationFailureHandler() {
        return new RestAuthorizationFailureHandler();
    }

    @Bean
    public RestAuthenticationEntryPoint restAuthenticationEntryPoint() {
        return new RestAuthenticationEntryPoint();
    }

    @Bean
    public RestAuthorizationEntryPoint restAuthorizationEntryPoint() {
        return new RestAuthorizationEntryPoint();
    }

    @Bean
    public RestAccessDeniedHandler restAccessDeniedHandler() {
        return new RestAccessDeniedHandler();
    }

    @Bean
    public CustomUserDetailsService userDetailsService() {
        return new CustomUserDetailsService();
    }

}

3.添加用户

在数据库中添加用户,可通过Mybatis等持久化框架或者使用Spring Security提供的内存方式进行添加。

在授权中,用户可以拥有多个角色,可以使用以下函数向数据库中添加具有user和admin角色的用户:

INSERT INTO `user` (`id`, `username`, `password`, `nickname`, `gender`, `status`, `phone`, `email`, `birthday`, `address`, `avatar`, `remark`, `create_time`, `update_time`) VALUES (1, 'user', '$2a$10$LcwB/9Mt4ymfY/XrIufkjuAaLCVtuWs0aunsKsrMZSHw/LsZEhF9u', '正常用户', 'male', 'enable', '13988888888', 'test@qq.com', NULL, '北京市', NULL, NULL, '2020-12-09 11:57:40', '2020-12-09 11:57:40');
INSERT INTO `user_role` (`id`, `user_id`, `role_id`) VALUES (5, 1, 1);

INSERT INTO `user` (`id`, `username`, `password`, `nickname`, `gender`, `status`, `phone`, `email`, `birthday`, `address`, `avatar`, `remark`, `create_time`, `update_time`) VALUES (2, 'admin', '$2a$10$hSjVNKNnEn6WrW5Vr5hdpuN9fCJaZQJvzN5G2Jlg1aRO4EvjM1M6G', '管理员', 'male', 'enable', '17888888888', 'test@qq.com', NULL, '北京市', NULL, NULL, '2020-12-09 11:57:40', '2020-12-09 11:57:40');
INSERT INTO `user_role` (`id`, `user_id`, `role_id`) VALUES (6, 2, 2);

总结

通过以上步骤我们可以解决SpringBoot项目访问任意接口出现401错误的问题,分别为检查接口权限和添加Spring Security配置两大部分,核心是在SecurityConfig.java中实现了认证和授权,以及用户添加等相关内容。

另外,对于程序员而言,熟练掌握Spring Security框架,并在其中添加自定义的授权方式和安全配置可以有效提升应用程序的安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot项目访问任意接口出现401错误的解决方案 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解SpringBoot Starter作用及原理

    Spring Boot Starter是一种用于简化Spring Boot应用程序开发的工具,它提供了一种快速启动应用程序的方式,使得开发者可以更加专注于业务逻辑的实现。在本攻略中,我们将介绍Spring Boot Starter的作用及原理,并提供两个示例来说明其用法。 以下是两个示例,介绍Spring Boot Starter的用法: 示例一:使用Spr…

    Java 2023年5月15日
    00
  • Java编程实现数组转成list及list转数组的方法

    Java编程实现数组转成list及list转数组的方法 在Java编程中,我们经常需要将数组和List之间进行转换。下面是将数组转换成List和将List转换成数组的方法: 将数组转换成List 使用Arrays.asList(Object[] array) 可以使用Arrays.asList()方法将数组转换成List。代码示例如下: // 定义一个数组 …

    Java 2023年5月26日
    00
  • 详解Java线程堆栈

    详解Java线程堆栈 什么是Java线程堆栈 Java线程堆栈,也称为Java Stack,是Java虚拟机(JVM)运行时数据区的一部分。每个Java线程都有自己的线程堆栈,用于存储该线程正在执行的方法和相应的局部变量、操作数栈和返回值。线程在调用一个方法时,就会为该方法创建一个新的栈帧并将其放到堆栈的顶部,然后在该栈帧中执行该方法。 线程堆栈的结构 Ja…

    Java 2023年5月18日
    00
  • hibernate批量操作实例详解

    Hibernate批量操作实例详解 批量操作是什么? Hibernate中的批量操作是指将多个数据库操作语句合并成一个批量操作,通过一次提交将所有语句提交到数据库,从而提高数据库操作效率。 常见的批量操作方法 批量新增 Session session = sessionFactory.getCurrentSession(); for(int i = 0; i…

    Java 2023年5月20日
    00
  • Java如何获取List中的String详解

    我来详细讲解一下怎样获取List中的String。 获取List中的String 方法一:for循环遍历获取 最常见的获取List中的String的方法是通过for循环来遍历List中的每一个String,然后依次获取每个String。下面是示例代码: List<String> list = new ArrayList<String>…

    Java 2023年5月27日
    00
  • Struts2实现单文件或多文件上传功能

    实现文件上传功能的步骤: 配置文件上传参数:在Strust2的配置文件struts.xml中设置maxFileSize参数,设置单个文件最大大小;以及maxRequestSize参数,设置总文件大小。 <constant name="struts.multipart.maxFileSize" value="5 * 1024…

    Java 2023年5月20日
    00
  • Spring基于注解管理bean实现方式讲解

    让我来讲解一下“Spring基于注解管理bean实现方式讲解”的完整攻略。 1. 什么是Spring注解管理Bean Spring注解管理Bean是一种不需要在XML或Java配置文件中手动定义bean实例的管理方式,而是使用注解的方式来进行实例的创建、初始化和依赖注入。相对于传统的XML或Java配置方式,使用注解可以使代码更加简洁,并且可以更加方便地进行…

    Java 2023年5月31日
    00
  • mybatis插件pageHelper实现分页效果

    Mybatis插件PageHelper实现分页效果攻略 1. 前言 Mybatis是一个优秀的ORM框架,但默认不支持分页功能。如果我们想要在Mybatis中实现分页功能,需要手动在SQL语句中添加limit关键字等分页功能代码,这显然是非常繁琐和困难的,而PageHelper插件的出现解决了这一问题。本文将详细介绍如何使用PageHelper插件实现Myb…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部