带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色

Posted

技术标签:

【中文标题】带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色【英文标题】:Spring Boot with embedded Tomcat ignores Method Roles 【发布时间】:2015-05-11 16:07:54 【问题描述】:

我使用带有嵌入式 Tomcat 和 Spring Boot Starter Security 的 Spring Boot 1.2.1。此外,我将 RestController 用于某些 Web 服务,并且我希望只有具有特定角色的某些用户才能访问 Web 服务。但它不起作用,安全不使用 RoleVoter 检查角色。在以下示例中,用户“user”可以访问网络服务,尽管他没有正确的角色!

首先我的应用配置

@Configuration
@EnableJms
@ImportResource( "classpath:net/bull/javamelody/monitoring-spring.xml" )
@EnableAspectJAutoProxy
@ComponentScan
@PropertySource( "classpath:application.properties" )
@EnableAutoConfiguration
@EnableGlobalMethodSecurity( securedEnabled = true )
public class ItemConfiguration  ... 

现在我的安全配置

@Configuration
@EnableWebSecurity
@Order( SecurityProperties.ACCESS_OVERRIDE_ORDER )
public class SecurityConfig extends WebSecurityConfigurerAdapter 

  @Override
  protected void configure( AuthenticationManagerBuilder auth ) throws Exception 
    auth.inMemoryAuthentication().withUser( "user" ).password( "password" ).roles( "USER" );
  

  @Override
  protected void configure( HttpSecurity http ) throws Exception 
    http.authorizeRequests().anyRequest().fullyAuthenticated();
    http.httpBasic();
    http.csrf().disable();
  

休息控制器

@RestController
public class QueryController 

  @Secured(  "ROLE_ADMIN"  )
  @RequestMapping( value = "/", method =  POST , consumes =  MediaType.APPLICATION_JSON_VALUE ,
      produces = MediaType.APPLICATION_JSON_VALUE )
  ResponseEntity< List< BaseEntity > > query( @RequestBody @Valid final ItemQueryRequestData request )
      throws Exception 
      return new ResponseEntity<>( "", HttpStatus.OK );
  

application.properties

spring.data.mongodb.database = item
spring.data.mongodb.host = $MONGODB_URI:pimpoc01
spring.data.mongodb.port = $MONGODB_PORT:27017

spring.activemq.broker-url=$BROKER_URL:tcp://pimpoc01:61616
spring.activemq.user=
spring.activemq.password=
spring.activemq.pooled=true

queue.item.in.channelId = item-in
queue.item.in.concurrentConsumers = 1
queue.item.in.destination = item-in

queue.itemOption.in.channelId = itemOption-in
queue.itemOption.in.concurrentConsumers = 1
queue.itemOption.in.destination = itemOption-in

queue.style.in.channelId = style-in
queue.style.in.concurrentConsumers = 1
queue.style.in.destination = style-in

queue.concurrentConsumers = 50
queue.dataCreation.response = dataCreationResponse

queue.structureAttributeValue.in.channelId = structureAttributeValue-in
queue.structureAttributeValue.in.concurrentConsumers = 1
queue.structureAttributeValue.in.destination = structureAttributeValue-in

validation.endpoint = $VALIDATOR_URI:http://pimpoc01:8080/validator

感谢您的帮助!

【问题讨论】:

你能发布你的application.properties的内容吗?也许你有一个属性,这会干扰这里。 @mathias-noack 运气好吗? 【参考方案1】:

从安全配置中删除以下行。我认为@Order 注释覆盖了基本身份验证。

@Order( SecurityProperties.ACCESS_OVERRIDE_ORDER )

【讨论】:

我删除了它,但没有任何改变。对于用户是否可以访问网络服务的决定,它只调用WebExpressionVoter 而不是RoleVoter!只有RoleVoter 会检查用户的角色。 在本文档中 - docs.spring.io/spring-boot/docs/current/reference/html/… ,如果您转到页面末尾。它表示如果 Actuator 正在使用,默认用户将具有 ADMIN 角色以及 USER 角色。。我不完全理解这个说法,但不确定这是否是问题。 是的,我已经读过了,但我不使用执行器。正如您在上面看到的,我也不使用标准用户。我只有一个角色为“USER”的用户,但他仍然可以访问网络服务。【参考方案2】:

我遇到了类似的问题并通过公开我的控制器方法来解决,即使QueryController.query方法public

【讨论】:

以上是关于带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色

使用带有嵌入式 Tomcat 的 Spring Boot Weblfux

Spring启用/禁用带有配置文件的嵌入式tomcat

如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名

带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog

如何在带有嵌入式 tomcat 的 Spring Boot 应用程序中运行 hawt.io