Apache Shiro и Google Guice: добавьте зависимости в область - PullRequest
4 голосов
/ 31 января 2011

Я разрабатываю API для отдыха с Джерси и хочу использовать Google Guice для внедрения зависимостей и Apache Shiro в качестве основы безопасности.

Для аутентификации я создал собственное царство, в которое я должен внедрить пользовательский аутентификатор, которыйподключен к EntityManager.

Однако зависимость не вводится в Царство.Я предполагаю, что shiro.ini (в котором я должен определить используемую область) не управляется guice.

Как я могу внедрить зависимости в Apache Shiro, особенно в используемую область?

Мой web.xml имеет только фильтр, сопоставленный с guice

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>GuiceServletConfig</listener-class>
</listener>
</web-app>

Мой GuiceServletConfig настраивает все зависимости, включая CustomRealm

public class GuiceServletConfig extends GuiceServletContextListener {

@Override
protected Injector getInjector() {
    return Guice.createInjector(new DbModule(), new JerseyServletModule() {

        @Override
        protected void configureServlets() {
            // ...
            // CustomRealm is only used when i use it as an eager singleton
            bind(CustomRealm.class).asEagerSingleton();
            bind(org.apache.shiro.web.servlet.IniShiroFilter.class).in(Singleton.class);
            filter("/*").through(org.apache.shiro.web.servlet.IniShiroFilter.class);
            serve("/api/*").with(GuiceContainer.class);
        }
    });
}
}

Широ ini определяет только область

[main]
myRealm = CustomRealm
[users] # for testing
root = secret,admin
[roles] # for testing
admin = *
[urls]
/api/** = authcBasic

1 Ответ

5 голосов
/ 01 февраля 2011

INI-конфигурация Apache Shiro отлично подходит для многих случаев использования, но если вы обладаете всеми возможностями инфраструктуры IoC, такой как Spring или Guice, обычно лучше сконфигурировать весь Shiro внутри механизма IoC напрямую.Хорошим примером этого служит интеграция Shiro Spring: http://shiro.apache.org/spring.html Рекомендуется сделать что-то почти идентичное для сред Guice.

Если вы не хотите этого делать и предпочитаете оставаться с INIShiro имеет концепцию RealmFactory.

Вы можете создать реализацию RealmFactory, которая будет взаимодействовать с вашей средой Guice и «вытягивать» ваши сконфигурированные Guice области.Затем вы определяете свою реализацию RealmFactory в INI Shiro:

[main]
...
guiceRealmFactory = com.foo.bar.shiro.GuiceRealmFactory
...

Обратите внимание, однако, что INI в Shiro поддерживает получение экземпляров Realm только из INI через RealmFactory - все другие ссылочные объекты должны быть определены в INI.Возможно, вы захотите открыть вопрос о Широ Джира, чтобы попросить о более общей поддержке Фабрики за пределами просто областей.

В конечном итоге, поскольку Guice является более мощным, чем INI, рекомендуется, если это возможно, настроить все в Shiro в Guice (SecurityManager, области, ShiroFilter и т. Д.)

...