gpt4 book ai didi

java - Apereo Cas - 自定义主体 ID 发布

转载 作者:行者123 更新时间:2023-12-02 10:37:01 25 4
gpt4 key购买 nike

我需要编辑将返回到 CAS 客户端应用程序的主体 ID。

我需要编辑的主体是从我不拥有的外部 idp 返回的,其格式如下:

Id: idp autogenerated ID having no meaning for my setup
Attributes:
... Some attributes I do not need ...
**ImportantId**(this is the property I need)

我已阅读 official documentation所以根据我的理解,我的服务 json 文件的相关部分应该是:

...       
"usernameAttributeProvider" : {
"@class" : "com.mypackage.cas.principal.MyCustomRegisteredServiceUsernameProvider",
"canonicalizationMode" : "NONE"

在我的自定义UserNameProvider类中,我需要访问数据库,以便根据我上面提到的importantId获取我的设置特定用户名,所以我需要做一些事情像这样:

public class MyCustomRegisteredServiceUsernameProvider implements RegisteredServiceUsernameAttributeProvider {

@Autowired
UsersService usersService;

@Override
public String resolveUsername(Principal principal, Service service, RegisteredService registeredService) {
// String importantId = ...getting it from principal attributes..
return usersService.getUserNameFromImportant(importantId);

}
}

不幸的是,问题是 Autowired 注释不起作用,因此我的 UsersService 未初始化,导致运行时出现 NPE。

所以,首先我想知道为什么我的方法不起作用,其次,实现这种行为的 cas“官方”方法是什么?

Cas版本:5.3.4 Cas叠加模板

环境:W10 x64、Java 8

部署在 Wildfly 12 上

最佳答案

So, firstly I would like to know why my approach is not working

...因为这样的提供者不是 spring 管理的 bean。它们是从 JSON 文档中找到的序列化对象,并且永远不会通过 Spring 运行时。

and secondly what is the cas "official" way to achieve this behavior?

一种可能的解决方法是删除注入(inject)的字段并在您的 resolveUsername 方法中执行此操作:

var appContext = ApplicationContextProvider.getApplicationContext();
var usersService = appContext.getBean("bean-name", UsersService.class);
return usersService.getUserNameFromImportant(importantId);

关于java - Apereo Cas - 自定义主体 ID 发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203932/

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