如何在自定义安全领域(Glassfish)中使用自定义主体?

时间:2013-04-02 16:14:29

标签: java security java-ee glassfish

我按照instructions为我的glassfish创建了一个自定义安全领域。一切正常,用户正确认证。但问题如下:

  • 用户凭据以字符串
  • 加密
  • 领域解密此字符串并对数据库执行身份验证(正常工作)
  • 而不是使用解密的值作为securityContext中的主体加密 传递字符串。

我已经尝试覆盖commit()方法来替换_userPrincipal或使用getSubject().getPrincipals().add(new PrincipalImpl("user"))附加我自己的实现。两者都没有按预期工作。基本上这个问题很简单:如何在glassfish中的自定义安全领域中设置我自己的主体,这样可以将它与注入的securityContext一起使用?

我的环境:

  • Glassfish 3.1.2.2(Build 5)完整档案
  • 在身份验证后运行的应用程序是基于JAX-RS 1.1的应用程序
  • 使用注入
  • 获取SecurityContext

1 个答案:

答案 0 :(得分:2)

  

我已经尝试覆盖commit()方法来替换   _userPrincipal或使用getSubject()附加我自己的实现.getPrincipals()。add(new PrincipalImpl(“user”))。也不   按预期工作。

你得到了什么样的错误?

无论如何,我认为您的问题在于此过程的第三步。 SecurityContext仅将BASIC_AUTH,FORM_AUTH,CLIENT_CERT_AUTH,DIGEST_AUTH定义为AuthenticationScheme,因此SecurityContext可能无法看到您的安全方案或类型的实现。但是你可以尝试这些步骤,我希望它们能为你效劳。

A-实施Java身份验证和授权服务(JAAS)LoginModule或扩展com.sun.appserv.security.AppservPasswordLoginModule

public class MyLoginModule extends AppservPasswordLoginModule {

@Override
protected void authenticateUser() throws LoginException {
    if (!authenticate(_username, _password)) {
//Login fails
        throw new LoginException("LoginFailed");
    }
    String[] myGroups = getGroupNames(_username);
    commitUserAuthentication(myGroups);
}

private boolean authenticate(String username, String password) {
    /*
     Check the credentials against the authentication source, return true if          authenticated, return false otherwise
     */
    return true;
}

private String[] getGroupNames(String username) {
// Return the list of groups this user belongs to.
}

B-实施你的领域课程。

public class MyRealm extends AppservRealm {

@Override
public void init(Properties props)
throws BadRealmException, NoSuchRealmException {
//here you initialize the realm
}
@Override
public String getAuthType() {
return "Custom Realm";
}
}

C-将领域和LoginModule安装并配置到服务器中。

为此,您需要查看JSR 196并通过实现javax.security.auth.message.module.ServerAuthModule来编写自己的SAM。看看下面的链接。 https://blogs.oracle.com/enterprisetechtips/entry/adding_authentication_mechanisms_to_the