【问题标题】:How to use custom roles in spring webflux security? [duplicate]如何在 spring webflux security 中使用自定义角色? [复制]
【发布时间】:2019-12-10 10:37:33
【问题描述】:

我已经关注 blog 的 Spring Webflux 和 JWT 以构建具有身份验证和授权的基本 REST API。

第一步: 令牌生成 api 与我在JWT 中测试过的角色一起正常工作。

Step2:当我尝试访问任何未给出结果的 REST API 时,使用 Token,出现以下错误:

{
    "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" }
    }

【问题讨论】:

  • @dur 谢谢。现在我可以使用令牌访问其他授权资源。最初,我不理解错误。它在 db 中的作用与在 enum 声明中的作用相同。

标签: spring-boot spring-security spring-webflux


【解决方案1】:

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

如果您有像 ADMIN 这样的自定义角色,则必须在 @PreAuthorize 中使用 ROLE_ADMIN

【讨论】:

  • 我试着喜欢这个但没有成功。
  • 请告诉您没有成功,遇到了什么问题,调试服务器日志说什么,请提供更多信息,而不仅仅是no success
  • 请发布您的安全配置和所有相关的安全类,如 AuthenticationManager 和 UserDetailsS​​ervice
  • 你的数据库角色应该是USER,你的角色枚举应该是Role.USER,而@PreAuthorize("hasRole('ROLE_USER')")应该是这样的前缀
  • 您还没有回答任何问题,角色是否在数据库中存储为“ROLE_USER”,因为这是错误的。您的代码非常混乱且难以理解。您是在命令式地编码,而不是使用 Mono/Fluxes 的功能,如果您阅读文档,那么 spring 中已经有一个内置的 JWT 过滤器。错误消息告诉你你的角色名是错误的
猜你喜欢
  • 2010-11-02
  • 2011-07-21
  • 2019-06-21
  • 2018-09-22
  • 2022-01-10
  • 2017-08-20
  • 2018-06-02
相关资源
最近更新 更多