spring-security Spring Security permitAll不允许匿名访问

mwkjh3gx  于 2022-11-11  发布在  Spring
关注(0)|答案(8)|浏览(269)

我有一个方法,我想允许匿名和身份验证访问。
我使用的是Spring Security 3.2.4和基于Java的配置。
被覆盖的configure方法(在我的扩展WebSecurityConfigurerAdapter的自定义配置类中)具有以下http块:

http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

ping请求处理程序和方法位于也包含登录处理程序的控制器中,并且它没有单独的@PreAuthorize或其他可能导致此问题的注解。
问题是匿名访问被拒绝,用户被重定向到登录页。
在调试级别进行日志记录时,我看到了来自Spring Security的以下反馈:

[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point

我试图实现的是拥有一个可以在任何时候调用的方法,该方法将发送一个应答,指示请求是否在已登录的会话中。

8aqjt8rx

8aqjt8rx1#

权限顺序很重要,当我这样配置它时,它就起作用了:

.authorizeRequests()
        .antMatchers("/ping**")
        .permitAll()
        .and()
.authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
hxzsmxv2

hxzsmxv22#

我也看到了同样的问题。确保你没打电话
super.configure(http);
anyRequest().authenticated();
预设会呼叫。

to94eoyn

to94eoyn3#

需要添加 .annonymous()

http
    .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
    .addFilterBefore(cf, ChannelProcessingFilter.class)
    .anonymous().and()
    .authorizeRequests().anyRequest().authenticated().and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

参考来源:https://stackoverflow.com/a/25280897/256245

g6ll5ycj

g6ll5ycj4#

我为这个问题纠结了一天。最后我必须做的是从我的过滤器中删除@Component注解,并手动示例化它,如this答案中所述。
所以对于最初的问题,它看起来像这样:

http
    .addFilterBefore(new MultiPartFilter(), ChannelProcessingFilter.class)
    .addFilterBefore(new OtherFilter(), ChannelProcessingFilter.class)
    .authorizeRequests() // ... rest omitted for brevity

我还必须通过重写configure(WebSecurity web)从Spring Security中完全删除这些端点,如J.Perez的回答中所述:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/ping**");
}
but5z9lq

but5z9lq5#

@Override
public void configure(HttpSecurity http) throws Exception {
    http.anonymous().and()...;
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().mvcMatchers("/ping**");
}
3wabscal

3wabscal6#

由于我正在设置空白令牌API请求,因此发生了这种情况,我必须从我的Angular

if (token) {
    newHeaders = newHeaders.append('Authorization', 'Bearer' + ' ' + token);
}

此处的令牌为空

1u4esq0p

1u4esq0p7#

确保类注解为@Configuration。🤦‍♀️

2sbarzqh

2sbarzqh8#

我无法POST到permitAll()url。之后,我发现原因是CSRF已启用。所以我通过以下方法禁用它:

http.....and().csrf().disable();

P.S:这不是一个好主意,禁用它,我将不得不弄清楚如何在未来与CSRF后.

相关问题