Okay..
I’m pseudo-coding here but:
Firstly your accessToken is not just your username. It’s also your password.
The reason for this is that it’s the secret that authenticates a user. You
currently aren’t storing a real username. The IP address isn’t secret - it’s
not your password. It’s just a filter.
Tbh the deficiency in Shiro here is that there’s no AuthToken-based Token
implementation. That would have encouraged the right solution from the start.
What you want is a config like the following:
accessToken1=accessToken1,publicApi
accessToken2=accessToken2.publicApi
and then separately
[allowedIPs]
accessToken1=ip1,ip2
and then your filter says:
if(!allowedIPs.get(accessToken).contains(ip1) {
throw new AuthenticationFailedException();
}
What you need to do is implement a Shiro Ini reader that help you do the second
bit. There might even be existing IP filters for Shiro out there. A quick
search looks promising.
Best,
Philip Whitehouse
> On 20 Nov 2018, at 07:38, Bengt Rodehav <[email protected]> wrote:
>
> Sorry for being unclear. I'll try to explain better.
>
> We have a REST API that partners to us can access. It is a simple http/GET
> based protocol that returns JSON data. Authentication is being done via a
> parameter "accessToken" in the URL (https://....?acessToken=123). The access
> token is similar to a user. We don't require a password since the accessToken
> itself is a random GUID. We do, however, only allow access from known IP
> addresses (white listing). Generally speaking, this is a public site so the
> firewall restricts no one. But this API needs to be restricted to known IP
> addresses.
>
> Currently I have created a filter (I have subclassed AuthenticatingFilter)
> with my own createToken() method. In that method, I extract the access token
> and the IP address (either from the ServletRequest's getRemoteAddr() or from
> the "X-Forwarded-For" header). I then create a UsernamePasswordToken with the
> access token as the user and the IP address as the password.
>
> The number of users accessing this service is not very high so it is easy to
> maintain them in the ini file as follows:
>
> [users]
> accessToken1=123.123.123.123,publicApi
> accessToken2=456.456.456.456,publicApi
>
> ...where "publicApi" is the role I require for accessing this service.
>
> This approach is really easy and works but it only allows for one IP address
> per access token which is a limitation for us. Some customers need to access
> our service from multiple servers and sometimes from an IP address range.
>
> So I need another solution. One solution is of course to use the firewall for
> white listing. We do that for a number of other services where we only allow
> access from our partners. However, in this case the site is public except for
> this exact call. This makes it hard for us to use our firewall. Also, it
> would be nice to maintain the access tokens and the IP addresses in one
> place. Otherwise the risk is very high that the firewall will, after a while,
> not be synced with the access tokens.
>
> I am very open to other approaches. I just took an easy first route that
> seemed to work fine - for a while...
>
> /Bengt
>
>
>
>
>
>
>
>
> Den tis 20 nov. 2018 kl 07:21 skrev armandoxxx <[email protected]>:
>> Hey ...
>>
>> Please explain what would you like to achieve (your use case) .. we will try
>> to help you how to implement it ;) .. Sorry I'm lost too ...
>>
>> Regards
>> Armando
>>
>>
>>
>> --
>> Sent from: http://shiro-user.582556.n2.nabble.com/