EJB 3.1中的简单身份验证

时间:2012-10-18 18:55:13

标签: java-ee authentication glassfish ejb ejb-3.1

我有一个EJB 3.1应用程序和与此应用程序连接的Java客户端。 我需要创建用户身份验证。

示例:

class LoginBean{

public remoteLogin(String login, String password){
  // create user context with user ID
}
}

class BeanAbc{
  public remoteSecureMethod(){
      // get user context - if no context throw error
      // get user ID/login from user context and do some additional logic..
  }
}

用户凭据存储在DB中。我正在使用Glassfish服务器。如何存储用户上下文?什么是最好的解决方案?有没有简单的框架?

3 个答案:

答案 0 :(得分:1)

您一定要看一下 Spring Security ,这是Java EE应用程序的事实标准安全框架。即使您在开始时只使用框架的一小部分,它也会让您走上正确的轨道并允许您根据需要进行演变(如果您想要切换身份验证方法,管理授权等)。

答案 1 :(得分:1)

基本上(据我所知),EJB 3.1中的客户端应用程序安全性仍然像2.x中的那样,因此您应该找到示例。

您需要设置的内容:

  • 服务器端的jaas登录模块(正如您在Web应用程序中看到的那样)
  • 确定如何处理身份验证的客户端属性文件
  • 客户端回调,为客户端身份验证过程提供凭据
  • 使用类路径上的属性文件启动客户端

这是jboss-as的一个示例,但我认为您可以将其转换为其他服务器,因为这个想法是通用的:

# file auth.conf on the client 
adb {
   // jBoss LoginModule
   org.jboss.security.ClientLoginModule  required
   ;
};

这基本上说对于登录上下文adb,客户端登录模块需要成功。此上下文adb链接到服务器端的相应应用程序jaas上下文。

在代码中设置登录名如下:

CallbackHandler cbh =
    new LoginCallbackHandler(user,pass.toCharArray());
try {
    LoginContext lc = new LoginContext("adb",cbh); 
    lc.login();  // <--- triggers the show in the client
}
catch (LoginException e) {
    System.err.println("Login failed: "+e.getMessage());
}

在LoginContext中,您可以从上面的auth.conf文件中提供上下文adb

LoginCallbackHandler可能如下所示:

package de.bsd.adb.client;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;

public class LoginCallbackHandler implements CallbackHandler {
  private String user;
  private char[] pass;
  // Konstruktor
  LoginCallbackHandler(String username,char[] password) {
    user=username;
    pass=password;
  }
// handle() does the real work and is invoked from the client container
  public void handle(Callback[] callbacks)
    throws IOException, UnsupportedCallbackException
  {
    // Iterate over the call backs
    for (int i =0 ; i< callbacks.length; i++)
    {
      // NameCallback -> pass Login-Name 
      if (callbacks[i] instanceof NameCallback)
      {
        System.out.println("NameCallback");
        NameCallback nc = (NameCallback)callbacks[i];
        nc.setName(user);
      }
      // PasswordCallback -> pass Password
      else if (callbacks[i] instanceof PasswordCallback)
      {
        System.out.println("PasswordCallback");
        PasswordCallback pc =
            (PasswordCallback)callbacks[i];
       pc.setPassword(pass);
      }
      else {  // unknown callback            
         throw new UnsupportedCallbackException(callbacks[i],"Ouch");
     }}}

现在您可以使用

启动您的客户端程序
java -Djava.security.auth.login.config=/path/to/auth.conf -cp bla my.Main

答案 2 :(得分:0)

我想补充一下@Heiko Rupp提供的答案 - 他提供的代码可以作为独立应用程序使用。 如果您正在使用应用程序服务器,则应检查如何使用应用程序服务器配置配置JAAS模块。
例如,在oVirt开源项目中,我们使用的是Kerberos登录模块。
我们目前正在使用JBoss AS 7 我们通过在security-domains部分 -

下定义安全域来配置standalone.xml配置文件
 <security-domain name="EngineKerberosAuth">
                    <authentication>
                        <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required"/>
                    </authentication>
                </security-domain>