【问题标题】:Spring Security Principal transformationSpring Security 主体改造
【发布时间】:2019-04-22 19:50:44
【问题描述】:

有没有办法在将 Spring Security Principal 注入 RestController 方法之前对其进行转换?

假设我定义了以下类:

@RestController
public class MyController {
    @GetMapping("/test")
    public void getWithPrincipalA(@AuthenticationPrincipal PrincipalTypeA a) {
        ...
    }

    @GetMapping("/test")
    public void getWithPrincipalB(@AuthenticationPrincipal PrincipalTypeB b) {
        ...
    }
}

我知道这些控制器方法是模棱两可的,我可以做几件事来解决这个问题,但我宁愿做的是将@AuthenticationPrincipal 转换为我可以定义的某种类型。结果会变成这样:

@RestController
public class MyController {
    @GetMapping("/test")
    public void getWithTransformedPrincipal(@AuthenticationPrincipal MyTransformedPrincipal principal) {
        ...
    }
}

现在我基本上可以为几个不同的身份验证主体定义一个控制器,而无需更改 API。

任何帮助将不胜感激:)

【问题讨论】:

  • 为什么?为什么不只创建一个方法并自行调度?
  • 你在谈论什么样的转型,目标是什么?
  • @AuthenticationPrincipal 是由 Spring Security 注入的,但是当您有不同的身份验证机制(cookie、令牌等)时,Principal 可能会有所不同。不过,我的其余 API 将是相同的。如果我可以捕获不同的Principals 并将它们转换为我的RestController 可以处理的通用方法,我就不必复制我的控制器方法。
  • 在我之前的评论中,我误解了您的评论。我会按照 M. Deinum 的建议去做。在控制器方法中转换主体并将该通用主体分派给其他人。
  • 您最终可以使用参数解析器从安全上下文中获取身份验证主体并从那里进行转换。

标签: java spring rest spring-security


【解决方案1】:

为了保持简单和透明,您可以简单地在控制器方法中转换主体并从那里分派通用主体。

@RestController
public class MyController {
    @GetMapping("/test")
    public void getWithTransformedPrincipal(@AuthenticationPrincipal Principal principal) {
        GenericPrincipal generic = PrincipalTransformer.transform(principal);
        doSomethingWithPrincipal(generic);
    }
}

【讨论】:

  • 是否有机会添加参数解析器解决方案作为替代方案?
  • 我宁愿不要。不是因为我不愿意。更多是因为我认为它会分散人们对更明显和简单的解决方案的注意力。
  • 对。虽然这是最初的问题:)
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2017-03-10
  • 2023-04-08
  • 2015-09-12
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多