带有嵌入式 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
如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名