On Mon, Sep 19, 2011 at 2:43 PM, André Warnier <a...@ice-sa.com> wrote:

> Hi.
>
> I am not knowledgeable enough in Java code to tell if there is something
> wrong with the method, but if it works for you, that's the most important
> aspect.
>
> By curiosity, how are you telling Apache to add this header ?
>

I'm using the RequestHeader directive :

RequestHeader set X-Forwarded-User ...


>
> And one more thing, which I am sure you must have considered, but maybe
> worth mentioning anyway :
>
> If your Tomcat server is accessible via other channels than from the Apache
> front-end, then this is of course a security hole, since anyone can forge
> such a HTTP header and send it to Tomcat.  So I would only use this in
> conjunction with a RemoteAddress Valve, or by having Tomcat listening only
> on a IP address which only the Apache host can access.
> (Or encrypting/decrypting the header, but that is more of a hassle).
>
> Essentially mod_jk and mod_proxy_ajp have the same issue, but the AJP
> protocol is a bit more difficult to handle and play with, than straight
> HTTP.
>

I have taken this aspect in consideration, but as you said, it worths
mentionning it ;-)


>
>
>
> Sylvain Goulmy wrote:
>
>> Thank you André for your contribution which was very helpful.
>>
>> If you are using the first one (HTTP), then one way would be to force
>> Apache
>>
>>> to add a HTTP header to the request, containing the user-id; and on the
>>> Tomcat side, have something that picks up this HTTP header, and stuffs
>>> its
>>> content in the UserPrincipal object.
>>> I don't know if something like that exists ready-made, but a custom Valve
>>> or servlet filter should be able to do that.
>>>
>>
>>
>> This is effectively the solution i had chosen, i should have mentionned
>> it.
>> Actually i was looking for the implementation on the tomcat side that's
>> why
>> i was looking how the ajp connector was using the user-id data to set the
>> remote user. You gave me the solution by mentionning the UserPrincipal
>> object as i was on the wrong place looking for a setRemoteUser() method.
>>
>> Here is the code of the valve which give me the expected result :
>>
>> public class RemoteUserValve extends ValveBase {
>>
>>>        public void invoke(Request request, Response response) throws
>>> IOException, ServletException {
>>>                String remoteUser = request.getHeader("X-**
>>> Forwarded-User");
>>>                Principal userPrincipal = request.getPrincipal();
>>>                if (userPrincipal != null) {
>>>                        System.out.println("Principal getName : " +
>>> userPrincipal.getName() + ".");
>>>                        System.out.println("Principal toString : " +
>>> userPrincipal.toString() + ".");
>>>                } else {
>>>                        System.out.println("**userPrincipal is null.");
>>>                        request.setUserPrincipal(new
>>> CoyotePrincipal(remoteUser));
>>>                }
>>>                getNext().invoke(request, response);
>>>        }
>>> }
>>>
>>
>>
>> Please, feel free to comment this code if something looks improvable.
>>
>> Thx again for your help.
>>
>> Sylvain
>>
>> On Fri, Sep 16, 2011 at 11:33 AM, André Warnier <a...@ice-sa.com> wrote:
>>
>>  Sylvain Goulmy wrote:
>>>
>>>  Hi everyone,
>>>>
>>>> I'm actually using Tomcat on my environment platform (Tomcat 5.5 /
>>>> Tomcat
>>>> 6
>>>> and soon Tomcat 7). I have a frontend Apache http Server using the jk
>>>> connector to communicate with Tomcat instance.
>>>>
>>>> I'd like to change this connector and use the mod_proxy one for several
>>>> reasons. The main difficulty to handle is relative to the remote-user
>>>> information. Indeed the jk connector automatically transmits the
>>>> information
>>>> so that the application can retrieve it using a request.getRemoteUser()
>>>> method call.
>>>>
>>>> If i'm not using the ajp connector anymore, i need to handle something
>>>> on
>>>> the tomcat side to set the remote user in the request object. I thought
>>>> i
>>>> could use a valve to do this. And that's where the road ends, i have
>>>> watched
>>>> the ajp conenctor code in order to see how the remote user is set in the
>>>> request but i can't find it.
>>>>
>>>>
>>>>  You are not finding it, because you are looking in the wrong place.
>>> If mod_jk can pass the authenticated user to Tomcat, via the AJP channel,
>>> it is because the user (or request) has been authenticated on the Apache
>>> side, before the request is forwarded through mod_jk to Tomcat.
>>> The AJP connector on the Tomcat side then picks up this user-id from the
>>> request coming in on the AJP channel, and sets the UserPrincipal in
>>> Tomcat
>>> accordingly.
>>> That's why a subsequent getRemoteUser() can pick it up in Tomcat.
>>>
>>> If you want to switch to mod_proxy instead of mod_jk, the question is :
>>> can
>>> mod_proxy forward the Apache user-id to Tomcat ?
>>> The question is slightly more complicated, because there are two methods
>>> of
>>> connecting Apache to Tomcat using mod_proxy :
>>> a) mod_proxy_http (protocol = HTTP, over Tomcat HTTP Connector)
>>> b) mod_proxy_ajp (protocol = AJP, over Tomcat's AJP Connector (the same
>>> as
>>> the one used with mod_jk)
>>>
>>> If you are using the second one (AJP), then we know that the AJP protocol
>>> /can/ carry the Apache user-id to Tomcat (because that is what mod_jk
>>> does).
>>>  The question is whether mod_proxy_ajp has some setting to tell it to do
>>> that (or does it by default).
>>>
>>> If you are using the first one (HTTP), then one way would be to force
>>> Apache to add a HTTP header to the request, containing the user-id; and
>>> on
>>> the Tomcat side, have something that picks up this HTTP header, and
>>> stuffs
>>> its content in the UserPrincipal object.
>>> I don't know if something like that exists ready-made, but a custom Valve
>>> or servlet filter should be able to do that.
>>>
>>>
>>>
>>>
>>> ------------------------------****----------------------------**
>>> --**---------
>>> To unsubscribe, e-mail: 
>>> users-unsubscribe@tomcat.**apa**che.org<http://apache.org>
>>> <users-unsubscribe@**tomcat.apache.org<users-unsubscr...@tomcat.apache.org>
>>> >
>>>
>>> For additional commands, e-mail: users-h...@tomcat.apache.org
>>>
>>>
>>>
>>
>
> ------------------------------**------------------------------**---------
> To unsubscribe, e-mail: 
> users-unsubscribe@tomcat.**apache.org<users-unsubscr...@tomcat.apache.org>
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Reply via email to