I was going to suggest that you might be experiencing a docker issue
because the ext folder works; You beat me to it.

I'm not sure if this is what you're after, but
org.apache.knox.gateway.security.SubjectUtils might be of use to you for
identifying the currently logged-in principal.

On Fri, Mar 15, 2019 at 11:53 AM Matteo Alessandroni <[email protected]>
wrote:

> Ok I think I found the issue:
> I had to restart the full Docker container to actually restart Knox.
> So I did that and it seems it's getting my class in "ext/" now.
>
> The error I get now is:
>
> Caused by: org.apache.knox.gateway.config.ConfigurationException: Failed
> to find configuration for provider as provider of
> org.apache.knox.gateway.dispatch.MyCustomDispatch via
> org.apache.knox.gateway.config.FilterConfigurationAdapter
>
> so I guess it's a problem with my class code.
> Is there a very simple code snippet I could use for my custom dispatch in
> order to access the "request" object in order to get the name of the user
> that is currently logged?
>
> Regards,
> Matteo
>
>
> On 15/03/19 15:49, Matteo Alessandroni wrote:
>
> Thanks!
> I checked that too, my ".jar" has the same permissions of the other files
> in "lib/" folder (e.g. "gateway-shell-1.2.0.jar").
> I see your point about the script [1], but I also see that the original
> gateway.sh (for Knox v1.2.0) [2] is not doing anything special for the
> "ext/" folder, or am I wrong?
>
> Regards,
> Matteo
>
>
> [1]
> https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh
> [2]
> https://github.com/apache/knox/blob/v1.2.0/gateway-release/home/bin/gateway.sh
>
>
> On 15/03/19 15:27, Sandeep Moré wrote:
>
> Ah, i missed the launcher.cfg, I see,
> https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh 
> does
> not take into account a lot of environmental variables and new stuff that
> is included in the
> https://github.com/apache/knox/blob/master/gateway-release/home/bin/gateway.sh
> that script is due for an update.
>
> The only other thing I can think of are the file permissions, make sure
> that your file can be read by knox.
>
> Best,
> Sandeep
>
>
>
> On Fri, Mar 15, 2019 at 10:09 AM Matteo Alessandroni <[email protected]>
> wrote:
>
>> Hi,
>>
>> I tried also the "lib/" folder, but same problem.
>> About the configuration for classpath yes it should be correct because I
>> have the "bin/gateway.cfg" file containing:
>>
>> #Created from
>> jar:file:/knox-runtime/bin/gateway.jar!/META-INF/launcher.cfg
>> #Thu Mar 14 10:10:31 GMT 2019
>> GATEWAY_HOME=${launcher.dir}/..
>> log4j.configuration=${GATEWAY_HOME}/conf/${launcher.name
>> }-log4j.properties
>> main.class=org.apache.knox.gateway.GatewayServer
>> class.path=../conf;../lib/*.jar;../dep/*.jar;../ext;../ext/*.jar
>>
>> so it should load the ".jar" files in those folders.
>>
>> Is there anything I can do to debug this?
>> FYI I'm using this Docker image [1] to run Knox and after adding files
>> to "ext/" or "lib/" I use this script [2] to restart Knox and it seems to
>> restart well, but still not seeing my classes in classpath.
>>
>> Thanks
>>
>>
>> [1] https://github.com/moresandeep/knox-dev-docker
>> [2]
>> https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh
>>
>>
>> On 15/03/19 14:56, Sandeep Moré wrote:
>>
>> It should have picked it up, going through the gateway.sh file, I don't
>> see any place where ext folder is added to class path, can you open a BUG
>> for this ?
>>
>> as a workaround for this you can copy your jar into the lib folder and
>> Knox should pick it up on the startup.
>>
>> Hopefully, this should help !
>>
>> Best,
>> Sandepe
>>
>>
>> On Fri, Mar 15, 2019 at 5:37 AM Matteo Alessandroni <[email protected]>
>> wrote:
>>
>>> Hi Sandeep,
>>>
>>> thank you for your answer!
>>> Ok so I tried to change my project and adding a simple class like this:
>>>
>>> package com.test.ext;
>>>
>>> import java.io.IOException;
>>> import java.net.URI;
>>> import java.net.URISyntaxException;
>>> import javax.servlet.http.HttpServletRequest;
>>> import javax.servlet.http.HttpServletResponse;
>>> import org.apache.knox.gateway.config.Configure;
>>> import org.apache.knox.gateway.config.Default;
>>> import org.apache.knox.gateway.dispatch.AbstractGatewayDispatch;
>>> import org.slf4j.Logger;
>>> import org.slf4j.LoggerFactory;
>>>
>>> public class MyDispatch extends AbstractGatewayDispatch {
>>>
>>>     private static final Logger LOG =
>>> LoggerFactory.getLogger(MyDispatch.class);
>>>
>>>     @Override
>>>     public void destroy() {
>>>         LOG.debug("******* destroy()");
>>>     }
>>>
>>>     @Configure
>>>     protected void customMethod(@Default("Test") String test) {
>>>         LOG.debug("******* @Configure customMethod(): {}", test);
>>>     }
>>>
>>>     @Override
>>>     public void doGet(URI url, HttpServletRequest request,
>>> HttpServletResponse response)
>>>             throws IOException, URISyntaxException {
>>>
>>>         LOG.debug("******* doGet() request: {}, {}",
>>> request.getMethod(), new URI(request.getRequestURI()));
>>>
>>>         super.doGet(url, request, response);
>>>     }
>>>
>>> }
>>>
>>> made the ".jar" and put in the "ext" folder.
>>> Executed the REST request again:
>>>
>>> curl -i -k -u admin:admin-password -X GET '
>>> https://localhost:8443/gateway/sandbox/webhdfs/v1/?op=LISTSTATUS'
>>>
>>> and I expected to see some logs, e.g. from the "doGet()" method (I'm not
>>> sure about the "@Configure" method, when should a method with that
>>> annotation be executed?), but it seems it does not see the class.
>>> So I tried to configure my topology to use the dispatch (as written on
>>> [1]):
>>>
>>> <service>
>>>     <role>WEBHDFS</role>
>>>     <url>http://hadoop-namenode:50070/webhdfs</url>
>>>
>>>     <dispatch>
>>>         <classname>com.test.ext.MyDispatch</classname>
>>>         <use-two-way-ssl>false</use-two-way-ssl>
>>>     </dispatch>
>>> </service>
>>>
>>> and after saving logs say:
>>>
>>> ERROR knox.gateway (GatewayFilter.java:doFilter(170)) - Gateway
>>> processing failed: javax.servlet.ServletException:
>>> org.apache.shiro.subject.ExecutionException:
>>> java.security.PrivilegedActionException: javax.servlet.ServletException:
>>> javax.servlet.ServletException: java.lang.ClassNotFoundException:
>>> com.test.ext.MyDispatch
>>> javax.servlet.ServletException:
>>> org.apache.shiro.subject.ExecutionException:
>>> java.security.PrivilegedActionException: javax.servlet.ServletException:
>>> javax.servlet.ServletException: *java.lang.ClassNotFoundException:
>>> com.test.ext.MyDispatch*
>>>
>>> so it's not seeing my class.
>>> What am I missing?
>>>
>>> Thank you!
>>>
>>> Matteo
>>>
>>>
>>> [1] https://knox.apache.org/books/knox-1-3-0/dev-guide.html#service.xml
>>>
>>>
>>> On 14/03/19 20:47, Sandeep Moré wrote:
>>>
>>> Hello Matteo,
>>>
>>> I don't think this is a right way to add filters to Knox, if you want to
>>> add some custom logic between your Knox and the backend you can  write
>>> custom dispatch [1]
>>> you can add this new jar in the ext folder and it should be picked up by
>>> Knox on start-up.
>>>
>>> [1]
>>> https://knox.apache.org/books/knox-1-3-0/dev-guide.html#Custom+Dispatch+Dependency+Injection
>>>
>>>
>>> On Thu, Mar 14, 2019 at 12:52 PM Matteo Alessandroni <
>>> [email protected]> wrote:
>>>
>>>> Hi,
>>>>
>>>> I'm trying to add a filter on a Knox instance so that I'll be able to
>>>> add a custom logic to (every / specific) REST requests to Knox.
>>>> I thought to use the "Class Path" feature [1], so I created a Maven
>>>> Java project, generated a ".jar" file and placed it in the "
>>>> $GATEWAY_HOME/ext" folder
>>>> Then, I thought it was necessary to link my custom class [2] on the
>>>> "gateway.xml" files of the resources I wanted, e.g.
>>>>
>>>> ./data/deployments/sandbox.topo.16977ef2478/%2F/WEB-INF/gateway.xml
>>>>
>>>> added:
>>>>
>>>> <filter>
>>>>     <role>rewrite</role>
>>>>     <name>url-rewrite</name>
>>>>     <class>com.test.knox.MyUrlRewriteServletFilter</class>
>>>> </filter>
>>>>
>>>> then I made a REST request to Knox:
>>>>
>>>> curl -i -k -u admin:admin-password -X GET '
>>>> https://localhost:8443/gateway/sandbox/webhdfs/v1/?op=LISTSTATUS'
>>>>
>>>> but my filter is not called at all (I cannot see the log) and I'm not
>>>> sure whether it's because the class is not loaded or the filter is placed
>>>> in the wrong place or whatever.
>>>>
>>>> On [4] you can see the project I have built.
>>>>
>>>> So my questions are:
>>>>
>>>>    - what am I doing wrong or missing?
>>>>    - is there a better way to do that? I just need to add a logic when
>>>>    executing REST requests to Knox and make another REST call to an 
>>>> external
>>>>    service I need.
>>>>
>>>>
>>>> Thank you!
>>>> Regards,
>>>> Matteo
>>>>
>>>> [1] https://knox.apache.org/books/knox-1-2-0/dev-guide.html#Class+Path
>>>> [2]
>>>> https://github.com/mat-ale/apache-knox-filter/blob/master/src/main/java/com/plainid/ext/MyUrlRewriteServletFilter.java
>>>> [3]
>>>> [4] https://github.com/mat-ale/apache-knox-filter
>>>>
>>>>
>>>>
>>>
>>
>
>

Reply via email to