gpt4 book ai didi

java - Spring数据休息+Spring安全: @Secured not working

转载 作者:行者123 更新时间:2023-12-01 09:21:43 25 4
gpt4 key购买 nike

我正在使用 Spring Data RestSpring BootSpring Security 构建应用程序。我需要在方法上使用 @Secured 注释,并且我已按以下方式配置 Spring Security:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

// @formatter:off
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.securityContext().securityContextRepository(securityContextRepository())
.and()
.exceptionHandling()
.accessDeniedPage(RestPath.Errors.ROOT + RestPath.Errors.FORBIDDEN)
.and()
.csrf().disable();
}
// @formatter:on

@Bean
public SecurityContextRepository securityContextRepository() {
return new ApiUserSecurityContextRepository();
}

@Bean
public UserDetailsService userDetailsService() {
return new ApiUserDetailsService();
}

@Bean
public AuthenticationManager authenticationManager() throws Exception {
return new ProviderManager(Collections.singletonList(authenticationProvider()));
}

@Bean
public AuthenticationProvider authenticationProvider() throws Exception {
final DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService());
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

这种类型的配置适用于常规 MVC Controller ,当我尝试访问它们时会返回 403。例如,以下 Controller 安全性有效:

@ResponseBody
@RequestMapping(value = RestPath.Configs.SLASH_TEST, method = RequestMethod.GET, produces = MediaTypes.HAL_JSON_VALUE)
@Secured({"ROLE_USER"})
public ResponseEntity test(@RequestParam(value = RestParam.DB_TEST, required = false) final boolean dbTest) throws ApplicationAvailabilityException {
final AppTestData appTestData = configService.testAppAvailability(dbTest);
return ResponseEntity.ok(projectionFactory.createProjection(AppTestProjection.class, appTestData));
}

但是,当我尝试在其余存储库上使用 @Secured 注释时 - 它不会,例如:

@RepositoryRestResource(collectionResourceRel = Shop.COLLECTION_NAME, path = RestResourceRel.SHOPS, excerptProjection = StandardShopProjection.class)
@Secured({"ROLE_USER"})
public interface RestShopRepository extends MongoRepository<Shop, String> {

@Secured({"ROLE_ADMIN"})
@Override
Shop findOne(String s);
}

ApiUserSecurityContextRepository 两种方法都被调用,但只有自定义 MVC Controller 到达链的末尾,我可以检查它是否访问 vote() RoleVoter 类中用于授予访问权限的方法。例如,我检查了 Spring Data Rest + Spring Security示例,因此 @Secured@PreAuthorize 注释应该与 Spring Data Rest 一起使用。有什么想法为什么它们不起作用吗?

最佳答案

问题终于解决了。问题如下,我在不同的应用程序模块中有另一个 ShopRepository ,它没有用 @RepositoryRestResource 注释,并且它是使用 REST 访问它时使用的那个.

自定义RepositoryRestConfigurerAdapter中的以下配置行修复了需要公开的存储库的探索,因此现在仅公开带注释的存储库:

config.setRepositoryDetectionStrategy(RepositoryDetectionStrategy.RepositoryDetectionStrategies.ANNOTATED);

之后我根本无法使用 REST 访问该资源,因此我发现它对 Spring 不可见。我只需使用注释 @EnableMongoRepositories 在 API 级别启用 Mongo 存储库。

关于java - Spring数据休息+Spring安全: @Secured not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com