Java Spring安全主体转换

Java Spring安全主体转换,java,spring,rest,spring-security,Java,Spring,Rest,Spring Security,在将Spring安全主体注入RestController方法之前,是否有方法转换它 假设我定义了以下类: @RestController public class MyController { @GetMapping("/test") public void getWithPrincipalA(@AuthenticationPrincipal PrincipalTypeA a) { ... } @GetMapping("/test") p

在将Spring安全主体注入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


任何帮助都将不胜感激:)

也请保持简单和透明,您只需在控制器方法中转换主体,并从那里分派通用主体即可

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

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

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

为什么?为什么不创建一个方法并分派自己呢?您谈论的是什么样的转换,目标是什么?Spring Security注入了
@AuthenticationPrincipal
,但是当您拥有不同的身份验证机制(cookie、令牌等)时,
Principal
可能会有所不同。不过,我的RESTAPI将是相同的。如果我可以捕获不同的
主体
并将它们转换为我的
RestController
可以处理的通用方法,我就不必复制我的控制器方法。在我之前的评论中,我误解了你的评论。我会照戴纳姆先生的建议去做。在控制器方法内转换主体,并将该通用主体分派给其他主体。您最终可以使用参数解析器从安全上下文中获取身份验证主体并从中进行转换。为什么?为什么不创建一个方法并分派自己呢?您谈论的是什么样的转换,目标是什么?Spring Security注入了
@AuthenticationPrincipal
,但是当您拥有不同的身份验证机制(cookie、令牌等)时,
Principal
可能会有所不同。不过,我的RESTAPI将是相同的。如果我可以捕获不同的
主体
并将它们转换为我的
RestController
可以处理的通用方法,我就不必复制我的控制器方法。在我之前的评论中,我误解了你的评论。我会照戴纳姆先生的建议去做。在控制器方法内转换主体,并将该通用主体分派给其他主体。您最终可以使用参数解析程序从安全上下文中获取身份验证主体,并从中进行转换。是否有可能添加参数解析程序解决方案作为替代方案?我不希望如此。不是因为我不愿意。更重要的是,我认为这会分散人们对更明显、更简单的解决方案的注意力。尽管这是最初的问题:)有没有可能添加参数解析器解决方案作为替代方案?我宁愿没有。不是因为我不愿意。更重要的是,我认为这会分散人们对更明显、更简单的解决方案的注意力。尽管这是最初的问题:)