如何实例化 java.security.Principal?不推荐使用所有子类

Chl*_*loe 0 java spring spring-boot java.security

我有一个接受 Principal 的 Spring API 服务。

public ResponseEntity<ApiCustomResponse> create(Principal principal, UrlInfoData urlinfo) throws ApiException;
Run Code Online (Sandbox Code Playgroud)

Principal 由 Spring 为 OAuth2 API 调用自动创建。我想为网页管理界面使用相同的服务。

@Autowired
private IShortUrlService apiService;
...
    Principal principal = new Principal();
    apiService.create(principal, urlinfo);
Run Code Online (Sandbox Code Playgroud)

我想用当前登录的管理员用户名实例化主体。但是,不推荐使用所有实例化类。如何实例化主体以传递给服务?

https://docs.oracle.com/javase/8/docs/api/java/security/Principal.html

小智 5

既然java.security.Principal是接口,为什么不实现呢?

Principal principal = new Principal() {

        @Override
        public String getName() {
            return adminName;
        }

    }
apiService.create(principal, urlinfo);
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过以下方式获取当前登录用户的主体: SecurityContextHolder.getContext().getAuthentication().getPrincipal()

  • 执行此操作的更短方法是使用 lambda:`final Primaryprincipal = () -&gt; adminName;` (3认同)