我想在GlassFish 3中使用符合JSR 196的自定义身份验证模块。接口javax.security.auth.message.ServerAuth具有以下方法:
AuthStatus validateRequest(
MessageInfo messageInfo,
javax.security.auth.Subject clientSubject,
javax.security.auth.Subject serviceSubject
)
AuthStatus可以是FAILURE或SUCCESS等几个常量之一。
问题是:如何从JSR 196的“角色数据库”中获取角色?
示例:服务器接收带有SSO令牌的请求(例如CAS令牌),检查令牌是否有效,使用JDBC从数据库获取角色或通过http从REST服务填充远程用户对象。
角色是否在JSR 196范围内获取?怎么可以实现呢?
我是否必须将JSR 196与JSR 115一起使用才能使用自定义身份验证和自定义角色来源?
答案 0 :(得分:1)
这是我的JSR-196OpenID实现的代码示例。 该方法为当前CallerPrincipal设置存储在字符串数组中的角色:
private boolean setCallerPrincipal(String caller, Subject clientSubject) {
boolean rvalue = true;
boolean assignGroups = true;
// create CallerPrincipalCallback
CallerPrincipalCallback cPCB = new CallerPrincipalCallback(
clientSubject, caller);
if (cPCB.getName() == null && cPCB.getPrincipal() == null) {
assignGroups = false;
}
try {
handler.handle((assignGroups ? new Callback[] {
cPCB,
new GroupPrincipalCallback(cPCB.getSubject(),
assignedGroups) } : new Callback[] { cPCB }));
logInfo(DEBUG_JMAC, "jmac.caller_principal:" + cPCB.getName() + " "
+ cPCB.getPrincipal());
} catch (Exception e) {
// should not happen
logger.log(Level.WARNING, "jmac.failed_to_set_caller", e);
rvalue = false;
}
return rvalue;
}
我在validateRequest()方法中调用此方法。 你可以在这里看到完整的代码: http://code.google.com/p/openid4java-jsr196/source/browse/trunk/src/main/java/org/imixs/openid/openid4java/OpenID4JavaAuthModule.java
此页面也会有所帮助: http://code.google.com/p/openid4java-jsr196/
答案 1 :(得分:0)
以下是我如何将用户映射到角色:
我的web.xml中有3个角色,而且我在sun-web.xml中有3个角色到组的映射,这些映射将这些角色映射到几个组。然后我有一个表用户的数据库,其中有一个名为“group”的列。该组对应于映射到角色的组。我还使用基于JSR 196的自定义auth模块和OpenID。因此,基本上每当用户登录时,都会从数据库中读取他们的组,然后我的应用程序会为其分配相应的角色。这都是使用J2EE的标准声明性安全模型完成的。
对于我的自定义身份验证模块,我使用名为AuthenticRoast的库,这使得事情变得更加简单。
希望这有帮助。