2012-06-07 1 views
0

В моем веб-приложении, использующем Apache Shiro для AuthC и AuthZ, у меня есть две области аутентификации: один для обычного веб-интерфейса (называемый SsoRealm) и еще один для API REST (называемый RestRealm) с использованием маркера API. Принципы, прошедшие проверку подлинности с обеих сфер, имеют разрешения на дизъюнкцию (и AuthenticationTokens). Если уже не существует существующего сеанса, и вызов API появляется через интерфейс REST, все будет в порядке, и аутентификация (и авторизация) происходит через RestRealm. Однако, если есть существующий сеанс, предварительно прошедший аутентификацию через SsoRealm, попытки аутентификации через RestRealm не выполняются, и последовательная проверка авторизации (с использованием Subject.isPermitted) терпит неудачу, поскольку субъект находится в неправильном состоянии.Shiro: принудительная аутентификация второго уровня, хотя существующий сеанс уже аутентифицирован через другую область

Соответствующие фильтры аутентификации зарегистрированы как (с помощью Shiro Guice):

addFilterChain("/api/x/*/y", REST_AUTH, NO_SESSION_CREATION); 
addFilterChain("/**", SSO_AUTH); 

Что я могу сделать, чтобы заставить повторную аутентификацию с «правильной» области?

бы обычай AuthenticationStrategy помощь (то есть, делает AuthenticationStrategy контракт позволит реализацию стратегии «если RestRealm участвует, аутентификация RestRealm должен быть успешным»)? AFAICS ModularRealmAuthenticator.doMultiRealmAuthentication не вызывается снова, если есть существующая авторизованная сессия ...

ответ

1

Как оказалось, этим было довольно легко решить: просто перезаписать AuthenticatingFilter#isAccessAllowed, чтобы убедиться, что «право» основной типа проверка подлинности для ваших realm (реализация по умолчанию использует только Subject#isAuthenticated для проверки подлинности любого принципала - независимо от того, соответствует ли она царству или нет).