我有一个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服务器。如何存储用户上下文?什么是最好的解决方案?有没有简单的框架?
答案 0 :(得分:1)
您一定要看一下 Spring Security ,这是Java EE应用程序的事实标准安全框架。即使您在开始时只使用框架的一小部分,它也会让您走上正确的轨道并允许您根据需要进行演变(如果您想要切换身份验证方法,管理授权等)。
答案 1 :(得分:1)
基本上(据我所知),EJB 3.1中的客户端应用程序安全性仍然像2.x中的那样,因此您应该找到示例。
您需要设置的内容:
这是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部分 -
<security-domain name="EngineKerberosAuth">
<authentication>
<login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required"/>
</authentication>
</security-domain>