是否可以按需确定用户的组成员身份,而不是在ServerAuthModule(JASPIC)中登录时

时间:2014-12-07 10:21:31

标签: java java-ee jaspic

我正在尝试编写自己的ServerAuthModule,以使用自定义登录系统。

如果我理解了一切正确,那么容器会为每个传入的请求调用validateRequest方法,并且我的SAM将检查凭据,并告诉容器用户名和用户组(如果凭据是正确的)通过CallbackHandler。

public class MySAM implements ServerAuthModule {

    @Override
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {

        // check user credentials
        ...

        // set username and groups
        CallerPrincipalCallback cpCallback = new CallerPrincipalCallback(clientSubject, username);
        GroupPrincipalCallback gpCallback = new GroupPrincipalCallback(clientSubject, groups);
        callbackHandler.handle(new Callback[]{cpCallback, gpCallback}

        return AuthStatus.SUCCESS;
    }

    ...
}

我现在的问题是,当用户登录时,我不知道用户属于哪些组。我只能检查用户是否在给定的组中。是否有可能为容器提供一种方法,使用该方法可以检查用户是否在给定组中,而不是在validateRequest方法中为其提供包含组的数组?

boolean isInGroup(String username, String group) {
    // ask backend system
}

1 个答案:

答案 0 :(得分:5)

你正在做的事情看起来确实正确。

在JASPIC中,没有任何关于将容器交给你想要的方法的概念。容器从你给它的groups数组中创建一组Principal,并且那里没有方法。

在Java EE中,JACC应该能够做到这一点。每当需要回答isUserInRole问题并且每次需要确定用户是否具有某些权限(例如,允许访问/ adminpanel)时,都会咨询JACC策略提供者。

此时,您可以进行一种反向检查,以查看给定权限所需的角色(使用JACC在启动时建立的权限映射的角色)。使用该角色,您可以使用自己的逻辑来确定用户是否确实拥有该角色或组。