Я использую EJB (на JBoss) и Wicket в качестве слоя пользовательского интерфейса.Я добавил безопасность в свой EJB, мой security.conf выглядит следующим образом:
<application-policy name="my-security-domain">
<authentication>
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
<module-option name="usersProperties">META-INF/users.properties</module-option>
<module-option name="rolesProperties">META-INF/roles.properties</module-option>
</login-module>
</authentication>
</application-policy>
На уровне пользовательского интерфейса я использую PicketBox для аутентификации в соответствии с инструкциями на странице аутентификации PicketBox: http://community.jboss.org/wiki/PicketBoxAuthentication#PicketBox_Authentication_in_a_JBoss_Application_Server_5_environment
Подкласс My Wicket AuthenticatedWebSession выглядит следующим образом:
private Subject subject;
private SecurityContext securityContext;
@Override
public boolean authenticate(String username,
String password)
{
boolean authenticated = false;
securityContext = null;
SecurityFactory.prepare();
try
{
String securityDomainName = "my-security-domain";
String configFile = "META-INF/security.conf";
PicketBoxConfiguration idtrustConfig = new PicketBoxConfiguration();
idtrustConfig.load(configFile);
//Note: This is the most important line where you establish a security context
securityContext = SecurityFactory.establishSecurityContext(securityDomainName);
AuthenticationManager am = securityContext.getAuthenticationManager();
subject = new Subject();
Principal principal = new SimplePrincipal(username);
Object credential = new String(password);
authenticated = am.isValid(principal, credential, subject);
securityContext.getUtil().createSubjectInfo(principal, credential, subject);
//You may make call outs to other components here*/
//DEBUG
for(Principal p : subject.getPrincipals())
{
LOGGER.debug("Principal: " + p.getName());
if(p instanceof Group)
{
Group g = (Group) p;
Enumeration<? extends Principal> members = g.members();
while(members.hasMoreElements())
{
Principal member = members.nextElement();
LOGGER.debug("Group name: " + member.getName());
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return authenticated;
}
Пока все хорошо, я могу аутентифицироваться на сервере из пользовательского интерфейса.Однако любые последующие вызовы к защищенным EJB-компонентам из другого места, где на уровне пользовательского интерфейса произойдет сбой с «Неверный пользователь», хотя я уже аутентифицировался.
Я проверил аутентификацию в автономном клиенте, и она работает нормально,может впоследствии вызвать защищенный EJB.
Я также попробовал аутентификацию, описанную в этом посте, и пользовательский интерфейс по-прежнему не может вызывать защищенные EJB: http://iocanel.blogspot.com/2010/09/karafs-jaas-modules-in-action.html
Любая помощь будет принята с благодарностью.
С уважением,
Linh