gpt4 book ai didi

java - 在 Spring 的配置类中获取经过身份验证的用户

转载 作者:行者123 更新时间:2023-12-02 11:58:28 26 4
gpt4 key购买 nike

我正在使用 Spring Security 来验证用户身份。我需要解析哪个用户已在我的 ApplicationConfiguration 中进行身份验证以提供正确的数据,但由于某种原因,以下代码返回 null :

 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
<小时/>

编辑:我基本上想将服务注入(inject) Controller 中。 ( PackagesBaseService )

此服务是抽象的,因此在我的 bean 定义中(在配置类中)我需要解析 if PackagesBaseServiceTablePackagesService 的一个实例或DeskPackagesService 。这取决于哪个用户经过身份验证(此要求无法更改)。

我知道即使在我的 Controller 中我也可以测试经过身份验证的用户并在那里实例化我的服务,但我想避免这种情况。

<小时/>

我可以从其他地方使用相同的方法检索身份验证用户。

为什么我不能从配置文件中使用它?它与 bean 加载的顺序有关系吗?

我该如何解决这个问题?

实现:

配置:

@Bean
public PackagesBaseService packagesBaseService()
{
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {

if (authentication.getName() == env.getProperty("tableFactory.username")) {
return new TablePackagesService();
}

if (authentication.getName() == env.getProperty("deskFactory.username")) {
return new DeskPackagesService();
}

// thrown Exception
}

// thrown Exception

}

Controller :

@Autowired
PackagesBaseService packagesService;

public MultiPackagesResponse data(@RequestParam("fromId") int fromId)
{
MultiPackagesResponse response = packagesService.getPackages(fromId);

return response;
}

最佳答案

您需要使用工厂才能使用用户上下文。这可能看起来像这样:定义工厂 bean:

@Service
public class PackageBaseServiceFactory {

public final HashMap < String,
PackageBaseService > packageBaseServiceCache = new HashMap();

public PackageBaseService getPackageService() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {
PackageBaseService packageBaseService = packageBaseServiceCache.get(authentication.getName());
if (packageBaseService == null) {
packageBaseService = initPackagesBaseService(authentication.getName());
}
return packageBaseService;
}
}

private PackageBaseService initPackagesBaseService(String authenticationName) {
PackageBaseService packageBaseService;
if (authenticationName == env.getProperty("tableFactory.username")) {
packageBaseService = new TablePackagesService();

} else if (authenticationName == env.getProperty("deskFactory.username")) {
packageBaseService = new DeskPackagesService();
} else {
throw new IllegalStateException(); //or whatever you do
}
return packageBaseServiceCache.put(authenticationName, packageBaseService);
}
}

这样使用它

@Autowired
PackageBaseServiceFactory packageBaseServiceFactory;

public MultiPackagesResponse data( @ RequestParam("fromId")int fromId) {
MultiPackagesResponse response = packageBaseServiceFactory.getPackageService().getPackages(fromId);

return response;
}

关于java - 在 Spring 的配置类中获取经过身份验证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com