75 lines
3.6 KiB
Text
75 lines
3.6 KiB
Text
|
|
[[_fuse_adapter_servlet_whiteboard]]
|
|
===== Securing a Servlet Deployed as an OSGI Service
|
|
|
|
You can use this method if you have a servlet class inside your OSGI bundled project that is not deployed as a classic WAR application. Fuse uses https://ops4j1.jira.com/wiki/display/ops4j/Pax+Web+Extender+-+Whiteboard[Pax Web Whiteboard Extender] to deploy such servlets as web applications.
|
|
|
|
To secure your servlet with {{book.project.name}}, complete the following steps:
|
|
|
|
. {{book.project.name}} provides PaxWebIntegrationService, which allows injecting jetty-web.xml and configuring security constraints for your application. You need to declare such services in the `OSGI-INF/blueprint/blueprint.xml` file inside your application. Note that your servlet needs to depend on it.
|
|
An example configuration:
|
|
+
|
|
[source,xml]
|
|
----
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
|
|
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
|
|
|
|
<!-- Using jetty bean just for the compatibility with other fuse services -->
|
|
<bean id="servletConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
|
|
<property name="constraint">
|
|
<bean class="org.eclipse.jetty.util.security.Constraint">
|
|
<property name="name" value="cst1"/>
|
|
<property name="roles">
|
|
<list>
|
|
<value>user</value>
|
|
</list>
|
|
</property>
|
|
<property name="authenticate" value="true"/>
|
|
<property name="dataConstraint" value="0"/>
|
|
</bean>
|
|
</property>
|
|
<property name="pathSpec" value="/product-portal/*"/>
|
|
</bean>
|
|
|
|
<bean id="keycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.PaxWebIntegrationService"
|
|
init-method="start" destroy-method="stop">
|
|
<property name="jettyWebXmlLocation" value="/WEB-INF/jetty-web.xml" />
|
|
<property name="bundleContext" ref="blueprintBundleContext" />
|
|
<property name="constraintMappings">
|
|
<list>
|
|
<ref component-id="servletConstraintMapping" />
|
|
</list>
|
|
</property>
|
|
</bean>
|
|
|
|
<bean id="productServlet" class="org.keycloak.example.ProductPortalServlet" depends-on="keycloakPaxWebIntegration">
|
|
</bean>
|
|
|
|
<service ref="productServlet" interface="javax.servlet.Servlet">
|
|
<service-properties>
|
|
<entry key="alias" value="/product-portal" />
|
|
<entry key="servlet-name" value="ProductServlet" />
|
|
<entry key="keycloak.config.file" value="/keycloak.json" />
|
|
</service-properties>
|
|
</service>
|
|
|
|
</blueprint>
|
|
----
|
|
|
|
* You might need to have the `WEB-INF` directory inside your project (even if your project is not a web application) and create the `/WEB-INF/jetty-web.xml` and `/WEB-INF/keycloak.json` files as in the <<fake/../classic-war.adoc#_fuse_adapter_classic_war,Classic WAR application>> section.
|
|
Note you don't need the `web.xml` file as the security-constraints are declared in the blueprint configuration file.
|
|
|
|
. The `Import-Package` in `META-INF/MANIFEST.MF` must contain at least these imports:
|
|
+
|
|
[source, subs="attributes"]
|
|
----
|
|
org.keycloak.adapters.jetty;version="{{book.project.versionMvn}}",
|
|
org.keycloak.adapters;version="{{book.project.versionMvn}}",
|
|
org.keycloak.constants;version="{{book.project.versionMvn}}",
|
|
org.keycloak.util;version="{{book.project.versionMvn}}",
|
|
org.keycloak.*;version="{{book.project.versionMvn}}",
|
|
*;resolution:=optional
|
|
----
|