2011-06-21 29 views
2

我想用玻璃鱼的自定义领域3.1如何在GlassFish 3.1中使用自定义领域?

我从这个主题的两个文件尝试。 Custom Glassfish Security Realm does not work (unable to find LoginModule)

的CustomRealm.java

package com.company.security.realm; 
import com.sun.appserv.security.AppservRealm; 
import com.sun.enterprise.security.auth.realm.BadRealmException; 
import com.sun.enterprise.security.auth.realm.InvalidOperationException; 
import com.sun.enterprise.security.auth.realm.NoSuchRealmException; 
import com.sun.enterprise.security.auth.realm.NoSuchUserException; 
import java.util.Enumeration; 
import java.util.Properties; 
import java.util.Vector; 

public class CustomRealm extends AppservRealm 
{ 
Vector<String> groups = new Vector<String>(); 

private String jaasCtxName; 

private String startWith; 

@Override 
public void init(Properties properties) 
throws BadRealmException, NoSuchRealmException { 
    jaasCtxName = properties.getProperty("jaas-context", "customRealm"); 
    startWith = properties.getProperty("startWith", "z"); 
    groups.add("dummy"); 
} 

@Override 
public String getAuthType() 
{ 
    return "Custom Realm"; 
} 

public String[] authenticate(String username, char[] password) 
{ 
    // if (isValidLogin(username, password)) 
    return (String[]) groups.toArray(); 
} 

@Override 
public Enumeration getGroupNames(String username) 
throws InvalidOperationException, NoSuchUserException 
{ 
    return groups.elements(); 
} 

@Override 
public String getJAASContext() 
{ 
    return jaasCtxName; 
} 

public String getStartWith() 
{ 
    return startWith; 
} 
} 

而且自定义登录模块

package com.company.security.realm; 

import com.sun.appserv.security.AppservPasswordLoginModule; 
import com.sun.enterprise.security.auth.login.common.LoginException; 
import java.util.Set; 
import org.glassfish.security.common.PrincipalImpl; 

public class CustomLoginModule extends AppservPasswordLoginModule 
{  
    @Override 
protected void authenticateUser() throws LoginException 
{ 
    _logger.info("CustomRealm : authenticateUser for " + _username); 
    final CustomRealm realm = (CustomRealm)_currentRealm; 

    if ((_username == null) || (_username.length() == 0) || !_username.startsWith(realm.getStartWith())) 
     throw new LoginException("Invalid credentials"); 

    String[] grpList = realm.authenticate(_username, getPasswordChar()); 
    if (grpList == null) { 
     throw new LoginException("User not in groups"); 
    } 

    _logger.info("CustomRealm : authenticateUser for " + _username); 

    Set principals = _subject.getPrincipals(); 
    principals.add(new PrincipalImpl(_username)); 

    this.commitUserAuthentication(grpList); 

} 
} 

我加为好模块conf文件

customRealm { 
com.company.security.realm.CustomLoginModule required; 
}; 

我复制我的2 .class in glassfish3/glassfish/domains/domain1/lib/classes/ 以及glassfish3/glassfish/lib

每当我想创建一个新领域时,我都遇到了同样的错误。

./asadmin --port 4949 create-auth-realm --classname com.company.security.realm.CustomRealm --property jaas-context=customRealm:startWith=a customRealm  

remote failure: Creation of Authrealm customRealm failed. com.sun.enterprise.security.auth.realm.BadRealmException: java.lang.ClassNotFoundException: com.company.security.realm.CustomRealm not found by org.glassfish.security [101] 

com.sun.enterprise.security.auth.realm.BadRealmException: java.lang.ClassNotFoundException: com.company.security.realm.CustomRealm not found by org.glassfish.security [101] 
Command create-auth-realm failed. 

我想我真的不明白如何以正确的方式添加我的两个文件到glassfish。

这两个文件是从eclipse创建和编译的。我创建了一个java项目suctom登录。

有人可以提供帮助吗?

THX在前进, LOIC

回答

0

你打包为一个OSGi模块(请在你所引用的职位的答案)?如果是这样,不要复制jar文件到$ GF_HOME/lib或什么,而不是将其部署为一个OSGi模块:

asadmin deploy --type osgi /path/to/CustomRealm.jar

然后加入login.conf的设置。为了安全起见,我重新启动GF(asadmin restart-domain),然后您可以使用您在那里的命令创建领域。

+1

嗨,我试过了,唯一的问题是,当我将它部署为OSGI包时,我的Jar从未找到...是否有适当的方式而不是使用完整的类路径。 –