我正在编写一个应用程序,在其中尝试配置不同端点的可见性。
我写了以下代码:
@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/