【问题标题】:Spring - Access denied for an Anonymous AuthenticationSpring - 匿名身份验证的访问被拒绝
【发布时间】:2018-01-06 04:53:49
【问题描述】:

我对 Spring Security 没有太多的专业知识,我有一个可能有点傻的问题。几天来我一直在尝试解决一个问题,也许我误解了配置我的应用程序的方式。如果有人能对此有所启发,我将不胜感激。

我用 Spring 实现了一个 REST API,我想给它增加安全性。从Spring Security docs 我读到... 采用“默认拒绝”通常被认为是良好的安全实践,您可以明确指定允许的内容并禁止其他所有内容。 ... 我同意。所以我将身份验证要求添加到我的配置中。

但是,我想公开(从我的 GUI)对 API 的调用,所以我认为匿名身份验证会起作用。同样,从我阅读的文档中...... “匿名身份验证”用户和未经身份验证的用户之间在概念上没有真正的区别 所以,一切都好。

但是,当我执行这些调用时,我会收到 403 响应(AbstractSecurityInterceptor 在决定身份验证时会抛出 AccessDeniedException)。所以,我在这里留下几个问题+我的配置行,以防你知道我有什么问题和误解。

配置...

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .csrf().disable()
    .cors().and()
    .anonymous().and()
    .authorizeRequests()
    .antMatchers("/").permitAll()
    .antMatchers(HttpMethod.POST, "/users/login").permitAll()
    .anyRequest().authenticated().and()

    // We filter the api/login requests
    .addFilterBefore(new JwtLoginFilter("/users/login", authenticationManager()),
            UsernamePasswordAuthenticationFilter.class)
    .addFilterBefore(new JwtAuthenticationFilter(),
            UsernamePasswordAuthenticationFilter.class);
}

问题... 1) AnonymousAuthenticationToken 仍然是经过身份验证的,对吧?

2) 如果我不自定义匿名身份验证的配置,是否需要匿名()行?缺少身份验证时,匿名令牌就在那里(当我调试时)

3) 接受这些请求的配置中是否缺少任何内容?

4) 文档提到了 ExceptionTranslatorFilter,它应该将 AccessDeniedException 处理到 AuthenticationEntryPoint。我需要定义一个 AuthenticationEntryPoint 吗?如果有,目的是什么?

我尽量做到精确。我希望有人可以回复。 非常感谢您的帮助!

【问题讨论】:

  • 你叫什么网址?您是否还可以在日志文件中添加异常的堆栈跟踪。它应该显示,如果它是一个角色问题,一个 CORS 问题,一个 CSRF 问题,......

标签: java spring security spring-security


【解决方案1】:

你需要把它放到你的配置文件中:

http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll(); 

【讨论】:

  • 嗨@Akash,谢谢您的回复!我不认为 OPTIONS 方法是问题所在。实际上,我收到的 OPTIONS 状态为 200,但 GET 方法的状态为 403。
  • @MarcLoan OPTIONS 适用于所有类型(GET、POST、PUT、DELETE)
【解决方案2】:

您是否对根“/”具有未经身份验证的访问权限?我问这个是因为看起来就像你打算用这条线: .antMatchers("/").permitAll()

我想为了允许未经身份验证的请求(或匿名身份验证请求,请注意,对于 Spring Anonymous 和未经身份验证的请求基本相同),您需要为这些路径添加 ant 匹配,例如: .antMatchers("/public-page").permitAll()

【讨论】:

  • 完全正确@ramon-rius!解决方案是先前答案和您的答案的混合。表达式必须是“/**”(或您要允许访问的特定模式)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2017-11-28
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多