Apereo Cas-自定义主要ID发行

时间:2018-11-08 08:30:16

标签: java spring cas

我需要编辑将返回到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类中,我需要访问db以获得基于上面提到的 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覆盖模板

Env:W10 x64,Java 8

部署在Wildfly 12上

1 个答案:

答案 0 :(得分:1)

  

所以,首先,我想知道为什么我的方法不起作用

...因为此类提供程序不是春季托管的bean。它们是从JSON文档中找到的序列化对象,并且此类对象永远不会通过Spring运行时。

  

其次,实现这种行为的cas“正式”方式是什么?

一种可能的解决方法是删除注入的字段,然后在您的resolveUsername方法中执行此操作:

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