Implementing single sign-on authentication with GlassFish using Java Authentication Service Provider Interface for Containers (JASPIC)

glassfish-logo

In this blog post, we will explore how to implement single sign-on (SSO) authentication with GlassFish using Java Authentication Service Provider Interface for Containers (JASPIC). SSO allows a user to authenticate once and then access multiple applications without having to provide login credentials again. This improves user experience and simplifies user management for application owners.

What is JASPIC?

Java Authentication Service Provider Interface for Containers (JASPIC) is a standard Java API that defines the contract between an application server and an authentication module. It allows applications to delegate the authentication process to an external module, providing flexibility and reusability.

Setting up GlassFish

Before we can implement SSO authentication with JASPIC, we need to set up GlassFish. Follow these steps:

  1. Download the latest version of GlassFish from the official website (https://glassfish.org/).
  2. Install GlassFish on your server following the installation instructions provided.
  3. Start GlassFish by running the appropriate command for your operating system.

Implementing the JASPIC Authentication Module

  1. Create a new Java class that implements the ServerAuthModule interface, which is part of the JASPIC API.
import javax.security.auth.message.AuthException;
import javax.security.auth.message.AuthStatus;
import javax.security.auth.message.MessageInfo;
import javax.security.auth.message.ServerAuth;
import javax.security.auth.message.ServerAuthContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyAuthModule implements ServerAuthModule {

    @Override
    public Class<?>[] getSupportedMessageTypes() {
        return new Class[]{HttpServletRequest.class, HttpServletResponse.class};
    }

    @Override
    public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy,
                           CallbackHandler handler, Map options) throws AuthException {
        // Initialization code
    }

    @Override
    public ServerAuthContext getAuthContext(String authContextID,
                                            Subject sharedState, Map properties) throws AuthException {
        return new ServerAuthContext() {
            @Override
            public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject,
                                              Subject serviceSubject) throws AuthException {
                // Request validation code
            }

            @Override
            public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject)
                    throws AuthException {
                // Response security code
            }

            @Override
            public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {
                // Cleanup code
            }
        };
    }
}
  1. Customize the initialize, validateRequest, secureResponse, and cleanSubject methods according to your authentication requirements.

Configuring GlassFish to Use the JASPIC Authentication Module

To configure GlassFish to use the JASPIC authentication module:

  1. Open the glassfish-web.xml file for your application.

  2. Add the following security-role and security-constraint configurations:

<security-role>
    <description>Authenticated Users</description>
    <role-name>Authenticated</role-name>
</security-role>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>All Resources</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>Authenticated</role-name>
    </auth-constraint>
</security-constraint>
  1. Add the following message-security-provider configuration to specify the JASPIC authentication module:
<message-security-provider>
    <provider-name>com.example.MyAuthModule</provider-name>
    <mechanism-config>
        <mechanism-name>CLIENT_AUTH</mechanism-name>
    </mechanism-config>
</message-security-provider>
  1. Build and deploy your application to GlassFish.

Conclusion

By implementing single sign-on authentication with GlassFish using JASPIC, you can enhance user experience and simplify user management across multiple applications. The flexibility provided by JASPIC empowers developers to customize the authentication process based on specific requirements. Give it a try in your GlassFish applications and enjoy the benefits of SSO!

#GlassFish #JASPIC