Spring Security Principal转换

时间:2018-11-20 11:15:36

标签: java spring rest spring-security

在将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。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:2)

要使事情保持简单和透明,您可以简单地在控制器方法中转换主体,然后从那里分派泛型主体。

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