我正在尝试编写自己的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
}
你正在做的事情看起来确实正确。
JASPIC中没有像您打算的那样将容器交给方法的概念。容器从您提供给它的组数组中创建一组主体,并且那里没有方法的空间。
在Java EE中,JACC应该能够做到这一点。每当需要回答 isUserInRole 问题以及每次需要确定用户是否具有某些权限(例如允许访问/adminpanel)时,都会咨询 JACC 策略提供程序。
此时,您可以执行一种反向检查,以查看给定权限所需的角色(使用该角色来映射 JACC 在启动时构建的权限映射)。使用该角色,您可以使用自己的逻辑来确定用户是否确实具有该角色或组。