Вызов защищенного удаленного ejb, развернутого в glassfish из клиентского приложения Java
Я пытаюсь вызвать защищенный удаленный ejb, который развернут в glassfish из простого клиентского приложения, но я не могу аутентифицировать себя.
Клиент:
public void go() {
try {
Context ctx = getInitialContext();
TestBeanRemote remote = (TestBeanRemote) ctx.lookup("java:global/ejbTest2/TestBean");
String result = remote.testMe();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
private Context getInitialContext() throws NamingException, FileNotFoundException, IOException {
Properties p = new Properties();
InputStream stream = Runner.class.getResourceAsStream("jndi.properties");
assert stream != null : "jndi.properties file not found";
p.load(stream);
return new InitialContext(p);
}
jndi.properties на клиенте
java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional. Defaults to localhost. Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional. Defaults to 3700. Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700
java.naming.security.principal = test
java.naming.security.credentials = test
EJB
@Stateless(description = "A simple bean to learn the ins and outs of ejbs")
@DeclareRoles({ Roles.ADMIN, Roles.USER })
@RolesAllowed({})
public class TestBean implements TestBeanRemote {
@Resource
private SessionContext ejbContext;
@Override
@RolesAllowed(Roles.ADMIN)
// @PermitAll
public String testMe() throws Exception {
return ejbContext.getCallerPrincipal().getName();
}
}
ВС-банка-EJB
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
<security-role-mapping>
<role-name>Admin</role-name>
<group-name>Admin</group-name> <!-- As defined in container -->
</security-role-mapping>
<security-role-mapping>
<role-name>User</role-name>
<group-name>User</group-name> <!-- As defined in container -->
</security-role-mapping>
<enterprise-beans />
</sun-ejb-jar>
И я добавил идентификатор пользователя "test" credentials "test" Список групп "Admin" в консоли администрирования в разделе Конфигурации> default-config > Безопасность> Realms > файл> Управление пользователями
Это приводит к стековой трассировке, содержащей org.omg.CORBA.NO_PERMISSION и ejbContext.getCallerPrincipal(). GetName() приводит к "Anonymous", когда я использую PermitAll
Что мне здесь не хватает?
1 ответ
Эта ветка старая, но ответ может кому-то помочь. Принципал и учетные данные в контексте игнорируются. Перед поиском ejb вам нужно использовать ProgrammaticLogin для доступа к EJB.
System.setProperty("java.security.auth.login.config", "auth.conf");
ProgrammaticLogin pl = new ProgrammaticLogin();
pl.login("user", "password");
//Now lookup the EJB and then logout
pl.logout();
Как вы видите, вам нужно установить "java.security.auth.login.config", который указывает на файл, содержимое которого должно быть
default {
com.sun.enterprise.security.auth.login.ClientPasswordLoginModule required debug=false; };
Это говорит о том, что вы хотите использовать область по умолчанию, настроенную на сервере, или вы также можете явно указать область, заменив "default" именем области, например "file"