我正在编写一个应用程序,试图在其中配置不同端点的可见性。
我写了以下代码:
@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应该重定向到登录页面)在)。
此后,我重新启动它,也许在其他地方进行了一些细微更改,这些更改似乎完全无关紧要,然后我的网站又可以正常工作了。
你们中有人遇到过这类问题吗?是什么原因呢?我在配置中做错了什么吗?
答案 0 :(得分:1)
这里突出的三件事
您有一个自定义的入口点,并且认为入口点发送的是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