spring-boot - 如何在 spring webflux security 中使用自定义角色?
问题描述
我关注了 Spring Webflux 和 JWT 的博客,用于构建具有身份验证和授权的基本 REST API。
第 1 步:令牌生成 api 与我在JWT中测试过的角色正常工作。
第2步:当我尝试访问任何没有给出结果的REST API时使用令牌,给出以下错误:
{
"timestamp": 1564685146747,
"path": "/api/user/getallusers",
"status": 500,
"error": "Internal Server Error",
"message": "No enum constant com.example.learn.constant.Role.USER",
"trace": "java.lang.IllegalArgumentException: No enum constant com.example.learn.constant.Role.USER\r\n\tat java.lang.Enum.valueOf(Unknown Source)\r\n\tat org.springframework.data.mongodb.core.convert.MappingMongoConverter.getPotentiallyConvertedSimpleRead(MappingMongoConverter.java:944)\r\n\tat
org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1495)\r\n\tat ...."
}
休息控制器是:
@RestController
public class UserController {
@Autowired
private UsersRepository userRepository;
// this api is not working
@RequestMapping(value = "/api/user/getallusers", method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_USER')")
public Flux<Users> getAllUsers() {
System.out.println("COMINING"); // ok
return userRepository.findOneByEmail("user1@learning.com");
}
// while this api is working
@RequestMapping(value = "/api/user/users", method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_USER')")
public Mono<ResponseEntity<?>> users() {
return Mono.just(ResponseEntity.ok(new Message("data")));
}
// Response : { content:"data" }
}
解决方案
默认情况下,Spring 会将前缀ROLE_
应用于所有使用的角色。
如果你有一个自定义角色,ADMIN
你将不得不在@PreAuthorize
使用ROLE_ADMIN