konto usunięte
Temat: EJB3, login-config.xml i @SecurityDomain
Ostatnio bawię trochę EJB3 w JBoss-ie 5 i trafiłem na problem jeśli chodzi o "respektowanie" przez adnotację @SecurityDomain pliku login-config.xml.EJB:
@Stateless
@SecurityDomain("fall")
@RolesAllowed("authenticated")
public class User implements UserRemote
{
@Resource
protected SessionContext context;
@PersistenceContext(unitName = "fall")
protected EntityManager manager;
protected Userss user = null;
@PermitAll
public void init()
{
String email = this.context.getCallerPrincipal().getName();
if (email == null)
return;
try
{
this.user = (Userss)this.manager.createNamedQuery("findByEmail").setParameter("IN_EMAIL", email).getSingleResult();
}
catch (NoResultException e) { this.user = null; }
}
public Integer getId() { return (this.user == null)?null:this.user.getId(); }
}
W pliku server/default/conf/login-config.xml na końcu dodałem:
< application-policy name="fall">
< authentication>
< login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
< module-option name="unauthenticatedIdentity">anonymous< /module-option>
< module-option name="dsJndiName">java:/FallDS< /module-option>
< module-option name="principalsQuery">SELECT password FROM users WHERE email = ?< /module-option>
< module-option name="rolesQuery">SELECT 'authenticated' FROM users WHERE email = ?< /module-option>
< module-option name="debug">true< /module-option>
< /login-module>
< /authentication>
< /application-policy>
Klient (serwlet) - podany login i hasło nie istnieją:
public class Main extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
PrintWriter writer = response.getWriter();
Properties props1 = new Properties();
props1.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
try
{
props1.put(Context.SECURITY_PRINCIPAL, "nnnnnnnnnn");
props1.put(Context.SECURITY_CREDENTIALS, "nnnnnnnnnn"); InitialContext context1 = new InitialContext(props1);
UserRemote user = (UserRemote)context1.lookup("User/remote");
user.init();
writer.println(user.getId());
}
catch (Exception e)
{
e.printStackTrace(writer);
}
}
}
No i powinno być tak, że po uruchomieniu serwletu na ekran idzie EJBAccessException - błędna autoryzacja, próba wywołania metody "getId()" bez odpowiednich uprawnień, a tak się nie dzieje. Mało tego - jak zmieniam SecurityDomain na dowolną inna, to efekt jest taki sam - na ekran idzie "null" (czyli pomijając adnotacje ograniczające dostęp OK). Stąd mój pomysł, że bean EJB "nie łapie" realm-a zapisanego w pliku login-config.xml. Jak zrobić, żeby łapał?Jakub B. edytował(a) ten post dnia 14.01.09 o godzinie 20:42