5

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

如果我理解一切正确,那么容器会为每个传入请求调用 validateRequest 方法,并且我的 SAM 将检查凭据,并通过回调处理程序。

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
}
4

1 回答 1

5

你在做什么看起来确实正确。

JASPIC 中没有像您想要的那样向容器传递方法的概念。容器从您给它的组数组中创建一组 Principals,并且那里没有用于方法的空间。

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

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

于 2014-12-15T13:53:38.863 回答