2014-03-13 87 views
7

我使用下面的Java配置在Spring Security:混淆使用Java配置

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
      .anyRequest().authenticated() 
      .and() 
     .httpBasic(); 
} 

基于此配置,所有的请求进行身份验证。当您未经认证而击中控制器时,AnonymousAuthenticationFilter将为您创建一个身份验证对象username=anonymousUser, role=ROLE_ANONYMOUS

我试图提供AA特定的控制器方法匿名访问,并尝试使用以下每一项:

  1. @Secured("ROLE_ANONYMOUS")
  2. @Secured("IS_AUTHENTICATED_ANONYMOUSLY")

当被调用的控制方法,给出以下响应: “HTTP状态401 - 访问此资源需要完全身份验证”

有人可以帮助我理解为什么我们收到此消息,并且为什么ROLE_ANONYMOUS/IS_AUTHENTICATED_ANONYMOUSLY似乎无法使用此配置?

感谢,
JP

回答

3

您的安全配置阻止所有未经验证的请求。 你应该允许访问控制器

.antMatchers("/mycontroller").permitAll() 

参见:

+0

嗯...这是我不够明确。如果我使用前面指定的java config调用给定的url,如果我没有使用基本认证提供凭证,AnonymousAuthenticationFilter步入并创建一个认证对象,但使用ROLE_ANONYMOUS。这不应该仍然工作?我不知道你上面的配置应该是必要的。思考? – user2145809

+1

这是必要的,因为ROLE_ANONYMOUS指示用户是匿名的而不是经过身份验证的。请注意,您在控制器上指定的注释不会覆盖基于URL的安全性,它们将对其进行补充以提供纵深防御(即多层安全性)。 –

+0

Rob,我认为我的困惑源于对带有特定的@RequestMapping(value =“/ mycontroller”)映射注释的控制器方法使用@Secured(“ROLE_ANONYMOUS”)是注释“equivalent”:.antMatchers (“/ mycontroller”)。permitAll()或者.antMatchers(“/ mycontroller”)。hasRole(“ROLE_ANONYMOUS”)。根据你所说的话,注释配置不能替代xml/java配置(比如@RequestMapping是如何替代xml控制器映射的)。它是否正确? – user2145809