Как получить роли с аутентификацией JSR 196 в GlassFish?
Я хочу использовать пользовательский модуль аутентификации, соответствующий JSR 196 в GlassFish 3. Интерфейс 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 или из службы REST через http.
Является ли роль выборкой в рамках JSR 196? Как это можно реализовать?
Нужно ли использовать JSR 196 вместе с JSR 115 для использования настраиваемой проверки подлинности и источника настраиваемой роли?
2 ответа
Это пример кода из моей реализации JSR-196OpenID. Метод устанавливает роли, хранящиеся в массиве String для текущего 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/
Вот как я сопоставляю пользователей с ролями:
У меня есть 3 роли в моем web.xml, а также в моем sun-web.xml 3 сопоставления ролей и групп, которые отображают эти роли в несколько групп. Затем у меня есть база данных с таблицей Users, в которой есть столбец под названием "группа". Эта группа соответствует группе, которая сопоставлена с ролью. Я также использую пользовательский модуль аутентификации на основе JSR 196 с OpenID. Таким образом, в основном, когда пользователь входит в свою группу, его читают из БД, а затем мое приложение назначает ему соответствующую роль. Все это делается с использованием стандартной декларативной модели безопасности J2EE.
Для моего пользовательского модуля авторизации я использую библиотеку AuthenticRoast, которая делает все немного проще.
Надеюсь это поможет.