WSO2IS/APIM:如何在自定义身份验证器中分配用户角色

Posted

技术标签:

【中文标题】WSO2IS/APIM:如何在自定义身份验证器中分配用户角色【英文标题】:WSO2IS/APIM: How to assign user role in a custom authenticator 【发布时间】:2016-04-08 03:44:56 【问题描述】:

我正在尝试实现用于 WSO2-IS 和 WSO2-APIM 的自定义身份验证器。但是,我找不到将角色分配给经过身份验证的用户的方法。

我希望经过身份验证的用户具有“客户”角色。下面是我在方法 processAuthenticationResponse 中使用的代码。

Map<ClaimMapping, String> claims = new HashMap<ClaimMapping, String>();
claims.put(ClaimMapping.build("http://wso2.org/claims/role", "http://wso2.org/claims/role", null, false), "customer");

AuthenticatedUser user = AuthenticatedUser.createLocalAuthenticatedUserFromSubjectIdentifier("xxxxxx");
context.setSubject(user);

非常感谢任何正确实施此操作的指南。

非常感谢。

【问题讨论】:

【参考方案1】:

我假设您的用户存储中已经有一个名为“客户”的角色。 您可以在这里做的是通过实现org.wso2.carbon.user.core.listener.UserOperationEventListener 来实现自定义UserStoreEventListener。如果您的组件激活,您需要将此侦听器注册为 osgi 服务。

protected void activate(ComponentContext context) 

    YourListener yourListener =
            new YourListener();
    context.getBundleContext().registerService(
            UserOperationEventListener.class.getName(), yourListener, null);

您可以通过扩展org.wso2.carbon.user.core.common.AbstractUserOperationEventListener 来编写此侦听器,这是此接口的抽象实现。

然后通过实现postAuthenticate 方法,您可以添加所需的功能,如下所示。

import org.wso2.carbon.user.core.common.AbstractUserOperationEventListener;

public class YourListener extends AbstractUserOperationEventListener 
public boolean isEnable() 
    //add implementation to this or you can enable always by returning true


public int getOrderId() 
    //give the order this listener should executed eg-:120


@Override
public boolean doPostAuthenticate(String userName, boolean authenticated,
                                  UserStoreManager userStoreManager) throws UserStoreException 

    userStoreManager.updateRoleListOfUser(userName,new String[0], new String[]"customer");
 

【讨论】:

感谢您的建议。不过我试过了,还是不行。我已经调试过,似乎在我在自定义身份验证器中对用户进行身份验证后没有调用方法 doPostAuthenticate。更多信息。我在用户存储中定义了角色“客户”。但是,我通过自定义身份验证器进行身份验证的用户名不在用户存储中。 (这就是为什么我必须编写自定义身份验证器)。这是正确的方法吗? 如果方法 'doPostAuthenticate' 没有被调用,这应该是您的服务注册中的问题。检查您的听众是否已正确注册。您的用户和“客户”角色是否在两个不同的用户存储中?您不能将不同用户存储中的角色分配给另一个用户存储中的用户 嗨查米拉。抱歉,我的问题不清楚。我正在尝试编写一个自定义身份验证器,通过移动应用程序对用户进行身份验证(类似于 OTP,我们向用户的移动应用程序发送代码,用户必须在身份验证端点登录页面中输入代码。如果匹配,则用户是使用手机号码作为主题标识符进行身份验证),因此用户不会存储在任何用户存储中。但是,我希望经过身份验证的用户具有角色“客户”,因为我在 APIM 中指定了允许仅具有角色“客户”的用户的范围。在我的情况下可能吗?谢谢【参考方案2】:

我找到了解决问题的方法。除了我在自定义联合身份验证器中的代码将角色分配给http://wso2.org/claims/role 声明之外,我还需要启用Just-In-Time provisioning,然后将在 WSO2 中创建具有指定角色的由我的自定义联合身份验证器进行身份验证的用户。

PS。我仍然无法让具有特定角色的自定义身份验证器对用户进行身份验证,而无需通过即时配置首先在 WSO2 中创建用户。

【讨论】:

以上是关于WSO2IS/APIM:如何在自定义身份验证器中分配用户角色的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 Spring security 3.0 身份验证中正确处理异常?

为啥在自定义身份验证和登录模块中使用克隆?

在自定义函数中使用 AWS cognito 多因素身份验证

在自定义登录页面上引发错误时下一个身份验证“凭据”重定向

在自定义管理页面中显示正确的 django 身份验证框架信息

如何在 python 社交身份验证中分配 Instagram 重定向 uri? [复制]