我正在编写一个应用程序,在其中尝试配置不同端点的可见性。

我写了以下代码:

@Override
   protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
        .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
        .antMatchers(HttpMethod.POST, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/").authenticated()
        .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
        .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
        .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
        .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
        .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JWTAuthenticationFilter(authenticationManager()))
        .addFilter(new JWTAuthorizationFilter(authenticationManager()))
     .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .logout()
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(new Http401AuthenticationEntryPoint("No authorization"));


我的程序的行为非常奇怪,因为当我尝试到达“ / login”或“ /”端点时,该程序有时会返回401(如果用户尚未登录,则afaik应该重定向到登录页面)。

之后,我重新启动它,也许在其他地方进行了一些细微更改,这些更改似乎完全无关紧要,并且我的网站再次正常运行。

你们有遇到过这类问题吗?是什么原因呢?我在配置中做错了什么吗?

最佳答案

这里突出的三件事


您有一个自定义的入口点,并且认为入口点发送的是401,而不是重定向到/ login
您没有formLogin(),因此无法处理用于登录页面的过滤器
我们不知道您的过滤器会在什么时候做什么


至于配置,让我们先开始

    http
        .cors()
            .and()
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
            .antMatchers("/login").permitAll()
            .antMatchers(HttpMethod.GET, "/").authenticated()
            .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
            .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
            .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
            .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
            .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
            .anyRequest().authenticated()
            .and()
        .addFilterBefore(new JWTAuthenticationFilter(authenticationManager()), HeaderWriterFilter.class)
        .addFilterAfter(new JWTAuthorizationFilter(authenticationManager()), JWTAuthenticationFilter.class)
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .formLogin()
            .and()
        .logout()
        ;


所以我们做了什么改变,


删除身份验证入口点,然后将JWT筛选器移到最前面。
如果这些过滤器触发了(并且它们不应该为非REST端点触发,那么您必须编写该逻辑),那么系统要么已通过身份验证,要么过滤器本身返回401并且不会引发异常。也许您可以让我们知道这些过滤器是否确实在做正确的事情?
如果JWT过滤器不执行任何操作,则其他所有功能都将发挥作用。因此,我们在formLogin()中添加了所有默认配置。如果由于请求未通过身份验证而调用身份验证入口点,则将重定向到/ login

关于java - 不同的端点看似随机地被授权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54245786/

10-16 00:00