| type=page | |
| status=published | |
| title=Securing Applications | |
| next=webservices.html | |
| prev=part-apps-and-app-comps.html | |
| ~~~~~~ | |
| Securing Applications | |
| ===================== | |
| [[GSDVG00006]][[beabg]] | |
| [[securing-applications]] | |
| 4 Securing Applications | |
| ----------------------- | |
| This chapter describes how to write secure Java EE applications, which | |
| contain components that perform user authentication and access | |
| authorization for the business logic of Java EE components. | |
| For information about administrative security for the Oracle GlassFish | |
| Server, see the link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition | |
| Security Guide]. | |
| For general information about Java EE security, see | |
| https://javaee.github.io/tutorial/partsecurity.html[Security] in The | |
| Java EE 8 Tutorial. | |
| The following topics are addressed here: | |
| * link:#beabh[Security Goals] | |
| * link:#beabi[GlassFish Server Specific Security Features] | |
| * link:#beabj[Container Security] | |
| * link:#beacr[Roles, Principals, and Principal to Role Mapping] | |
| * link:#beabo[Realm Configuration] | |
| * link:#BACDEIHB[Java EE Security API Support] | |
| * link:#beabt[JACC Support] | |
| * link:#beabu[Pluggable Audit Module Support] | |
| * link:#beabx[The `server.policy` File] | |
| * link:#beaca[Configuring Message Security for Web Services] | |
| * link:#beacm[Programmatic Login Using the ProgrammaticLogin Class] | |
| * link:#beacq[User Authentication for Single Sign-on] | |
| * link:#gizel[Adding Authentication Mechanisms to the Servlet Container] | |
| [NOTE] | |
| ======================================================================= | |
| The Web Profile of the GlassFish Server supports the EJB 3.1 Lite | |
| specification, which allows enterprise beans within web applications, | |
| among other features. The full GlassFish Server supports the entire EJB | |
| 3.1 specification. For details, see | |
| http://jcp.org/en/jsr/detail?id=318[JSR 318] | |
| (`http://jcp.org/en/jsr/detail?id=318`). | |
| ======================================================================= | |
| [[beabh]][[GSDVG00114]][[security-goals]] | |
| Security Goals | |
| ~~~~~~~~~~~~~~ | |
| In an enterprise computing environment, there are many security risks. | |
| The goal of the GlassFish Server is to provide highly secure, | |
| interoperable, and distributed component computing based on the Java EE | |
| security model. Security goals include: | |
| * Full compliance with the Java EE security model. This includes EJB and | |
| servlet role-based authorization. | |
| * Support for single sign-on across all GlassFish Server applications | |
| within a single security domain. | |
| * Support for web services message security. | |
| * Security support for application clients. | |
| * Support for several underlying authentication realms, such as simple | |
| file and Lightweight Directory Access Protocol (LDAP). Certificate | |
| authentication is also supported for Secure Socket Layer (SSL) client | |
| authentication. For Solaris, OS platform authentication is supported in | |
| addition to these. | |
| * Support for declarative security through GlassFish Server specific | |
| XML-based role mapping. | |
| * Support for Java Authorization Contract for Containers (JACC) | |
| pluggable authorization as included in the Java EE specification and | |
| defined by http://www.jcp.org/en/jsr/detail?id=115[Java Specification | |
| Request (JSR) 115] (`http://www.jcp.org/en/jsr/detail?id=115`). | |
| * Support for Java Authentication Service Provider Interface for | |
| Containers as included in the Java EE specification and defined by | |
| http://www.jcp.org/en/jsr/detail?id=196[JSR 196] | |
| (`http://www.jcp.org/en/jsr/detail?id=196`). | |
| * Support for Web Services Interoperability Technologies (WSIT) as | |
| described in | |
| https://javaee.github.io/metro/doc/user-guide/index.html[Metro Users | |
| Guide] (`https://javaee.github.io/metro/doc/user-guide/index.html`). | |
| * Support for the Java EE Security API as included in the Java EE | |
| specification and defined by https://jcp.org/en/jsr/detail?id=375[JSR | |
| 375] (`https://jcp.org/en/jsr/detail?id=375`) | |
| [[beabi]][[GSDVG00115]][[glassfish-server-specific-security-features]] | |
| GlassFish Server Specific Security Features | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| The GlassFish Server supports the Java EE security model, as well as the | |
| following features which are specific to the GlassFish Server: | |
| * Message security; see link:#beaca[Configuring Message Security for Web | |
| Services] | |
| * Single sign-on across all GlassFish Server applications within a | |
| single security domain; see link:#beacq[User Authentication for Single | |
| Sign-on] | |
| * Programmatic login; see link:#beacm[Programmatic Login Using the | |
| ProgrammaticLogin Class] | |
| [[beabj]][[GSDVG00116]][[container-security]] | |
| Container Security | |
| ~~~~~~~~~~~~~~~~~~ | |
| The component containers are responsible for providing Java EE | |
| application security. The container provides two security forms: | |
| * link:#beabl[Declarative Security] | |
| * link:#beabk[Programmatic Security] | |
| Annotations (also called metadata) enable a declarative style of | |
| programming, and so encompass both the declarative and programmatic | |
| security concepts. Users can specify information about security within a | |
| class file using annotations. When the application is deployed, this | |
| information can either be used by or overridden by the application or | |
| module deployment descriptor. | |
| [[beabl]][[GSDVG00362]][[declarative-security]] | |
| Declarative Security | |
| ^^^^^^^^^^^^^^^^^^^^ | |
| Declarative security means that the security mechanism for an | |
| application is declared and handled externally to the application. | |
| Deployment descriptors describe the Java EE application's security | |
| structure, including security roles, access control, and authentication | |
| requirements. | |
| The GlassFish Server supports the deployment descriptors specified by | |
| Java EE and has additional security elements included in its own | |
| deployment descriptors. Declarative security is the application | |
| deployer's responsibility. For more information about GlassFish Server | |
| deployment descriptors, see the link:../application-deployment-guide/toc.html#GSDPG[GlassFish Server Open Source | |
| Edition Application Deployment Guide]. | |
| There are two levels of declarative security, as follows: | |
| * link:#beabm[Application Level Security] | |
| * link:#beabn[Component Level Security] | |
| [[beabm]][[GSDVG00239]][[application-level-security]] | |
| Application Level Security | |
| ++++++++++++++++++++++++++ | |
| For an application, roles used by any application must be defined in | |
| `@DeclareRoles` annotations in the code or `role-name` elements in the | |
| application deployment descriptor (`application.xml`). Those role names | |
| are scoped to the EJB XML deployment descriptors (`ejb-jar.xml` and | |
| `glassfish-ejb-jar.xml` files) and to the servlet XML deployment | |
| descriptors (`web.xml` and `glassfish-web.xml` files). For an | |
| individually deployed web or EJB module, you define roles using | |
| `@DeclareRoles` annotations or `role-name` elements in the Java EE | |
| deployment descriptor files `web.xml` or `ejb-jar.xml`. | |
| To map roles to principals and groups, define matching | |
| `security-role-mapping` elements in the `glassfish-application.xml`, | |
| `glassfish-ejb-jar.xml`, or `glassfish-web.xml` file for each | |
| `role-name` used by the application. By default, group principal names | |
| are mapped to roles of the same name. Accordingly, the Default Principal | |
| To Role Mapping setting is enabled by default on the Security page of | |
| the GlassFish Server Administration Console. This default role mapping | |
| definition is in effect if you do not define your own mapping in the | |
| deployment descriptor for your application as described in this section. | |
| For more information, see link:#beacr[Roles, Principals, and Principal | |
| to Role Mapping]. | |
| [[beabn]][[GSDVG00240]][[component-level-security]] | |
| Component Level Security | |
| ++++++++++++++++++++++++ | |
| Component level security encompasses web components and EJB components. | |
| A secure web container authenticates users and authorizes access to a | |
| servlet or JSP by using the security policy laid out in the servlet XML | |
| deployment descriptors (`web.xml` and `glassfish-web.xml` files). | |
| The EJB container is responsible for authorizing access to a bean method | |
| by using the security policy laid out in the EJB XML deployment | |
| descriptors (`ejb-jar.xml` and `glassfish-ejb-jar.xml` files). | |
| [[beabk]][[GSDVG00363]][[programmatic-security]] | |
| Programmatic Security | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| Programmatic security involves an EJB component or servlet using method | |
| calls to the security API, as specified by the Java EE security model, | |
| to make business logic decisions based on the caller or remote user's | |
| security role. Programmatic security should only be used when | |
| declarative security alone is insufficient to meet the application's | |
| security model. | |
| The API for programmatic security consists of methods of the Java EE | |
| Security API `SecurityContext` interface, and methods of the EJB | |
| `EJBContext` interface and the servlet `HttpServletRequest` interface. | |
| The GlassFish Server supports these interfaces as specified in the Java | |
| EE specification. | |
| There is also a proprietary Glassfish API for programmatic login. See | |
| link:#beacm[Programmatic Login Using the ProgrammaticLogin Class]. | |
| For more information about programmatic security, see | |
| https://javaee.github.io/tutorial/security-intro003.html#using-programmatic-security[Using | |
| Programmatic Security] in the The Java EE Tutorial. | |
| [[beacr]][[GSDVG00117]][[roles-principals-and-principal-to-role-mapping]] | |
| Roles, Principals, and Principal to Role Mapping | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| By default, any groups that an authenticated user belongs to will be | |
| mapped to roles with the same names. Therefore, the Default Principal To | |
| Role Mapping setting is enabled by default on the Security page of the | |
| GlassFish Administration Console. To change the default mapping you can | |
| clear this setting. For applications, you define roles in | |
| `@DeclareRoles` annotations or the Java EE deployment descriptor file | |
| `application.xml`. You define the corresponding role mappings in the | |
| GlassFish Server deployment descriptor file `glassfish-application.xml`. | |
| For individually deployed web or EJB modules, you define roles in | |
| `@DeclareRoles` annotations or the Java EE deployment descriptor files | |
| `web.xml` or `ejb-jar.xml`. You define the corresponding role mappings | |
| in the GlassFish Server deployment descriptor files `glassfish-web.xml` | |
| or `glassfish-ejb-jar.xml`. | |
| For more information regarding Java EE deployment descriptors, see the | |
| Java EE Specification. For more information regarding GlassFish Server | |
| deployment descriptors, see "link:../application-deployment-guide/dd-elements.html#GSDPG00007[Elements of the GlassFish | |
| Server Deployment Descriptors]" in GlassFish Server Open Source Edition | |
| Application Deployment Guide. | |
| Each `security-role-mapping` element in the `glassfish-application.xml`, | |
| `glassfish-web.xml`, or `glassfish-ejb-jar.xml` file maps a role name | |
| permitted by the application or module to principals and groups. For | |
| example, a `glassfish-web.xml` file for an individually deployed web | |
| module might contain the following: | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-web-app> | |
| <security-role-mapping> | |
| <role-name>manager</role-name> | |
| <principal-name>jgarcia</principal-name> | |
| <principal-name>mwebster</principal-name> | |
| <group-name>team-leads</group-name> | |
| </security-role-mapping> | |
| <security-role-mapping> | |
| <role-name>administrator</role-name> | |
| <principal-name>dsmith</principal-name> | |
| </security-role-mapping> | |
| </glassfish-web-app> | |
| ---- | |
| A role can be mapped to either specific principals or to groups (or | |
| both). The principal or group names used must be valid principals or | |
| groups in the realm for the application or module. Note that the | |
| `role-name` in this example must match the `@DeclareRoles` annotations | |
| or the `role-name` in the `security-role` element of the corresponding | |
| `web.xml` file. | |
| You can also specify a custom principal implementation class. This | |
| provides more flexibility in how principals can be assigned to roles. A | |
| user's JAAS login module now can authenticate its custom principal, and | |
| the authenticated custom principal can further participate in the | |
| GlassFish Server authorization process. For example: | |
| [source,oac_no_warn] | |
| ---- | |
| <security-role-mapping> | |
| <role-name>administrator</role-name> | |
| <principal-name class-name="CustomPrincipalImplClass"> | |
| dsmith | |
| </principal-name> | |
| </security-role-mapping> | |
| ---- | |
| You can specify a default principal and a default principal to role | |
| mapping, each of which applies to the entire GlassFish Server instance. | |
| The default principal to role mapping maps group principals to the same | |
| named roles. Web modules that omit the `run-as` element in `web.xml` use | |
| the default principal. Applications and modules that omit the | |
| `security-role-mapping` element use the default principal to role | |
| mapping. These defaults are part of the Security Service, which you can | |
| access in the following ways: | |
| * In the Administration Console, select the Security component under the | |
| relevant configuration. For details, click the Help button in the | |
| Administration Console. | |
| * Use the `asadmin set` command. For details, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. For | |
| example, you can set the default principal as follows. + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set server-config.security-service.default-principal=dsmith | |
| asadmin set server-config.security-service.default-principal-password=secret | |
| ---- | |
| You can set the default principal to role mapping as follows. + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set server-config.security-service.activate-default-principal-to-role-mapping=true | |
| asadmin set server-config.security-service.mapped-principal-class=CustomPrincipalImplClass | |
| ---- | |
| Default principal to role mapping is enabled by default. To disable it, | |
| set the default principal to role mapping property to false. | |
| [[beabo]][[GSDVG00118]][[realm-configuration]] | |
| Realm Configuration | |
| ~~~~~~~~~~~~~~~~~~~ | |
| The following topics are addressed here: | |
| * link:#beabp[Supported Realms] | |
| * link:#beabq[How to Configure a Realm] | |
| * link:#beabr[How to Set a Realm for an Application or Module] | |
| * link:#beabs[Creating a Custom Realm] | |
| [[beabp]][[GSDVG00364]][[supported-realms]] | |
| Supported Realms | |
| ^^^^^^^^^^^^^^^^ | |
| The following realms are supported in the current release of the | |
| GlassFish Server: | |
| * `file` - Stores user information in a file. This is the default realm | |
| when you first install the GlassFish Server. | |
| * `ldap` - Stores user information in an LDAP directory. | |
| * `jdbc` - Stores user information in a database. + | |
| In the JDBC realm, the server gets user credentials from a database. The | |
| GlassFish Server uses the database information and the enabled JDBC | |
| realm option in the configuration file. For digest authentication, a | |
| JDBC realm should be created with `jdbcDigestRealm` as the JAAS context. | |
| * `certificate` - Sets up the user identity in the GlassFish Server | |
| security context, and populates it with user data obtained from | |
| cryptographically verified client certificates. | |
| * `solaris` - Allows authentication using Solaris `username+password` | |
| data. This realm is only supported on the Solaris operating system, | |
| version 9 and above. | |
| For information about configuring realms, see link:#beabq[How to | |
| Configure a Realm]. | |
| [[beabq]][[GSDVG00365]][[how-to-configure-a-realm]] | |
| How to Configure a Realm | |
| ^^^^^^^^^^^^^^^^^^^^^^^^ | |
| You can configure a realm in one of these ways: | |
| * In the Administration Console, open the Security component under the | |
| relevant configuration and go to the Realms page. For details, click the | |
| Help button in the Administration Console. | |
| * Use the `asadmin create-auth-realm` command to configure realms on | |
| local servers. For details, see the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open | |
| Source Edition Reference Manual]. | |
| [[beabr]][[GSDVG00366]][[how-to-set-a-realm-for-an-application-or-module]] | |
| How to Set a Realm for an Application or Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The following deployment descriptor elements have optional `realm` or | |
| `realm-name` data subelements or attributes that override the domain's | |
| default realm: | |
| * `glassfish-application` element in `glassfish-application.xml` | |
| * `web-app` element in `web.xml` | |
| * `as-context` element in `glassfish-ejb-jar.xml` | |
| * `client-container` element in `sun-acc.xml` | |
| * `client-credential` element in `sun-acc.xml` | |
| If modules within an application specify realms, these are ignored. If | |
| present, the realm defined in `glassfish-application.xml` is used, | |
| otherwise the domain's default realm is used. | |
| For example, a realm is specified in `glassfish-application.xml` as | |
| follows: | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-application> | |
| ... | |
| <realm>ldap</realm> | |
| </glassfish-application> | |
| ---- | |
| For more information about the deployment descriptor files and elements, | |
| see "link:../application-deployment-guide/dd-elements.html#GSDPG00007[Elements of the GlassFish Server Deployment | |
| Descriptors]" in GlassFish Server Open Source Edition Application | |
| Deployment Guide. | |
| [[beabs]][[GSDVG00367]][[creating-a-custom-realm]] | |
| Creating a Custom Realm | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| You can create a custom realm by providing a custom Java Authentication | |
| and Authorization Service (JAAS) login module class and a custom realm | |
| class. Note that client-side JAAS login modules are not suitable for use | |
| with the GlassFish Server. | |
| To activate the custom login modules and realms, place the JAR files in | |
| the domain-dir`/lib` directory or the class files in the | |
| domain-dir`/lib/classes` directory. For more information about class | |
| loading in the GlassFish Server, see link:class-loaders.html#beade[Class | |
| Loaders]. | |
| JAAS is a set of APIs that enable services to authenticate and enforce | |
| access controls upon users. JAAS provides a pluggable and extensible | |
| framework for programmatic user authentication and authorization. JAAS | |
| is a core API and an underlying technology for Java EE security | |
| mechanisms. For more information about JAAS, refer to the JAAS | |
| specification for Java SDK, available at | |
| `http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html`. | |
| For general information about realms and login modules, see the section | |
| about working with realms, users, groups, and roles in | |
| "https://javaee.github.io/tutorial/security-intro.html[Introduction to | |
| Security in the Java EE Platform]" in The Java EE 8 Tutorial. | |
| For Javadoc tool pages relevant to custom realms, see the | |
| `com.sun.appserv.security` package. | |
| Custom login modules must extend the | |
| `com.sun.appserv.security.AppservPasswordLoginModule` class. This class | |
| implements javax.security.auth.spi.LoginModule. Custom login modules | |
| must not implement LoginModule directly. | |
| Custom login modules must provide an implementation for one abstract | |
| method defined in `AppservPasswordLoginModule`: | |
| [source,oac_no_warn] | |
| ---- | |
| abstract protected void authenticateUser() throws LoginException | |
| ---- | |
| This method performs the actual authentication. The custom login module | |
| must not implement any of the other methods, such as `login`, `logout`, | |
| `abort`, `commit`, or `initialize`. Default implementations are provided | |
| in `AppservPasswordLoginModule` which hook into the GlassFish Server | |
| infrastructure. | |
| The custom login module can access the following protected object | |
| fields, which it inherits from `AppservPasswordLoginModule`. These | |
| contain the user name and password of the user to be authenticated: | |
| [source,oac_no_warn] | |
| ---- | |
| protected String _username; | |
| protected String _password; | |
| ---- | |
| The `authenticateUser` method must end with the following sequence: | |
| [source,oac_no_warn] | |
| ---- | |
| String[] grpList; | |
| // populate grpList with the set of groups to which | |
| // _username belongs in this realm, if any | |
| commitUserAuthentication(grpList); | |
| ---- | |
| Custom realms must extend the `com.sun.appserv.security.AppservRealm` | |
| class and implement the following methods: | |
| [source,oac_no_warn] | |
| ---- | |
| public void init(Properties props) throws BadRealmException, | |
| NoSuchRealmException | |
| ---- | |
| This method is invoked during server startup when the realm is initially | |
| loaded. The `props` argument contains the properties defined for this | |
| realm. The realm can do any initialization it needs in this method. If | |
| the method returns without throwing an exception, the GlassFish Server | |
| assumes that the realm is ready to service authentication requests. If | |
| an exception is thrown, the realm is disabled. | |
| [source,oac_no_warn] | |
| ---- | |
| public String getAuthType() | |
| ---- | |
| This method returns a descriptive string representing the type of | |
| authentication done by this realm. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract Enumeration getGroupNames(String username) throws | |
| InvalidOperationException, NoSuchUserException | |
| ---- | |
| This method returns an `Enumeration` (of `String` objects) enumerating | |
| the groups (if any) to which the given `username` belongs in this realm. | |
| Custom realms that manage users must implement the following additional | |
| methods: | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract boolean supportsUserManagement(); | |
| ---- | |
| This method returns `true` if the realm supports user management. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract Enumeration getGroupNames() throws BadRealmException; | |
| ---- | |
| This method returns an `Enumeration` of all group names. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract Enumeration getUserNames() throws BadRealmException; | |
| ---- | |
| This method returns an `Enumeration` of all user names. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract void refresh() throws BadRealmException; | |
| ---- | |
| This method refreshes the realm data so that new users and groups are | |
| visible. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract void persist() throws BadRealmException; | |
| ---- | |
| This method persists the realm data to permanent storage. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract User getUser(String name) throws NoSuchUserException, | |
| BadRealmException; | |
| ---- | |
| This method returns the information recorded about a particular named | |
| user. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract void addUser(String name, String password, String[] groupList) throws | |
| BadRealmException, IASSecurityException; | |
| ---- | |
| This method adds a new user, who cannot already exist. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract void removeUser(String name) throws NoSuchUserException, | |
| BadRealmException; | |
| ---- | |
| This method removes a user, who must exist. | |
| [source,oac_no_warn] | |
| ---- | |
| public abstract void updateUser(String name, String newName, String password, | |
| String[] groups) throws NoSuchUserException, BadRealmException, IASSecurityException; | |
| ---- | |
| This method updates data for a user, who must exist. | |
| [NOTE] | |
| ======================================================================= | |
| The array passed to the `commitUseAuthentication` method should be newly | |
| created and otherwise unreferenced. This is because the group name array | |
| elements are set to null after authentication as part of cleanup. So the | |
| second time your custom realm executes it returns an array with null | |
| elements. | |
| Ideally, your custom realm should not return member variables from the | |
| `authenticate` method. It should return local variables as the default | |
| `JDBCRealm` does. Your custom realm can create a local `String` array in | |
| its `authenticate` method, copy the values from the member variables, | |
| and return the `String` array. Or it can use `clone` on the member | |
| variables. | |
| ======================================================================= | |
| [[BACDEIHB]][[GSDVG563]][[java-ee-security-api-support]] | |
| Java EE Security API Support | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| JSR-375 defines several authentication-related plugin SPIs, such as, | |
| `HttpAuthenticationMechanism` interface, the `IdentityStore` and | |
| `IdentityStoreHandler` interfaces: | |
| * `HttpAuthenticationMechanism`: An interface for modules that | |
| authenticate callers to a web application. An application can supply its | |
| own `HttpAuthenticationMechanism`, or use one of the default | |
| implementations provided by the container. | |
| * `IdentityStore`: This interface defines methods for validating a | |
| caller's credentials (such as user name and password) and returning | |
| group membership information. An application can provide its own | |
| IdentityStore, or use the built in LDAP or Database store. | |
| * `RememberMeIdentityStore`: This interface is a variation on the | |
| `IdentityStore` interface, intended to address cases where an | |
| authenticated user's identity should be remembered for an extended | |
| period of time, so that the caller can return to the application | |
| periodically without needing to present primary authentication | |
| credentials each time. | |
| In addition to these authentication plugin SPIs, the Java EE Security | |
| API specification defines the `SecurityContext` API for use by | |
| application code to query and interact with the current security | |
| context. The `SecurityContext` interface defines methods that allow an | |
| application to access security information about a caller, authenticate | |
| a caller, and authorize a caller. These methods include | |
| `getCallerPrincipal()`, `getPrincipalsByType()`, `isCallerInRole()`, | |
| `authenticate()`, and `hasAccessToWebResource()`. | |
| [[beabt]][[GSDVG00119]][[jacc-support]] | |
| JACC Support | |
| ~~~~~~~~~~~~ | |
| JACC (Java Authorization Contract for Containers) is part of the Java EE | |
| specification and defined by http://www.jcp.org/en/jsr/detail?id=115[JSR | |
| 115] (`http://www.jcp.org/en/jsr/detail?id=115`). JACC defines an | |
| interface for pluggable authorization providers. Specifically, JACC is | |
| used to plug in the Java policy provider used by the container to | |
| perform Java EE caller access decisions. The Java policy provider | |
| performs Java policy decisions during application execution. This | |
| provides third parties with a mechanism to develop and plug in modules | |
| that are responsible for answering authorization decisions during Java | |
| EE application execution. The interfaces and rules used for developing | |
| JACC providers are defined in the JACC 1.0 specification. | |
| The GlassFish Server provides a simple file-based JACC-compliant | |
| authorization engine as a default JACC provider, named `default`. An | |
| alternate provider named `simple` is also provided. To configure an | |
| alternate provider using the Administration Console, open the Security | |
| component under the relevant configuration, and select the JACC | |
| Providers component. For details, click the Help button in the | |
| Administration Console. | |
| [[beabu]][[GSDVG00120]][[pluggable-audit-module-support]] | |
| Pluggable Audit Module Support | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| Audit modules collect and store information on incoming requests | |
| (servlets, EJB components) and outgoing responses. You can create a | |
| custom audit module. | |
| The following topics are addressed here: | |
| * link:#beabv[Configuring an Audit Module] | |
| * link:#beabw[The `AuditModule` Class] | |
| [[beabv]][[GSDVG00368]][[configuring-an-audit-module]] | |
| Configuring an Audit Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| To configure an audit module, you can perform one of the following | |
| tasks: | |
| * To specify an audit module using the Administration Console, open the | |
| Security component under the relevant configuration, and select the | |
| Audit Modules component. For details, click the Help button in the | |
| Administration Console. | |
| * You can use the `asadmin create-audit-module` command to configure an | |
| audit module. For details, see the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open | |
| Source Edition Reference Manual]. | |
| [[beabw]][[GSDVG00369]][[the-auditmodule-class]] | |
| The `AuditModule` Class | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| You can create a custom audit module by implementing a class that | |
| extends `com.sun.enterprise.security.audit.AuditModule`. | |
| For Javadoc tool pages relevant to audit modules, see the | |
| `com.sun.enterprise.security.audit` package. | |
| The `AuditModule` class provides default "no-op" implementations for | |
| each of the following methods, which your custom class can override. | |
| [source,oac_no_warn] | |
| ---- | |
| public void init(Properties props) | |
| ---- | |
| The preceding method is invoked during server startup when the audit | |
| module is initially loaded. The `props` argument contains the properties | |
| defined for this module. The module can do any initialization it needs | |
| in this method. If the method returns without throwing an exception, the | |
| GlassFish Server assumes the module realm is ready to service audit | |
| requests. If an exception is thrown, the module is disabled. | |
| [source,oac_no_warn] | |
| ---- | |
| public void authentication(String user, String realm, boolean success) | |
| ---- | |
| This method is invoked when an authentication request has been processed | |
| by a realm for the given user. The `success` flag indicates whether the | |
| authorization was granted or denied. | |
| [source,oac_no_warn] | |
| ---- | |
| public void webInvocation(String user, HttpServletRequest req, String type, boolean success) | |
| ---- | |
| This method is invoked when a web container call has been processed by | |
| authorization. The `success` flag indicates whether the authorization | |
| was granted or denied. The `req` object is the standard | |
| `HttpServletRequest` object for this request. The `type` string is one | |
| of `hasUserDataPermission` or `hasResourcePermission` (see | |
| http://www.jcp.org/en/jsr/detail?id=115[JSR 115] | |
| (`http://www.jcp.org/en/jsr/detail?id=115`)). | |
| [source,oac_no_warn] | |
| ---- | |
| public void ejbInvocation(String user, String ejb, String method, boolean success) | |
| ---- | |
| This method is invoked when an EJB container call has been processed by | |
| authorization. The `success` flag indicates whether the authorization | |
| was granted or denied. The `ejb` and `method` strings describe the EJB | |
| component and its method that is being invoked. | |
| [source,oac_no_warn] | |
| ---- | |
| public void webServiceInvocation(String uri, String endpoint, boolean success) | |
| ---- | |
| This method is invoked during validation of a web service request in | |
| which the endpoint is a servlet. The `uri` is the URL representation of | |
| the web service endpoint. The `endpoint` is the name of the endpoint | |
| representation. The `success` flag indicates whether the authorization | |
| was granted or denied. | |
| [source,oac_no_warn] | |
| ---- | |
| public void ejbAsWebServiceInvocation(String endpoint, boolean success) | |
| ---- | |
| This method is invoked during validation of a web service request in | |
| which the endpoint is a stateless session bean. The `endpoint` is the | |
| name of the endpoint representation. The `success` flag indicates | |
| whether the authorization was granted or denied. | |
| [[beabx]][[GSDVG00121]][[the-server.policy-file]] | |
| The `server.policy` File | |
| ~~~~~~~~~~~~~~~~~~~~~~~~ | |
| Each GlassFish Server domain has its own global J2SE policy file, | |
| located in domain-dir`/config`. The file is named `server.policy`. | |
| The GlassFish Server is a Java EE compliant application server. As such, | |
| it follows the requirements of the Java EE specification, including the | |
| presence of the security manager (the Java component that enforces the | |
| policy) and a limited permission set for Java EE application code. | |
| The following topics are addressed here: | |
| * link:#beaby[Default Permissions] | |
| * link:#gilzz[System Properties] | |
| * link:#beabz[Changing Permissions for an Application] | |
| * link:#gbyah[Enabling and Disabling the Security Manager] | |
| [[beaby]][[GSDVG00370]][[default-permissions]] | |
| Default Permissions | |
| ^^^^^^^^^^^^^^^^^^^ | |
| Internal server code is granted all permissions. These are covered by | |
| the `AllPermission` grant blocks to various parts of the server | |
| infrastructure code. Do not modify these entries. | |
| Application permissions are granted in the default grant block. These | |
| permissions apply to all code not part of the internal server code | |
| listed previously. The GlassFish Server does not distinguish between EJB | |
| and web module permissions. All code is granted the minimal set of web | |
| component permissions (which is a superset of the EJB minimal set). Do | |
| not modify these entries. | |
| A few permissions above the minimal set are also granted in the default | |
| `server.policy` file. These are necessary due to various internal | |
| dependencies of the server implementation. Java EE application | |
| developers must not rely on these additional permissions. In some cases, | |
| deleting these permissions might be appropriate. For example, one | |
| additional permission is granted specifically for using connectors. If | |
| connectors are not used in a particular domain, you should remove this | |
| permission, because it is not otherwise necessary. | |
| [[gilzz]][[GSDVG00371]][[system-properties]] | |
| System Properties | |
| ^^^^^^^^^^^^^^^^^ | |
| The following predefined system properties, also called variables, are | |
| available for use in the `server.policy` file. The system property most | |
| frequently used in `server.policy` is `${com.sun.aas.instanceRoot}`. For | |
| more information about system properties, see the | |
| `asadmin create-system-properties` command in the link:../reference-manual/toc.html#GSRFM[GlassFish | |
| Server Open Source Edition Reference Manual]. | |
| [[GSDVG533]][[sthref5]][[sthref6]] | |
| Table 4-1 Predefined System Properties | |
| [width="100%",cols="29%,17%,54%",options="header",] | |
| |======================================================================= | |
| |Property |Default |Description | |
| |`com.sun.aas.installRoot` |depends on operating system |Specifies the | |
| directory where the GlassFish Server is installed. | |
| |`com.sun.aas.instanceRoot` |depends on operating system |Specifies the | |
| top level directory for a server instance. | |
| |`com.sun.aas.hostName` |none |Specifies the name of the host (machine). | |
| |`com.sun.aas.javaRoot` |depends on operating system |Specifies the | |
| installation directory for the Java runtime. | |
| |`com.sun.aas.imqLib` |depends on operating system |Specifies the | |
| library directory for the Open Message Queue software. | |
| |`com.sun.aas.configName` |`server-config` |Specifies the name of the | |
| configuration used by a server instance. | |
| |`com.sun.aas.instanceName` |`server1` |Specifies the name of the server | |
| instance. This property is not used in the default configuration, but | |
| can be used to customize configuration. | |
| |`com.sun.aas.clusterName` |`cluster1` |Specifies the name of the | |
| cluster. This property is only set on clustered server instances. This | |
| property is not used in the default configuration, but can be used to | |
| customize configuration. | |
| |`com.sun.aas.domainName` |`domain1` |Specifies the name of the domain. | |
| This property is not used in the default configuration, but can be used | |
| to customize configuration. | |
| |======================================================================= | |
| [[beabz]][[GSDVG00372]][[changing-permissions-for-an-application]] | |
| Changing Permissions for an Application | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The default policy for each domain limits the permissions of Java EE | |
| deployed applications to the minimal set of permissions required for | |
| these applications to operate correctly. Do not add extra permissions to | |
| the default set (the grant block with no codebase, which applies to all | |
| code). Instead, add a new grant block with a codebase specific to the | |
| applications requiring the extra permissions, and only add the minimally | |
| necessary permissions in that block. | |
| If you develop multiple applications that require more than this default | |
| set of permissions, you can add the custom permissions that your | |
| applications need. The `com.sun.aas.instanceRoot` variable refers to the | |
| domain-dir. For example: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/-" { | |
| ... | |
| } | |
| ---- | |
| You can add permissions to stub code with the following grant block: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/generated/-" { | |
| ... | |
| } | |
| ---- | |
| In general, you should add extra permissions only to the applications or | |
| modules that require them, not to all applications deployed to a domain. | |
| For example: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/MyApp/-" { | |
| ... | |
| } | |
| ---- | |
| For a module: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/MyModule/-" { | |
| ... | |
| } | |
| ---- | |
| [NOTE] | |
| =================================================================== | |
| Deployment directories may change between GlassFish Server releases. | |
| =================================================================== | |
| An alternative way to add permissions to a specific application or | |
| module is to edit the `granted.policy` file for that application or | |
| module. The `granted.policy` file is located in the | |
| domain-dir`/generated/policy/`app-or-module-name directory. In this | |
| case, you add permissions to the default grant block. Do not delete | |
| permissions from this file. | |
| When the GlassFish Server policy subsystem determines that a permission | |
| should not be granted, it logs a `server.policy` message specifying the | |
| permission that was not granted and the protection domains, with | |
| indicated code source and principals that failed the protection check. | |
| For example, here is the first part of a typical message: | |
| [source,oac_no_warn] | |
| ---- | |
| [#|2005-12-17T16:16:32.671-0200|INFO|sun-appserver-pe9.1| | |
| javax.enterprise.system.core.security|_ThreadID=14;_ThreadName=Thread-31;| | |
| JACC Policy Provider: PolicyWrapper.implies, context(null)- | |
| permission((java.util.PropertyPermission java.security.manager write)) | |
| domain that failed(ProtectionDomain | |
| (file:/E:/glassfish/domains/domain1/applications/cejug-clfds/ ... ) | |
| ... | |
| ---- | |
| Granting the following permission eliminates the message: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/cejug-clfds/-" { | |
| permission java.util.PropertyPermission "java.security.manager", "write"; | |
| } | |
| ---- | |
| [NOTE] | |
| ======================================================================= | |
| Do not add `java.security.AllPermission` to the `server.policy` file for | |
| application code. Doing so completely defeats the purpose of the | |
| security manager, yet you still get the performance overhead associated | |
| with it. | |
| ======================================================================= | |
| As noted in the Java EE specification, an application should provide | |
| documentation of the additional permissions it needs. If an application | |
| requires extra permissions but does not document the set it needs, | |
| contact the application author for details. | |
| As a last resort, you can iteratively determine the permission set an | |
| application needs by observing `AccessControlException` occurrences in | |
| the server log. | |
| If this is not sufficient, you can add the | |
| `-Djava.security.debug=failure` JVM option to the domain. Use the | |
| following `asadmin create-jvm-options` command, then restart the server: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin create-jvm-options -Djava.security.debug=failure | |
| ---- | |
| For more information about the `asadmin create-jvm-options` command, see | |
| the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| You can use the J2SE standard `policytool` or any text editor to edit | |
| the `server.policy` file. For more information, see | |
| `http://docs.oracle.com/javase/tutorial/security/tour2/index.html`. | |
| For detailed information about policy file syntax, see | |
| `http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html`. | |
| For information about using system properties in the `server.policy` | |
| file, see | |
| `http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html`. | |
| For detailed information about the permissions you can set in the | |
| `server.policy` file, see | |
| `http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html`. | |
| The Javadoc for the `Permission` class is at | |
| `http://docs.oracle.com/javase/8/docs/api/java/security/Permission.html`. | |
| [[gbyah]][[GSDVG00373]][[enabling-and-disabling-the-security-manager]] | |
| Enabling and Disabling the Security Manager | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The security manager is disabled by default. | |
| In a production environment, you may be able to safely disable the | |
| security manager if all of the following are true: | |
| * Performance is critical | |
| * Deployment to the production server is carefully controlled | |
| * Only trusted applications are deployed | |
| * Applications don't need policy enforcement | |
| Disabling the security manager may improve performance significantly for | |
| some types of applications. | |
| To enable the security manager, do one of the following: | |
| * To use the Administration Console, open the Security component under | |
| the relevant configuration, and check the Security Manager Enabled box. | |
| Then restart the server. For details, click the Help button in the | |
| Administration Console. | |
| * Use the following `asadmin create-jvm-options` command, then restart | |
| the server: + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin create-jvm-options -Djava.security.manager | |
| ---- | |
| To disable the security manager, uncheck the Security Manager Enabled | |
| box or use the corresponding `asadmin delete-jvm-options` command. For | |
| more information about `create-jvm-options` and `delete-jvm-options`, | |
| see the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference | |
| Manual]. | |
| If the security manager is enabled and you are using the Java | |
| Persistence API by calling `Persistence.createEMF()`, the EclipseLink | |
| persistence provider requires that you set the | |
| `eclipselink.security.usedoprivileged` JVM option to `true` as follows: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin create-jvm-options -Declipselink.security.usedoprivileged=true | |
| ---- | |
| If the security manager is enabled and you are using the Java | |
| Persistence API by injecting or looking up an entity manager or entity | |
| manager factory, the EJB container sets this JVM option for you. | |
| You must grant additional permissions to CDI-enabled Java EE | |
| applications that are deployed in a GlassFish Server 5.0 domain or | |
| cluster for which security manager is enabled. These additional | |
| permissions are not required when security manager is disabled. | |
| To deploy CDI-enabled Java EE applications in a GlassFish Server 5.0 | |
| domain or cluster for which security manager is enabled, add the | |
| following permissions to the applications: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/[ApplicationName]" { | |
| permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; | |
| }; | |
| ---- | |
| For example, for a CDI application named `foo.war`, add the following | |
| permissions to the `server.policy` file, restart the domain or cluster, | |
| and then deploy and use the application. | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:${com.sun.aas.instanceRoot}/applications/foo" { | |
| permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; | |
| }; | |
| ---- | |
| For more information about modifying application permissions, see | |
| link:#beabz[Changing Permissions for an Application]. | |
| [[beaca]][[GSDVG00122]][[configuring-message-security-for-web-services]] | |
| Configuring Message Security for Web Services | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| In message security, security information is applied at the message | |
| layer and travels along with the web services message. Web Services | |
| Security (WSS) is the use of XML Encryption and XML Digital Signatures | |
| to secure messages. WSS profiles the use of various security tokens | |
| including X.509 certificates, Security Assertion Markup Language (SAML) | |
| assertions, and username/password tokens to achieve this. | |
| Message layer security differs from transport layer security in that it | |
| can be used to decouple message protection from message transport so | |
| that messages remain protected after transmission, regardless of how | |
| many hops they travel. | |
| [NOTE] | |
| ======================================================================= | |
| Message security (JSR 196) is supported only in the full GlassFish | |
| Server, not in the Web Profile. | |
| ======================================================================= | |
| [NOTE] | |
| ======================================================================= | |
| In this release of the GlassFish Server, message layer annotations are | |
| not supported. | |
| ======================================================================= | |
| For more information about web services, see | |
| link:webservices.html#gaszn[Developing Web Services]. | |
| For more information about message security, see the following: | |
| * "https://javaee.github.io/tutorial/security-intro.html[Introduction to | |
| Security in the Java EE Platform]" in The Java EE 8 Tutorial | |
| * link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition Security Guide] | |
| * http://www.jcp.org/en/jsr/detail?id=196[JSR 196] | |
| (`http://www.jcp.org/en/jsr/detail?id=196`), Java Authentication Service | |
| Provider Interface for Containers | |
| * The Liberty Alliance Project specifications at | |
| `http://www.projectliberty.org/resources/specifications.php/?f=resources/specifications.php` | |
| * The Oasis Web Services Security (WSS) specification at | |
| `http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf` | |
| * The Web Services Interoperability Organization (WS-I) Basic Security | |
| Profile (BSP) specification at | |
| `http://www.ws-i.org/Profiles/BasicSecurityProfile-1.0.html` | |
| * The XML and Web Services Security page at `http://xwss.java.net/` | |
| * The WSIT page at `http://wsit.java.net/` | |
| The following topics are addressed here: | |
| * link:#gbjxw[Message Security Providers] | |
| * link:#beacb[Message Security Responsibilities] | |
| * link:#beacf[Application-Specific Message Protection] | |
| * link:#beaci[Understanding and Running the Sample Application] | |
| [[gbjxw]][[GSDVG00374]][[message-security-providers]] | |
| Message Security Providers | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| When you first install the GlassFish Server, the providers | |
| `XWS_ClientProvider` and `XWS_ServerProvider` are configured but | |
| disabled. You can enable them in one of the following ways: | |
| * To enable the message security providers using the Administration | |
| Console, open the Security component under the relevant configuration, | |
| select the Message Security component, and select SOAP. Then select | |
| `XWS_ServerProvider` from the Default Provider list and | |
| `XWS_ClientProvider` from the Default Client Provider list. For details, | |
| click the Help button in the Administration Console. | |
| * You can enable the message security providers using the following | |
| commands. + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set | |
| server-config.security-service.message-security-config.SOAP.default_provider=XWS_ServerProvider | |
| asadmin set | |
| server-config.security-service.message-security-config.SOAP.default_client_provider=XWS_ClientProvider | |
| ---- | |
| For more information about the `asadmin set` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| The example described in link:#beaci[Understanding and Running the | |
| Sample Application] uses the `ClientProvider` and `ServerProvider` | |
| providers, which are enabled when the Ant targets are run. You don't | |
| need to enable these on the GlassFish Server prior to running the | |
| example. | |
| If you install the OpenSSO, you have these additional provider choices: | |
| * `AMClientProvider` and `AMServerProvider` - These providers secure web | |
| services and Simple Object Access Protocol (SOAP) messages using either | |
| WS-I BSP or Liberty ID-WSF tokens. These providers are used | |
| automatically if they are configured as the default providers. If you | |
| wish to override any provider settings, you can configure these | |
| providers in `message-security-binding` elements in the | |
| `glassfish-web.xml`, `glassfish-ejb-jar.xml`, and | |
| `glassfish-application-client.xml` deployment descriptor files. | |
| * `AMHttpProvider` - This provider handles the initial end user | |
| authentication for securing web services using Liberty ID-WSF tokens and | |
| redirects requests to the OpenSSO for single sign-on. To use this | |
| provider, specify it in the `httpservlet-security-provider` attribute of | |
| the `glassfish-web-app` element in the `glassfish-web.xml` file. | |
| Liberty specifications can be viewed at | |
| `http://www.projectliberty.org/resources/specifications.php/?f=resources/specifications.php`. | |
| The WS-I BSP specification can be viewed at | |
| `http://www.ws-i.org/Profiles/BasicSecurityProfile-1.0.html`. | |
| For more information about the GlassFish Server deployment descriptor | |
| files, see the link:../application-deployment-guide/toc.html#GSDPG[GlassFish Server Open Source Edition | |
| Application Deployment Guide]. | |
| For information about configuring these providers in the GlassFish | |
| Server, see the link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition | |
| Security Guide]. For additional information about overriding provider | |
| settings, see link:#beacf[Application-Specific Message Protection]. | |
| You can create new message security providers in one of the following | |
| ways: | |
| * To create a message security provider using the Administration | |
| Console, open the Security component under the relevant configuration, | |
| and select the Message Security component. For details, click the Help | |
| button in the Administration Console. | |
| * You can use the `asadmin create-message-security-provider` command to | |
| create a message security provider. For details, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| In addition, you can set a few optional provider properties using the | |
| `asadmin set` command. For example: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set server-config.security-service.message-security-config.provider-config.property.debug=true | |
| ---- | |
| The following table describes these message security provider | |
| properties. | |
| [[GSDVG534]][[sthref7]][[sthref8]] | |
| Table 4-2 Message Security Provider Properties | |
| [width="100%",cols="30%,24%,46%",options="header",] | |
| |======================================================================= | |
| |Property |Default |Description | |
| |`security.config` |domain-dir`/``config/``wss-server-``config-1.0.xml` | |
| a| | |
| Specifies the location of the message security configuration file. To | |
| point to a configuration file in the domain-dir`/config` directory, use | |
| the system property `${com.sun.aas.instanceRoot}/``config/`, for | |
| example: | |
| `${com.sun.aas.instanceRoot}/config/``wss-server-config-1.0.xml` | |
| See link:#gilzz[System Properties]. | |
| |`debug` |`false` |If `true`, enables dumping of server provider debug | |
| messages to the server log. | |
| |`dynamic.username.password` |`false` |If `true`, signals the provider | |
| runtime to collect the user name and password from the `CallbackHandler` | |
| for each request. If `false`, the user name and password for | |
| `wsse:UsernameToken(s)` is collected once, during module initialization. | |
| This property is only applicable for a `ClientAuthModule`. | |
| |`encryption.key.alias` |`s1as` |Specifies the encryption key used by | |
| the provider. The key is identified by its `keystore` alias. | |
| |`signature.key.alias` |`s1as` |Specifies the signature key used by the | |
| provider. The key is identified by its `keystore` alias. | |
| |======================================================================= | |
| [[beacb]][[GSDVG00375]][[message-security-responsibilities]] | |
| Message Security Responsibilities | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| In the GlassFish Server, the system administrator and application | |
| deployer roles are expected to take primary responsibility for | |
| configuring message security. In some situations, the application | |
| developer may also contribute, although in the typical case either of | |
| the other roles may secure an existing application without changing its | |
| implementation and without involving the developer. | |
| The following topics are addressed here: | |
| * link:#beacc[Application Developer Responsibilities] | |
| * link:#beacd[Application Deployer Responsibilities] | |
| * link:#beace[System Administrator Responsibilities] | |
| [[beacc]][[GSDVG00241]][[application-developer-responsibilities]] | |
| Application Developer Responsibilities | |
| ++++++++++++++++++++++++++++++++++++++ | |
| The application developer can turn on message security, but is not | |
| responsible for doing so. Message security can be set up by the system | |
| administrator so that all web services are secured, or set up by the | |
| application deployer when the provider or protection policy bound to the | |
| application must be different from that bound to the container. | |
| The application developer is responsible for the following: | |
| * Determining if an application-specific message protection policy is | |
| required by the application. If so, ensuring that the required policy is | |
| specified at application assembly which may be accomplished by | |
| communicating with the application deployer. | |
| * Determining if message security is necessary at the GlassFish Server | |
| level. If so, ensuring that this need is communicated to the system | |
| administrator, or taking care of implementing message security at the | |
| GlassFish Server level. | |
| [[beacd]][[GSDVG00242]][[application-deployer-responsibilities]] | |
| Application Deployer Responsibilities | |
| +++++++++++++++++++++++++++++++++++++ | |
| The application deployer is responsible for the following: | |
| * Specifying (at application assembly) any required application-specific | |
| message protection policies if such policies have not already been | |
| specified by upstream roles (the developer or assembler) | |
| * Modifying GlassFish Server deployment descriptors to specify | |
| application-specific message protection policies information | |
| (message-security-binding elements) to web service endpoint and service | |
| references | |
| These security tasks are discussed in link:#beacf[Application-Specific | |
| Message Protection]. A sample application using message security is | |
| discussed in link:#beaci[Understanding and Running the Sample | |
| Application]. | |
| [[beace]][[GSDVG00243]][[system-administrator-responsibilities]] | |
| System Administrator Responsibilities | |
| +++++++++++++++++++++++++++++++++++++ | |
| The system administrator is responsible for the following: | |
| * Configuring message security providers on the GlassFish Server. | |
| * Managing user databases. | |
| * Managing keystore and truststore files. | |
| * Installing the sample. This is only done if the `xms` sample | |
| application is used to demonstrate the use of message layer web services | |
| security. | |
| A system administrator uses the Administration Console to manage server | |
| security settings and uses a command line tool to manage certificate | |
| databases. Certificates and private keys are stored in key stores and | |
| are managed with `keytool`. If Network Security Services (NSS) is | |
| installed, certificates and private keys are stored in an NSS database, | |
| where they are managed using `certutil`. System administrator tasks are | |
| discussed in the link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition | |
| Security Guide]. | |
| [[beacf]][[GSDVG00376]][[application-specific-message-protection]] | |
| Application-Specific Message Protection | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| When the GlassFish Server provided configuration is insufficient for | |
| your security needs, and you want to override the default protection, | |
| you can apply application-specific message security to a web service. | |
| Application-specific security is implemented by adding the message | |
| security binding to the web service endpoint, whether it is an EJB or | |
| servlet web service endpoint. Modify GlassFish Server XML files to add | |
| the message binding information. | |
| Message security can also be specified using a WSIT security policy in | |
| the WSDL file. For details, see the WSIT page at | |
| `http://wsit.java.net/`. | |
| For more information about message security providers, see | |
| link:#gbjxw[Message Security Providers]. | |
| For more details on message security binding for EJB web services, | |
| servlet web services, and clients, see the XML file descriptions in | |
| "link:../application-deployment-guide/dd-elements.html#GSDPG00007[Elements of the GlassFish Server Deployment | |
| Descriptors]" in GlassFish Server Open Source Edition Application | |
| Deployment Guide. | |
| * For `glassfish-ejb-jar.xml`, see "link:../application-deployment-guide/dd-files.html#GSDPG00079[The | |
| glassfish-ejb-jar.xml File]" in GlassFish Server Open Source Edition | |
| Application Deployment Guide. | |
| * For `glassfish-web.xml`, see "link:../application-deployment-guide/dd-files.html#GSDPG00078[The glassfish-web.xml | |
| File]" in GlassFish Server Open Source Edition Application Deployment | |
| Guide. | |
| * For `glassfish-application-client.xml`, see "link:../application-deployment-guide/dd-files.html#GSDPG00081[The | |
| glassfish-application-client.xml file]" in GlassFish Server Open Source | |
| Edition Application Deployment Guide. | |
| The following topics are addressed here: | |
| * link:#beacg[Using a Signature to Enable Message Protection for All | |
| Methods] | |
| * link:#beach[Configuring Message Protection for a Specific Method Based | |
| on Digital Signatures] | |
| [[beacg]][[GSDVG00244]][[using-a-signature-to-enable-message-protection-for-all-methods]] | |
| Using a Signature to Enable Message Protection for All Methods | |
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
| To enable message protection for all methods using digital signature, | |
| update the `message-security-binding` element for the EJB web service | |
| endpoint in the application's `glassfish-ejb-jar.xml` file. In this | |
| file, add `request-protection` and `response-protection` elements, which | |
| are analogous to the `request-policy` and `response-policy` elements | |
| discussed in the link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition | |
| Security Guide]. To apply the same protection mechanisms for all | |
| methods, leave the method-name element blank. link:#beach[Configuring | |
| Message Protection for a Specific Method Based on Digital Signatures] | |
| discusses listing specific methods or using wildcard characters. | |
| This section uses the sample application discussed in | |
| link:#beaci[Understanding and Running the Sample Application] to apply | |
| application-level message security to show only the differences | |
| necessary for protecting web services using various mechanisms. | |
| [[fvyag]][[GSDVG00052]][[to-enable-message-protection-for-all-methods-using-digital-signature]] | |
| To Enable Message Protection for All Methods Using Digital Signature | |
| Follow this procedure. | |
| 1. In a text editor, open the application's `glassfish-ejb-jar.xml` | |
| file. + | |
| For the `xms` example, this file is located in the directory | |
| app-dir`/xms-ejb/src/conf`, where app-dir is defined in link:#beacj[To | |
| Set Up the Sample Application]. | |
| 2. Modify the `glassfish-ejb-jar.xml` file by adding the | |
| `message-security-binding` element as shown: + | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-ejb-jar> | |
| <enterprise-beans> | |
| <unique-id>1</unique-id> | |
| <ejb> | |
| <ejb-name>HelloWorld</ejb-name> | |
| <jndi-name>HelloWorld</jndi-name> | |
| <webservice-endpoint> | |
| <port-component-name>HelloIF</port-component-name> | |
| <endpoint-address-uri>service/HelloWorld</endpoint-address-uri> | |
| <message-security-binding auth-layer="SOAP"> | |
| <message-security> | |
| <request-protection auth-source="content" /> | |
| <response-protection auth-source="content"/> | |
| </message-security> | |
| </message-security-binding> | |
| </webservice-endpoint> | |
| </ejb> | |
| </enterprise-beans> | |
| </glassfish-ejb-jar> | |
| ---- | |
| 3. Compile, deploy, and run the application as described in | |
| link:#beack[To Run the Sample Application]. | |
| [[beach]][[GSDVG00245]][[configuring-message-protection-for-a-specific-method-based-on-digital-signatures]] | |
| Configuring Message Protection for a Specific Method Based on Digital Signatures | |
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
| To enable message protection for a specific method, or for a set of | |
| methods that can be identified using a wildcard value, follow these | |
| steps. As in the example discussed in link:#beacg[Using a Signature to | |
| Enable Message Protection for All Methods], to enable message protection | |
| for a specific method, update the `message-security-binding` element for | |
| the EJB web service endpoint in the application's | |
| `glassfish-ejb-jar.xml` file. To this file, add `request-protection` and | |
| `response-protection` elements, which are analogous to the | |
| `request-policy` and `response-policy` elements discussed in the | |
| link:../security-guide/toc.html#GSSCG[GlassFish Server Open Source Edition Security Guide]. The | |
| administration guide includes a table listing the set and order of | |
| security operations for different request and response policy | |
| configurations. | |
| This section uses the sample application discussed in | |
| link:#beaci[Understanding and Running the Sample Application] to apply | |
| application-level message security to show only the differences | |
| necessary for protecting web services using various mechanisms. | |
| [[fvybb]][[GSDVG00053]][[to-enable-message-protection-for-a-particular-method-or-set-of-methods-using-digital-signature]] | |
| To Enable Message Protection for a Particular Method or Set of Methods | |
| Using Digital Signature | |
| Follow this procedure. | |
| 1. In a text editor, open the application's `glassfish-ejb-jar.xml` | |
| file. + | |
| For the `xms` example, this file is located in the directory | |
| app-dir`/xms-ejb/src/conf`, where app-dir is defined in link:#beacj[To | |
| Set Up the Sample Application]. | |
| 2. Modify the `glassfish-ejb-jar.xml` file by adding the | |
| `message-security-binding` element as shown: + | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-ejb-jar> | |
| <enterprise-beans> | |
| <unique-id>1</unique-id> | |
| <ejb> | |
| <ejb-name>HelloWorld</ejb-name> | |
| <jndi-name>HelloWorld</jndi-name> | |
| <webservice-endpoint> | |
| <port-component-name>HelloIF</port-component-name> | |
| <endpoint-address-uri>service/HelloWorld</endpoint-address-uri> | |
| <message-security-binding auth-layer="SOAP"> | |
| <message-security> | |
| <message> | |
| <java-method> | |
| <method-name>ejbCreate</method-name> | |
| </java-method> | |
| </message> | |
| <message> | |
| <java-method> | |
| <method-name>sayHello</method-name> | |
| </java-method> | |
| </message> | |
| <request-protection auth-source="content" /> | |
| <response-protection auth-source="content"/> | |
| </message-security> | |
| </message-security-binding> | |
| </webservice-endpoint> | |
| </ejb> | |
| </enterprise-beans> | |
| </glassfish-ejb-jar> | |
| ---- | |
| 3. Compile, deploy, and run the application as described in | |
| link:#beack[To Run the Sample Application]. | |
| [[beaci]][[GSDVG00377]][[understanding-and-running-the-sample-application]] | |
| Understanding and Running the Sample Application | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| This section discusses the WSS sample application. This sample | |
| application is installed on your system only if you installed the J2EE | |
| 1.4 samples. If you have not installed these samples, see link:#beacj[To | |
| Set Up the Sample Application]. | |
| The objective of this sample application is to demonstrate how a web | |
| service can be secured with WSS. The web service in the `xms` example is | |
| a simple web service implemented using a Java EE EJB endpoint and a web | |
| service endpoint implemented using a servlet. In this example, a service | |
| endpoint interface is defined with one operation, `sayHello`, which | |
| takes a string then sends a response with `Hello` prefixed to the given | |
| string. You can view the WSDL file for the service endpoint interface at | |
| app-dir`/xms-ejb/src/``conf/HelloWorld.wsdl`, where app-dir is defined | |
| in link:#beacj[To Set Up the Sample Application]. | |
| In this application, the client looks up the service using the JNDI name | |
| `java:comp/env/service/HelloWorld` and gets the port information using a | |
| static stub to invoke the operation using a given name. For the name | |
| Duke, the client gets the response `Hello Duke!` | |
| This example shows how to use message security for web services at the | |
| GlassFish Server level. For information about using message security at | |
| the application level, see link:#beacf[Application-Specific Message | |
| Protection]. The WSS message security mechanisms implement message-level | |
| authentication (for example, XML digital signature and encryption) of | |
| SOAP web services invocations using the X.509 and username/password | |
| profiles of the OASIS WS-Security standard, which can be viewed from the | |
| following URL: | |
| `http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf`. | |
| The following topics are addressed here: | |
| * link:#beacj[To Set Up the Sample Application] | |
| * link:#beack[To Run the Sample Application] | |
| [[beacj]][[GSDVG00054]][[to-set-up-the-sample-application]] | |
| To Set Up the Sample Application | |
| ++++++++++++++++++++++++++++++++ | |
| [[GSDVG535]] | |
| Before You Begin | |
| To have access to this sample application, you must have previously | |
| installed the J2EE 1.4 samples. If the samples are not installed, follow | |
| the steps in the following section. | |
| After you follow these steps, the sample application is located in the | |
| directory | |
| as-install`/j2ee14-samples/samples/webservices/security/ejb/apps/xms/` | |
| or in a directory of your choice. For easy reference throughout the rest | |
| of this section, this directory is referred to as simply app-dir. | |
| 1. Go to the | |
| http://www.oracle.com/technetwork/java/javaee/download-141771.html[J2EE | |
| 1.4 download URL] | |
| (`http://www.oracle.com/technetwork/java/javaee/download-141771.html`) | |
| in your browser. | |
| 2. Click on the Download button for the Samples Bundle. | |
| 3. Click on Accept License Agreement. | |
| 4. Click on the J2EE SDK Samples link. | |
| 5. Choose a location for the `j2eesdk-1_4_03-samples.zip` file. + | |
| Saving the file to as-install is recommended. | |
| 6. Unzip the file. + | |
| Unzipping to the as-install`/j2ee14-samples` directory is recommended. | |
| For example, you can use the following command. + | |
| [source,oac_no_warn] | |
| ---- | |
| unzip j2eesdk-1_4_03-samples.zip -d j2ee14-samples | |
| ---- | |
| [[beack]][[GSDVG00055]][[to-run-the-sample-application]] | |
| To Run the Sample Application | |
| +++++++++++++++++++++++++++++ | |
| 1. Make sure that the GlassFish Server is running. + | |
| Message security providers are set up when the Ant targets are run, so | |
| you do not need to configure these on the GlassFish Server prior to | |
| running this example. | |
| 2. If you are not running HTTP on the default port of 8080, change the | |
| WSDL file for the example to reflect the change, and change the | |
| `common.properties` file to reflect the change as well. + | |
| The WSDL file for this example is located at | |
| app-dir`/xms-ejb/``src/conf/HelloWorld.wsdl`. The port number is in the | |
| following section: + | |
| [source,oac_no_warn] | |
| ---- | |
| <service name="HelloWorld"> | |
| <port name="HelloIFPort" binding="tns:HelloIFBinding"> | |
| <soap:address location="http://localhost:8080/service/HelloWorld"/> | |
| </port> | |
| </service> | |
| ---- | |
| Verify that the properties in the as-install`/samples/common.properties` | |
| file are set properly for your installation and environment. If you need | |
| a more detailed description of this file, refer to the "Configuration" | |
| section for the web services security applications at | |
| as-install`/j2ee14-samples/samples/webservices/security/docs/common.html#Logging`. | |
| 3. Change to the app-dir directory. | |
| 4. Run the following Ant targets to compile, deploy, and run the | |
| example application: | |
| 1. To compile samples: + | |
| `ant` | |
| 2. To deploy samples: + | |
| `ant deploy` | |
| 3. To run samples: + | |
| `ant run` + | |
| If the sample has compiled and deployed properly, you see the following | |
| response on your screen after the application has run: + | |
| `run:[echo] Running the xms program:[exec] Established message level security : Hello Duke!` | |
| 5. To undeploy the sample, run the following Ant target: + | |
| [source,oac_no_warn] | |
| ---- | |
| ant undeploy | |
| ---- | |
| All of the web services security examples use the same web service name | |
| (`HelloWorld`) and web service ports. These examples show only the | |
| differences necessary for protecting web services using various | |
| mechanisms. Make sure to undeploy an application when you have completed | |
| running it. If you do not, you receive an `Already in Use` error and | |
| deployment failures when you try to deploy another web services example | |
| application. | |
| [[beacm]][[GSDVG00123]][[programmatic-login-using-the-programmaticlogin-class]] | |
| Programmatic Login Using the ProgrammaticLogin Class | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| Programmatic login allows a deployed Java EE application or module to | |
| invoke a login method. If the login is successful, a `SecurityContext` | |
| is established as if the client had authenticated using any of the | |
| conventional Java EE mechanisms. Programmatic login is supported for | |
| servlet and EJB components on the server side, and for stand-alone or | |
| application clients on the client side. Programmatic login is useful for | |
| an application having special needs that cannot be accommodated by any | |
| of the Java EE standard authentication mechanisms. | |
| This section describes a proprietary GlassFish mechanism, but see also | |
| the standard security APIs in the Java EE tutorial. | |
| [NOTE] | |
| ======================================================================= | |
| The `com.sun.appserv.security.ProgrammaticLogin` class in GlassFish | |
| Server is not a Java EE API; therefore, it is not portable to other | |
| application servers. | |
| ======================================================================= | |
| The following topics are addressed here: | |
| * link:#beacn[Programmatic Login Precautions] | |
| * link:#beaco[Granting Programmatic Login Permission] | |
| * link:#beacp[The `ProgrammaticLogin` Class] | |
| [[beacn]][[GSDVG00378]][[programmatic-login-precautions]] | |
| Programmatic Login Precautions | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The GlassFish Server is not involved in how the login information | |
| (`user`, `password`) is obtained by the deployed application. | |
| Programmatic login places the burden on the application developer with | |
| respect to assuring that the resulting system meets security | |
| requirements. If the application code reads the authentication | |
| information across the network, the application determines whether to | |
| trust the user. | |
| Programmatic login allows the application developer to bypass the | |
| GlassFish Server-supported authentication mechanisms and feed | |
| authentication data directly to the security service. While flexible, | |
| this capability should not be used without some understanding of | |
| security issues. | |
| Since this mechanism bypasses the container-managed authentication | |
| process and sequence, the application developer must be very careful in | |
| making sure that authentication is established before accessing any | |
| restricted resources or methods. It is also the application developer's | |
| responsibility to verify the status of the login attempt and to alter | |
| the behavior of the application accordingly. | |
| The programmatic login state does not necessarily persist in sessions or | |
| participate in single sign-on. | |
| Lazy authentication is not supported for programmatic login. If an | |
| access check is reached and the deployed application has not properly | |
| authenticated using the programmatic login method, access is denied | |
| immediately and the application might fail if not coded to account for | |
| this occurrence. One way to account for this occurrence is to catch the | |
| access control or security exception, perform a programmatic login, and | |
| repeat the request. | |
| [[beaco]][[GSDVG00379]][[granting-programmatic-login-permission]] | |
| Granting Programmatic Login Permission | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The `ProgrammaticLoginPermission` permission is required to invoke the | |
| programmatic login mechanism for an application if the security manager | |
| is enabled. For information about the security manager, see | |
| link:#beabx[The `server.policy` File]. This permission is not granted by | |
| default to deployed applications because this is not a standard Java EE | |
| mechanism. | |
| To grant the required permission to the application, add the following | |
| to the domain-dir`/config/server.policy` file: | |
| [source,oac_no_warn] | |
| ---- | |
| grant codeBase "file:jar-file-path" { | |
| permission com.sun.appserv.security.ProgrammaticLoginPermission | |
| "login"; | |
| }; | |
| ---- | |
| The jar-file-path is the path to the application's JAR file. | |
| [[beacp]][[GSDVG00380]][[the-programmaticlogin-class]] | |
| The `ProgrammaticLogin` Class | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The `com.sun.appserv.security.ProgrammaticLogin` class enables a user to | |
| perform login programmatically. | |
| For Javadoc tool pages relevant to programmatic login, see the | |
| `com.sun.appserv.security` package. | |
| The `ProgrammaticLogin` class has four `login` methods, two for servlets | |
| or JSP files and two for EJB components. | |
| The login methods for servlets or JSP files have the following | |
| signatures: | |
| [source,oac_no_warn] | |
| ---- | |
| public java.lang.Boolean login(String user, String password, | |
| javax.servlet.http.HttpServletRequest request, | |
| javax.servlet.http.HttpServletResponse response) | |
| public java.lang.Boolean login(String user, String password, | |
| String realm, javax.servlet.http.HttpServletRequest request, | |
| javax.servlet.http.HttpServletResponse response, boolean errors) | |
| throws java.lang.Exception | |
| ---- | |
| The login methods for EJB components have the following signatures: | |
| [source,oac_no_warn] | |
| ---- | |
| public java.lang.Boolean login(String user, String password) | |
| public java.lang.Boolean login(String user, String password, | |
| String realm, boolean errors) throws java.lang.Exception | |
| ---- | |
| All of these `login` methods accomplish the following: | |
| * Perform the authentication | |
| * Return `true` if login succeeded, `false` if login failed | |
| The login occurs on the realm specified unless it is null, in which case | |
| the domain's default realm is used. The methods with no realm parameter | |
| use the domain's default realm. | |
| If the errors flag is set to `true`, any exceptions encountered during | |
| the login are propagated to the caller. If set to `false`, exceptions | |
| are thrown. | |
| On the client side, realm and errors parameters are ignored and the | |
| actual login does not occur until a resource requiring a login is | |
| accessed. A `java.rmi.AccessException` with `COBRA NO_PERMISSION` occurs | |
| if the actual login fails. | |
| The logout methods for servlets or JSP files have the following | |
| signatures: | |
| [source,oac_no_warn] | |
| ---- | |
| public java.lang.Boolean logout(HttpServletRequest request, | |
| HttpServletResponse response) | |
| public java.lang.Boolean logout(HttpServletRequest request, | |
| HttpServletResponse response, boolean errors) | |
| throws java.lang.Exception | |
| ---- | |
| The logout methods for EJB components have the following signatures: | |
| [source,oac_no_warn] | |
| ---- | |
| public java.lang.Boolean logout() | |
| public java.lang.Boolean logout(boolean errors) | |
| throws java.lang.Exception | |
| ---- | |
| All of these `logout` methods return `true` if logout succeeded, `false` | |
| if logout failed. | |
| If the errors flag is set to `true`, any exceptions encountered during | |
| the logout are propagated to the caller. If set to `false`, exceptions | |
| are thrown. | |
| [[beacq]][[GSDVG00124]][[user-authentication-for-single-sign-on]] | |
| User Authentication for Single Sign-on | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| The single sign-on feature of the GlassFish Server allows multiple web | |
| applications deployed to the same virtual server to share the user | |
| authentication state. With single sign-on enabled, users who log in to | |
| one web application become implicitly logged into other web applications | |
| on the same virtual server that require the same authentication | |
| information. Otherwise, users would have to log in separately to each | |
| web application whose protected resources they tried to access. | |
| A sample application using the single sign-on scenario could be a | |
| consolidated airline booking service that searches all airlines and | |
| provides links to different airline web sites. After the user signs on | |
| to the consolidated booking service, the user information can be used by | |
| each individual airline site without requiring another sign-on. | |
| Single sign-on operates according to the following rules: | |
| * Single sign-on applies to web applications configured for the same | |
| realm and virtual server. The realm is defined by the `realm-name` | |
| element in the `web.xml` file. For information about virtual servers, | |
| see "link:../administration-guide/http_https.html#GSADG00017[Administering Internet Connectivity]" in GlassFish | |
| Server Open Source Edition Administration Guide. | |
| * As long as users access only unprotected resources in any of the web | |
| applications on a virtual server, they are not challenged to | |
| authenticate themselves. | |
| * As soon as a user accesses a protected resource in any web application | |
| associated with a virtual server, the user is challenged to authenticate | |
| himself or herself, using the login method defined for the web | |
| application currently being accessed. | |
| * After authentication, the roles associated with this user are used for | |
| access control decisions across all associated web applications, without | |
| challenging the user to authenticate to each application individually. | |
| * When the user logs out of one web application (for example, by | |
| invalidating the corresponding session), the user's sessions in all web | |
| applications are invalidated. Any subsequent attempt to access a | |
| protected resource in any application requires the user to authenticate | |
| again. | |
| The single sign-on feature utilizes HTTP cookies to transmit a token | |
| that associates each request with the saved user identity, so it can | |
| only be used in client environments that support cookies. | |
| To configure single sign-on, set the following virtual server | |
| properties: | |
| * `sso-enabled` - If `false`, single sign-on is disabled for this | |
| virtual server, and users must authenticate separately to every | |
| application on the virtual server. The default is `false`. | |
| * `sso-max-inactive-seconds` - Specifies the time after which a user's | |
| single sign-on record becomes eligible for purging if no client activity | |
| is received. Since single sign-on applies across several applications on | |
| the same virtual server, access to any of the applications keeps the | |
| single sign-on record active. The default value is 5 minutes (`300` | |
| seconds). Higher values provide longer single sign-on persistence for | |
| the users at the expense of more memory use on the server. | |
| * `sso-reap-interval-seconds` - Specifies the interval between purges of | |
| expired single sign-on records. The default value is `60`. | |
| Here are example `asadmin set` commands with default values: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set server-config.http-service.virtual-server.vsrv1.property.sso-enabled="true" | |
| asadmin set server-config.http-service.virtual-server.vsrv1.property.sso-max-inactive-seconds="300" | |
| asadmin set server-config.http-service.virtual-server.vsrv1.property.sso-reap-interval-seconds="60" | |
| ---- | |
| For more information about the `asadmin set` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| [[gizel]][[GSDVG00125]][[adding-authentication-mechanisms-to-the-servlet-container]] | |
| Adding Authentication Mechanisms to the Servlet Container | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| You can use JSR 196 in the web tier to facilitate the injection of | |
| pluggable authentication modules within the servlet constraint | |
| processing engine. The GlassFish Server includes implementations of a | |
| number of HTTP layer authentication mechanisms such as basic, form, and | |
| digest authentication. You can add alternative implementations of the | |
| included mechanisms or implementations of new mechanisms such as HTTP | |
| Negotiate/SPNEGO, OpenID, or CAS. | |
| The following topics are addressed here: | |
| * link:#BACCFGBF[The GlassFish Server and JSR-375] | |
| * link:#gizfz[The GlassFish Server and JSR 196] | |
| * link:#gizdx[Writing a Server Authentication Module] | |
| * link:#gizeb[Sample Server Authentication Module] | |
| * link:#gizfa[Compiling and Installing a Server Authentication Module] | |
| * link:#gizfe[Configuring a Server Authentication Module] | |
| * link:#gizfm[Binding a Server Authentication Module to Your | |
| Application] | |
| [[BACCFGBF]][[GSDVG564]][[the-glassfish-server-and-jsr-375]] | |
| The GlassFish Server and JSR-375 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The Glassfish Server implements JSR-375 to provide built-in support for | |
| BASIC, FORM and Custom FORM authentication mechanisms. JSR-375 also | |
| defines plug-in interfaces for authentication and identity stores, that | |
| is, the `HttpAuthenticationMechanism` interface and the `IdentityStore` | |
| interface, respectively. Though `HttpAuthenticationMechanism` | |
| implementations can authenticate users in any manner they choose, the | |
| `IdentityStore` interface provides a convenient mechanism. A significant | |
| advantage of using `HttpAuthenticationMechanism` and `IdentityStore` | |
| over the declarative mechanisms defined by the Servlet specification is | |
| that it allows an application to control the identity stores that it | |
| authenticates against, in a standard, portable way. You can use the | |
| built-in implementations of these APIs, or define custom | |
| implementations. | |
| Java EE Security API defines several annotations, with names that end | |
| with Definition, which when used makes the corresponding built-in | |
| mechanism available as a CDI bean. Java EE Security API also supports | |
| the use of Expression Language 3.0 in these annotations to allow dynamic | |
| configuration. | |
| [[GSDVG565]][[sthref9]] | |
| [[built-in-authentication-mechanisms]] | |
| Built-in Authentication Mechanisms | |
| ++++++++++++++++++++++++++++++++++ | |
| An application packages its own `HttpAuthenticationMechanism` by | |
| including in a bean archive that is a part of the application. | |
| Alternatively, it may select and configure one of the container's | |
| built-in mechanisms using the corresponding annotation, as listed below: | |
| * `BasicAuthenticationMechanismDefintion`—implements BASIC | |
| authentication that conforms to the behavior of the servlet container | |
| when BASIC <auth-method> is declared in web.xml. | |
| * `CustomFormAuthenticationMechanismDefinition`—implements FORM | |
| authentication that conforms to the behavior of the servlet container | |
| when the FORM <auth-method> is declared in web.xml. | |
| * `FormAuthenticationMechanismDefinition`—implements a modified version | |
| of FORM authentication in which custom handling replaces the POST to | |
| j_security_check. | |
| In GlassFish Server, all built-in authentication mechanisms need to be | |
| authenticated using an identity store. The `IdentityStore` interface, | |
| included in the Java EE Security API, defines an SPI for interacting | |
| with identity stores, which are directories or databases containing user | |
| account information. The `IdentityStore` interface has four methods: | |
| `validate(Credential)`, `getCallerGroups(CredentialValidationResult)`, | |
| `validationTypes()` and `priority()`.Developers can provide their own | |
| implementation of this interface, or use one of the built-in Identity | |
| Stores. The `RememberMeIdentityStore` interface, which is a variation on | |
| the IdentityStore interface, can be used when an application wants to | |
| "remember" a user's authenticated session for an extended period, so | |
| that the caller can return to the application periodically without | |
| needing to present primary authentication credentials each time. | |
| There are two built-in implementations of `IdentityStore`: an LDAP | |
| identity store, and a Database identity store. The following snippet | |
| shows the usage of `DatabaseIdentityStoreDefinition`, which makes | |
| `DatabaseIdentityStore` available as CDI bean. | |
| [source,oac_no_warn] | |
| ---- | |
| @DatabaseIdentityStoreDefinition( | |
| callerQuery = "#{'select password from caller where name = ?'}", | |
| groupsQuery = "select group_name from caller_groups where caller_name = ?", | |
| hashAlgorithm = Pbkdf2PasswordHash.class, | |
| priorityExpression = "#{100}", | |
| hashAlgorithmParameters = { | |
| "Pbkdf2PasswordHash.Iterations=3072", | |
| "${applicationConfig.dyna}" | |
| } | |
| ) | |
| ---- | |
| Since Java EE Security API provides support for Expression Langauge 3.0, | |
| regular expressions can be used to set value of annotation attributes. | |
| The GlassFish Server provides out of the box implementation of | |
| `Pbkdf2PasswordHash` that supports PBKDF2 password hashing. It is | |
| suggested that you use `Pbkdf2PasswordHash` for generating and | |
| validating passwords, unless there are specific requirements which | |
| cannot be met any other way. | |
| [[GSDVG566]][[sthref10]] | |
| [[custom-authentication-mechanism]] | |
| Custom Authentication Mechanism | |
| +++++++++++++++++++++++++++++++ | |
| An application provider can choose to provide its own custom | |
| authentication mechanism, apart from built-in authentication mechanism. | |
| A custom authentication mechanism implements the | |
| `HttpAuthenticationMechanism` interface, introduced in Java EE Security | |
| API. This interface defines the following three methods. | |
| [source,oac_no_warn] | |
| ---- | |
| AuthenticationStatus validateRequest(HttpServletRequest request, | |
| HttpServletResponse response, | |
| HttpMessageContext httpMessageContext | |
| ) throws AuthenticationException; | |
| AuthenticationStatus secureResponse(HttpServletRequest request, | |
| HttpServletResponse response, | |
| HttpMessageContext httpMessageContext | |
| ) throws AuthenticationException; | |
| void cleanSubject(HttpServletRequest request, | |
| HttpServletResponse response, | |
| HttpMessageContext httpMessageContext); | |
| ---- | |
| `HttpAuthenticationMechanism` returns `AuthenticationStatus` to indicate | |
| the status of authentication request. Internally, it gets translated to | |
| corresponding JASPIC `AuthStatus` as shown below: | |
| * `AuthenticationStatus.NOT_DONE` to `AuthStatus.SUCCESS` | |
| * `AuthenticationStatus.SEND_CONTINUE` to `AuthStatus.SEND_CONTINUE` | |
| * `AuthenticationStatus.SUCCESS` to `AuthStatus.SUCCESS` | |
| * `AuthenticationStatus.SEND_FAILURE` to `AuthStatus.SEND_FAILURE` | |
| Each method of the `HttpAuthenticationMechanism` interface performs the | |
| same function as the corresponding `ServerAuth` methods. Unlike JASPIC, | |
| `HttpAuthenticationMechanism` is specified for the servlet container | |
| only. Only the `validateRequest()` must be implemented, for other two | |
| methods, default behaviors are specified. | |
| `validateRequest` allows a caller to authenticate. The request gets | |
| inspected inside `validateRequest` to read credential or any other | |
| information, or it can write to standard response with status of the | |
| authentication request or redirect the caller to an OAuth provider. Once | |
| the credential is validated, the result of the validation is | |
| communicated to the container using the `HttpMessageContext` parameter. | |
| [[GSDVG567]] | |
| Sample Http Authentication Mechanism | |
| The class `MyAuthenticationMechanism.java` is a sample | |
| `HttpAuthenticationMechanism` implementation. Note that only | |
| `validateRequest` method has been implemented, since Java EE Security | |
| API provides default implementation of other two methods. An application | |
| provider may choose to override the default implementation depending on | |
| the requirement. | |
| [source,oac_no_warn] | |
| ---- | |
| import javax.enterprise.context.RequestScoped; | |
| import javax.inject.Inject; | |
| import javax.security.enterprise.AuthenticationException; | |
| import javax.security.enterprise.AuthenticationStatus; | |
| import javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism; | |
| import javax.security.enterprise.authentication.mechanism.http.HttpMessageContext; | |
| import javax.security.enterprise.credential.UsernamePasswordCredential; | |
| import javax.security.enterprise.identitystore.CredentialValidationResult; | |
| import javax.security.enterprise.identitystore.IdentityStoreHandler; | |
| import javax.servlet.http.HttpServletRequest; | |
| import javax.servlet.http.HttpServletResponse; | |
| import static javax.security.enterprise.identitystore.CredentialValidationResult.Status.VALID; | |
| @RequestScoped | |
| public class MyAuthenticationMechanism implements HttpAuthenticationMechanism { | |
| @Inject | |
| private IdentityStoreHandler identityStoreHandler; | |
| @Override | |
| public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext httpMessageContext) throws AuthenticationException { | |
| // Get the (caller) name and password from the request | |
| // NOTE: This is for the smallest possible example only. In practice | |
| // putting the password in a request query parameter is highly | |
| // insecure and is discouraged. | |
| String name = request.getParameter("name"); | |
| String password = request.getParameter("password"); | |
| if (name != null && password != null) { | |
| // Delegate the {credentials in -> identity data out} function to | |
| // the Identity Store | |
| CredentialValidationResult result = identityStoreHandler.validate( | |
| new UsernamePasswordCredential(name, password)); | |
| if (result.getStatus() == VALID) { | |
| // Communicate the details of the authenticated user to the | |
| // container. | |
| response.addHeader("Authentication Mechanism", "MyAuthenticationMechanism"); | |
| return httpMessageContext.notifyContainerAboutLogin( | |
| result.getCallerPrincipal(), result.getCallerGroups()); | |
| } else { | |
| return httpMessageContext.responseUnauthorized(); | |
| } | |
| } | |
| return httpMessageContext.doNothing(); | |
| } | |
| } | |
| ---- | |
| [[gizfz]][[GSDVG00381]][[the-glassfish-server-and-jsr-196]] | |
| The GlassFish Server and JSR 196 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The GlassFish Server implements the Servlet Container Profile of JSR | |
| 196, Java Authentication Service Provider Interface for Containers. JSR | |
| 196 defines a standard service provider interface (SPI) that extends the | |
| concepts of the Java Authentication and Authorization Service (JAAS) to | |
| enable pluggability of message authentication modules in message | |
| processing runtimes. The JSR 196 standard defines profiles that | |
| establish contracts for the use of the SPI in specific contexts. The | |
| Servlet Container Profile of JSR 196 defines the use of the SPI by a | |
| Servlet container such that: | |
| * The resulting container can be configured with new authentication | |
| mechanisms. | |
| * The container employs the configured mechanisms in its enforcement of | |
| the declarative servlet security model (declared in a `web.xml` file | |
| using `security-constraint` elements). | |
| The JSR 196 specification defines a simple message processing model | |
| composed of four interaction points: | |
| 1. `secureRequest` on the client | |
| 2. `validateRequest` on the server | |
| 3. `secureResponse` on the server | |
| 4. `validateResponse` on the client | |
| A message processing runtime uses the SPI at these interaction points to | |
| delegate the corresponding message security processing to authentication | |
| providers, also called authentication modules, integrated into the | |
| runtime by way of the SPI. | |
| A compatible server-side message processing runtime, such as the | |
| GlassFish Server servlet container, supports the `validateRequest` and | |
| `secureResponse` interaction points of the message processing model. The | |
| servlet container uses the SPI at these interaction points to delegate | |
| the corresponding message security processing to a server authentication | |
| module (SAM), integrated by the SPI into the container. | |
| [[gizdx]][[GSDVG00382]][[writing-a-server-authentication-module]] | |
| Writing a Server Authentication Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| A key step in adding an authentication mechanism to a compatible | |
| server-side message processing runtime such as the GlassFish Server | |
| servlet container is acquiring a SAM that implements the desired | |
| authentication mechanism. One way to do that is to write the SAM | |
| yourself. | |
| A SAM implements the javax.security.auth.message.module.ServerAuthModule | |
| interface as defined by JSR 196. A SAM is invoked indirectly by the | |
| message processing runtime at the `validateRequest` and `secureResponse` | |
| interaction points. A SAM must implement the five methods of the | |
| ServerAuthModule interface: | |
| * `getSupportedMessageTypes` — An array of `Class` objects where each | |
| element defines a message type supported by the SAM. For a SAM to be | |
| compatible with the Servlet Container Profile, the returned array must | |
| include the `HttpServletRequest.class` and `HttpServletResponse.class` | |
| objects. | |
| * `initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler Map options)` | |
| — The container calls this method to provide the SAM with configuration | |
| values and with a `CallbackHandler`. The configuration values are | |
| returned in the policy arguments and in the options `Map`. The SAM uses | |
| `CallbackHandler` to access services, such as password validation, | |
| provided by the container. | |
| * `AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)` | |
| — The container calls this method to process each received | |
| `HttpServletRequest`. The request and its associated | |
| `HttpServletResponse` are passed by the container to the SAM in the | |
| `messageInfo` argument. The SAM processes the request and may establish | |
| the response to be returned by the container. The SAM uses the provided | |
| `Subject` arguments to convey its authentication results. The SAM | |
| returns different status values to control the container's invocation | |
| processing. The status values and the circumstances under which they are | |
| returned are as follows: | |
| ** `AuthStatus.SUCCESS` is returned when the application request message | |
| is successfully validated. The container responds to this status value | |
| by using the returned client `Subject` to invoke the target of the | |
| request. When this value is returned, the SAM (provided a custom | |
| `AuthConfigProvider` is not being used) must use its `CallbackHandler` | |
| to handle a `CallerPrincipalCallback` using the `clientSubject` as an | |
| argument to the callback. | |
| ** `AuthStatus.SEND_CONTINUE` indicates that message validation is | |
| incomplete and that the SAM has established a preliminary response as | |
| the response message in `messageInfo`. The container responds to this | |
| status value by sending the response to the client. | |
| ** `AuthStatus.SEND_FAILURE` indicates that message validation failed | |
| and that the SAM has established an appropriate failure response message | |
| in `messageInfo`. The container responds to this status value by sending | |
| the response to the client. | |
| ** `AuthStatus.SEND_SUCCESS` is not typically returned. This status | |
| value indicates the end of a multi-message security dialog originating | |
| after the service interaction and during the processing of the | |
| application response. The container responds to this status value by | |
| sending the response to the client. + | |
| The `validateRequest` method may also throw an `AuthException` to | |
| indicate that the message processing by the SAM failed without | |
| establishing a failure response message in `messageInfo`. | |
| * `secureResponse(MessageInfo messageInfo, Subject serviceSubject)` — | |
| The container calls this method before sending a response, resulting | |
| from an application invocation, to the client. The response is passed to | |
| the SAM in the `messageInfo` argument. In most cases, this method should | |
| just return the `SEND_SUCCESS` status. | |
| * `cleanSubject(MessageInfo messageInfo, Subject subject)` — This method | |
| removes the mechanism-specific principals, credentials, or both from the | |
| subject. This method is not currently called by the container. A | |
| legitimate implementation could remove all the principals from the | |
| argument subject. | |
| See the Servlet Container Profile section in the JSR 196 specification | |
| for additional background and details. | |
| [[gizeb]][[GSDVG00383]][[sample-server-authentication-module]] | |
| Sample Server Authentication Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The class `MySam.java` is a sample SAM implementation. Notice that the | |
| sample implements the five methods of the ServerAuthModule interface. | |
| This SAM implements an approximation of HTTP basic authentication. | |
| [source,oac_no_warn] | |
| ---- | |
| package tip.sam; | |
| import java.io.IOException; | |
| import java.util.Map; | |
| import javax.security.auth.Subject; | |
| import javax.security.auth.callback.Callback; | |
| import javax.security.auth.callback.CallbackHandler; | |
| import javax.security.auth.callback.UnsupportedCallbackException; | |
| import javax.security.auth.message.AuthException; | |
| import javax.security.auth.message.AuthStatus; | |
| import javax.security.auth.message.MessageInfo; | |
| import javax.security.auth.message.MessagePolicy; | |
| import javax.security.auth.message.callback.CallerPrincipalCallback; | |
| import javax.security.auth.message.callback.GroupPrincipalCallback; | |
| import javax.security.auth.message.callback.PasswordValidationCallback; | |
| import javax.security.auth.message.module.ServerAuthModule; | |
| import javax.servlet.http.HttpServletRequest; | |
| import javax.servlet.http.HttpServletResponse; | |
| import org.apache.catalina.util.Base64; | |
| public class MySam implements ServerAuthModule { | |
| protected static final Class[] | |
| supportedMessageTypes = new Class[]{ | |
| HttpServletRequest.class, | |
| HttpServletResponse.class | |
| }; | |
| private MessagePolicy requestPolicy; | |
| private MessagePolicy responsePolicy; | |
| private CallbackHandler handler; | |
| private Map options; | |
| private String realmName = null; | |
| private String defaultGroup[] = null; | |
| privte static final String REALM_PROPERTY_NAME = | |
| "realm.name"; | |
| private static final String GROUP_PROPERTY_NAME = | |
| "group.name"; | |
| private static final String BASIC = "Basic"; | |
| static final String AUTHORIZATION_HEADER = | |
| "authorization"; | |
| static final String AUTHENTICATION_HEADER = | |
| "WWW-Authenticate"; | |
| public void initialize(MessagePolicy reqPolicy, | |
| MessagePolicy resPolicy, | |
| CallbackHandler cBH, Map opts) | |
| throws AuthException { | |
| requestPolicy = reqPolicy; | |
| responsePolicy = resPolicy; | |
| handler = cBH; | |
| options = opts; | |
| if (options != null) { | |
| realmName = (String) | |
| options.get(REALM_PROPERTY_NAME); | |
| if (options.containsKey(GROUP_PROPERTY_NAME)) { | |
| defaultGroup = new String[]{(String) | |
| options.get(GROUP_PROPERTY_NAME)}; | |
| } | |
| } | |
| } | |
| public Class[] getSupportedMessageTypes() { | |
| return supportedMessageTypes; | |
| } | |
| public AuthStatus validateRequest( | |
| MessageInfo msgInfo, Subject client, | |
| Subject server) throws AuthException { | |
| try { | |
| String username = | |
| processAuthorizationToken(msgInfo, client); | |
| if (username == | |
| null && requestPolicy.isMandatory()) { | |
| return sendAuthenticateChallenge(msgInfo); | |
| } | |
| setAuthenticationResult( | |
| username, client, msgInfo); | |
| return AuthStatus.SUCCESS; | |
| } catch (Exception e) { | |
| AuthException ae = new AuthException(); | |
| ae.initCause(e); | |
| throw ae; | |
| } | |
| } | |
| private String processAuthorizationToken( | |
| MessageInfo msgInfo, Subject s) | |
| throws AuthException { | |
| HttpServletRequest request = | |
| (HttpServletRequest) | |
| msgInfo.getRequestMessage(); | |
| String token = | |
| request.getHeader(AUTHORIZATION_HEADER); | |
| if (token != null && token.startsWith(BASIC + " ")) { | |
| token = token.substring(6).trim(); | |
| // Decode and parse the authorization token | |
| String decoded = | |
| new String(Base64.decode(token.getBytes())); | |
| int colon = decoded.indexOf(':'); | |
| if (colon <= 0 || colon == decoded.length() - 1) { | |
| return (null); | |
| } | |
| String username = decoded.substring(0, colon); | |
| // use the callback to ask the container to | |
| // validate the password | |
| PasswordValidationCallback pVC = | |
| new PasswordValidationCallback(s, username, | |
| decoded.substring(colon + 1).toCharArray()); | |
| try { | |
| handler.handle(new Callback[]{pVC}); | |
| pVC.clearPassword(); | |
| } catch (Exception e) { | |
| AuthException ae = new AuthException(); | |
| ae.initCause(e); | |
| throw ae; | |
| } | |
| if (pVC.getResult()) { | |
| return username; | |
| } | |
| } | |
| return null; | |
| } | |
| private AuthStatus sendAuthenticateChallenge( | |
| MessageInfo msgInfo) { | |
| String realm = realmName; | |
| // if the realm property is set use it, | |
| // otherwise use the name of the server | |
| // as the realm name. | |
| if (realm == null) { | |
| HttpServletRequest request = | |
| (HttpServletRequest) | |
| msgInfo.getRequestMessage(); | |
| realm = request.getServerName(); | |
| } | |
| HttpServletResponse response = | |
| (HttpServletResponse) | |
| msgInfo.getResponseMessage(); | |
| String header = BASIC + " realm=\"" + realm + "\""; | |
| response.setHeader(AUTHENTICATION_HEADER, header); | |
| response.setStatus( | |
| HttpServletResponse.SC_UNAUTHORIZED); | |
| return AuthStatus.SEND_CONTINUE; | |
| } | |
| public AuthStatus secureResponse( | |
| MessageInfo msgInfo, Subject service) | |
| throws AuthException { | |
| return AuthStatus.SEND_SUCCESS; | |
| } | |
| public void cleanSubject(MessageInfo msgInfo, | |
| Subject subject) | |
| throws AuthException { | |
| if (subject != null) { | |
| subject.getPrincipals().clear(); | |
| } | |
| } | |
| private static final String AUTH_TYPE_INFO_KEY = | |
| "javax.servlet.http.authType"; | |
| // distinguish the caller principal | |
| // and assign default groups | |
| private void setAuthenticationResult(String name, | |
| Subject s, MessageInfo m) | |
| throws IOException, | |
| UnsupportedCallbackException { | |
| handler.handle(new Callback[]{ | |
| new CallerPrincipalCallback(s, name) | |
| }); | |
| if (name != null) { | |
| // add the default group if the property is set | |
| if (defaultGroup != null) { | |
| handler.handle(new Callback[]{ | |
| new GroupPrincipalCallback(s, defaultGroup) | |
| }); | |
| } | |
| m.getMap().put(AUTH_TYPE_INFO_KEY, ""MySAM"); | |
| } | |
| } | |
| } | |
| ---- | |
| Note that the `initialize` method looks for the `group.name` and | |
| `realm.name` properties. The `group.name` property configures the | |
| default group assigned as a result of any successful authentication. The | |
| `realm.name` property defines the realm value sent back to the browser | |
| in the `WWW-Authenticate` challenge. | |
| [[gizfa]][[GSDVG00384]][[compiling-and-installing-a-server-authentication-module]] | |
| Compiling and Installing a Server Authentication Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Before you can use the sample SAM, you need to compile, install, and | |
| configure it. Then you can bind it to an application. | |
| To compile the SAM, include the SPI in your classpath. When the | |
| GlassFish Server is installed, the JAR file containing the SPI, | |
| `jmac-api.jar`, is installed in the as-install`/lib` directory. After | |
| you compile the SAM, install it by copying a JAR file containing the | |
| compiled SAM to the as-install`/lib` directory. | |
| [[gizfe]][[GSDVG00385]][[configuring-a-server-authentication-module]] | |
| Configuring a Server Authentication Module | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| You can configure a SAM in one of these ways: | |
| * In the Administration Console, open the Security component under the | |
| relevant configuration and go to the Message Security page. Set the | |
| following options: | |
| ** Authentication Layer — `HttpServlet` | |
| ** Provider Type — `server` or `client-server` | |
| ** Provider ID — Specify a unique name for the SAM, for example `MySAM` | |
| ** Class Name — Specify the fully qualified class name, for example | |
| `tip.sam.MySam` | |
| ** Additional Property — Name: `group-name` Value: `user` | |
| ** Additional Property — Name: `realm-name` Value: `Sam` + | |
| For details, click the Help button in the Administration Console. | |
| * Use the `asadmin create-message-security-provider` command to | |
| configure a SAM. Set the following options: | |
| ** `--layer HttpServlet` | |
| ** `--providertype server` or `--providertype client-server` | |
| ** `--classname tip.sam.MySam` | |
| ** `--property group-name=user:realm-name=Sam` | |
| ** Provider name operand — Specify a unique name for the SAM, for | |
| example `MySAM` + | |
| For details, see the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition | |
| Reference Manual]. | |
| [[gizfm]][[GSDVG00386]][[binding-a-server-authentication-module-to-your-application]] | |
| Binding a Server Authentication Module to Your Application | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| After you install and configure the SAM, you can bind it for use by the | |
| container on behalf of one or more of your applications. You have two | |
| options in how you bind the SAM, depending on whether you are willing to | |
| repackage and redeploy your application: | |
| * If you are willing to repackage and redeploy, you can bind the SAM | |
| using the `glassfish-web.xml` file. Set the value of the | |
| `httpservlet-security-provider` attribute of the `glassfish-web-app` | |
| element to the SAM's configured provider ID, for example, `MySAM`. For | |
| more information about the `glassfish-web.xml` file, see the | |
| link:../application-deployment-guide/toc.html#GSDPG[GlassFish Server Open Source Edition Application Deployment | |
| Guide]. This option leverages the native `AuthConfigProvider` | |
| implementation that ships with the GlassFish Server. | |
| * Another approach is to develop your own `AuthConfigProvider` and | |
| register it with the GlassFish Server `AuthConfigFactory` for use on | |
| behalf of your applications. For example, a simple `AuthConfigProvider` | |
| can obtain, through its initialization properties, the classname of a | |
| SAM to configure on behalf of the applications for which the provider is | |
| registered. You can find a description of the functionality of an | |
| `AuthConfigProvider` and of the registration facilities provided by an | |
| `AuthConfigFactory` in the JSR 196 specification. | |