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

Spring 5授权未按预期工作

顾正初
2023-03-14

我是Spring Security的新手。我们在我的一个示例示例中使用Spring Security 5.4.5和Spring Boot。

我在下面的配置类中尝试在RESTAPI的/user和/adminendpoint中应用Spring Security身份验证/授权。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    PasswordEncoder bcryptPasswordEncoder;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .anonymous().principal("guest").authorities("GUEST_ROLE")//Provide the name and role to the annonymous user
            .and()
            .authorizeRequests()
            .antMatchers("/register").anonymous()//allows registration page to be accessed by annonymous users only
            .and()
            .authorizeRequests()
            .antMatchers(HttpMethod.GET,"/admin").hasAnyRole("ADMIN_ROLE")
            .antMatchers(HttpMethod.GET,"/user").hasAnyRole("STUDENT_ROLE", "ADMIN_ROLE")
            .and()
            .httpBasic();


    }

    @Override
    @Bean
    protected UserDetailsService userDetailsService() {
        UserDetails annaSmithUserDetails = User.builder()
                .username("annasmith")
                .password(bcryptPasswordEncoder.encode("password"))//default password enoder is bcrypt
                .roles("STUDENT_ROLE", "ADMIN_ROLE") //role of the user
                .authorities("STUDENT_READ","STUDENT_WRITE","COURSE_READ","COURSE_WRITE") //authorities or we can say permission assigned to the user
                .build();
        return new InMemoryUserDetailsManager(annaSmithUserDetails);//can configure different
    }

}

根据上述Spring配置 /userUSER和ADMIN角色都可以访问, /adminADMIN角色也可以访问。

当我试图在浏览器中访问/user时,它会显示用户名和密码弹出窗口,一旦我输入配置用户的正确凭据,它就不工作,并给出403错误。

我有以下三个问题

  1. 控制台日志中没有看到任何错误,是否有办法可以看到Spring Security显示403错误的原因?
  2. 上面的Spring Security配置有什么问题,因为我无法访问REST APIendpoint?

共有1个答案

能正青
2023-03-14
  1. 我在控制台日志中没有看到任何错误,是否有办法了解spring security显示403错误的原因

通过启用spring调试日志,可以通过简单的谷歌搜索或在spring文档中找到如何做到这一点。学会调试你的应用程序(调试你的应用程序应该始终是你学习的第一件事,并且应该在询问堆栈溢出之前完成)。

上述Spring Security配置有什么问题,因为我无法访问REST APIendpoint?

由于您尚未透露如何访问应用程序,可能会出现一些问题。通过curl,web浏览器,在react应用程序中使用fetch的另一个webclient等也应该包括在询问堆栈溢出时,以便人们能够重现手头的问题。

但是列出一些可能出错的事情:

  • 您的请求处理不当
  • 您的密码可能不正确,因为我发现您的密码加密不正确(请参阅如何实际加密的文档)
  • 确保使用正确的前缀存储密码,或使用UserBuilder users=User。withDefaultPasswordEncoder() 在文档中构建用户时
  • 如果要遵循任何标准,则应定义不带前缀或后缀的角色(_ROLE)
  • 登录后是否重定向到不允许访问的内容

如您所见,有几件事可能是错误的,但您提供的信息太少,无法回答,在询问堆栈溢出之前,您可以做很多事情。

因为这个问题很模糊,所以答案很模糊。

 类似资料:
  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括:

  • 我正在和selenium一起工作,刮一些数据。 有一个按钮在页面上,我正在点击说“Custom_Cols”。这个按钮为我打开了一个窗口,我可以在那里选择我的列。 我的问题是为什么新窗口上的元素不可见,即使我正在等待元素的可见。补充一下,我已经尝试增加延迟时间,但我还是会偶尔出现这个错误。 我的密码在这里

  • 我正在使用Grails 2.0.1中的springsecurity插件。我的角色层次结构和其他s2属性如下所示。