Ich bin seit einiger Zeit dabei, einen JAAS Login mit EJB3 auf jboss 6 hinzubekommen. Ich glaube am Server habe ich jetzt alles soweit richtig, glaube am Login vom Client hapert es noch. Gibt leider so wenig im Netz darüber zu lesen... Auch mein extra angeschafftes EJB3.0 Buch macht diesbezüglich nur ganz wage Aussagen..
Also was ich habe:
Habe die Datei jboss/server/default/conf/login-config.xml so angepasst:
[XML]
<policy>
<!-- ...... -->
<application-policy name="DPMAM">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag="required">
<module-option name="unauthenticatedIdentity">guest</module-option>
<module-option name="dsJndiName">java:/dpmam_ds</module-option>
<module-option name="principalsQuery">SELECT USER_PasswordMD5 FROM USERs
WHERE
USER_Name=?</module-option>
<module-option name="rolesQuery">SELECT USGR_Name, 'Group' FROM USerGRoups
INNER JOIN USER_USGR_Zugehoerigkeit ON
USerGRoups.USGR_ID=USER_USGR_Zugehoerigkeit.USGR_ID
INNER JOIN USERs ON USER_USGR_Zugehoerigkeit.USER_ID=USERs.USER_ID
WHERE USERs.USER_Name=?</module-option>
</login-module>
</authentication>
</application-policy>
</policy>
[/XML]
Stimmen die Spalten beim Roles-Query? (Der Join funktioniert so)
Dann habe ich in der Bean folgendes:
In meinem Client:
Der Aufruf von ping() funktioniert, bei restrictedPing() gibts ne EJBAccessException (Caller unauthorized).
Was könnte denn noch fehlen?
Also was ich habe:
Habe die Datei jboss/server/default/conf/login-config.xml so angepasst:
[XML]
<policy>
<!-- ...... -->
<application-policy name="DPMAM">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag="required">
<module-option name="unauthenticatedIdentity">guest</module-option>
<module-option name="dsJndiName">java:/dpmam_ds</module-option>
<module-option name="principalsQuery">SELECT USER_PasswordMD5 FROM USERs
WHERE
USER_Name=?</module-option>
<module-option name="rolesQuery">SELECT USGR_Name, 'Group' FROM USerGRoups
INNER JOIN USER_USGR_Zugehoerigkeit ON
USerGRoups.USGR_ID=USER_USGR_Zugehoerigkeit.USGR_ID
INNER JOIN USERs ON USER_USGR_Zugehoerigkeit.USER_ID=USERs.USER_ID
WHERE USERs.USER_Name=?</module-option>
</login-module>
</authentication>
</application-policy>
</policy>
[/XML]
Stimmen die Spalten beim Roles-Query? (Der Join funktioniert so)
Dann habe ich in der Bean folgendes:
Java:
@Stateless(name = "BalancerBean")
@SecurityDomain("DPMAM")
public class BalancerBean implements BalancerBeanRemote {
private static Logger log = LoggerFactory.getLogger( BalancerBean.class );
//......
@Override
public String ping() {
return "pong";
}
@Override
@RolesAllowed( { "Administrator" })
public String restrictedPing() {
return "restrictedPong";
}
}
In meinem Client:
Java:
//...
public static void main(String[] args) {
Properties locatorProperties = new Properties();
locatorProperties.setProperty( Context.SECURITY_PRINCIPAL, "admin"); //<-- Diese beiden Zeilen habe ich aus meinem schlauen Buch
locatorProperties.setProperty( Context.SECURITY_CREDENTIALS, "21232f297a57a5a743894a0e4a801fc3");
locatorProperties.put( "java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory" );
locatorProperties.put( "java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces" );
locatorProperties.put( "java.naming.provider.url", "localhost:1099" );
Context initialContext = new InitialContext( locatorProperties);
BalancerBeanRemote bean = (BalancerBeanRemote)initialContext.lookup( BalancerBeanRemote.JNDI_NAME );
System.out.println(bean.ping());
System.out.println(bean.restrictedPing());
}
Der Aufruf von ping() funktioniert, bei restrictedPing() gibts ne EJBAccessException (Caller unauthorized).
Was könnte denn noch fehlen?