首页 > 解决方案 > 如何在 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-bootspring-securityspring-webflux

解决方案


默认情况下,Spring 会将前缀ROLE_应用于所有使用的角色。

如果你有一个自定义角色,ADMIN你将不得不在@PreAuthorize使用ROLE_ADMIN


推荐阅读