Широ 1.2 не работает с Guice (и Vaadin) - PullRequest
2 голосов
/ 21 января 2012

Первый пользователь, пожалуйста, будьте добры!

У меня возникла небольшая проблема с настройкой Shiro для фильтрации сгенерированных Vaadin страниц с использованием Guice.

Я смотрел онлайн на различных веб-сайтах, включая руководства Apache Shiro и т. Д. Проблема в том, что большинство веб-сайтов склонны делать это «старым» способом, то есть используя Shiro 1.1 (который не имеет встроенной поддержки Guice).

Так вот в чем проблема.Мои страницы не фильтруются через Широ.Я пробовал множество разных вещей, включая использование AOP для аутентификации метода, настройку фильтров вручную в файле web.xml.Даже настройку файла shiro.ini (который я НЕ хочу делать ни при каких обстоятельствах).

Итак, вот список того, что я использую: - Shiro 1.2.0-SNAPSHOT - Guice 3.0 - Vaadin6.7.4

Вот мой web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

    <display-name>App</display-name>

    <context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>

    <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>com.app.GuiceServletInjector</listener-class>
    </listener>

</web-app>

Вот Servlet Injector:

public class GuiceServletInjector extends GuiceServletContextListener {
    private ServletContext servletContext;

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        servletContext = servletContextEvent.getServletContext();
        super.contextInitialized(servletContextEvent);
    }

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new GuiceServletModule(), new ShiroConfigurationModule(servletContext));
    }

, который затем создает ServletModule, который передает запроск приложению Vaadin:

protected void configureServlets() {
    bind(Application.class).to(VaadinMainWindow.class).in(ServletScopes.SESSION);

    bind(BasicHttpAuthenticationFilter.class).in(Singleton.class);
    filter("/*").through(BasicHttpAuthenticationFilter.class);

    serve("/*", "*").with(VaadinApp.class);
}

Также на этапе инжектора обратите внимание, что я создаю ShiroConfigurationModule, который заботится о сферах и т. д .:

public class ShiroConfigurationModule extends ShiroWebModule {

    @Inject
    public ShiroConfigurationModule(ServletContext servletContext) {
        super(servletContext);
    }

    @Override
    protected void configureShiroWeb() {
        bindRealm().to(ShiroBaseRealm.class).in(Singleton.class);
        bind(Realm.class).to(ShiroBaseRealm.class).in(Singleton.class);

        processMethodInterceptors();
    }

    private void processMethodInterceptors() {
        MethodInterceptor interceptor = new AopAllianceAnnotationsAuthorizingMethodInterceptor();
        bindInterceptor(any(), annotatedWith(RequiresRoles.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresPermissions.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresAuthentication.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresUser.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresGuest.class), interceptor);
    }
}

Возвращает класс областей«true» для support (), но возвращает «null» для всего, имитируя, что пользователя не существует.

Шансы сделать что-то неправильно или пропустить шаг очень велики.Может кто-нибудь, пожалуйста, объясните, что мне не хватает, чтобы я мог хотя бы получить базовую аутентификацию HTTP?

Спасибо большое!Мо

Ответы [ 2 ]

1 голос
/ 01 июля 2015

Естественно, что ссылка на блог истекла, и сайт, на который теперь перенаправлено, не содержит никаких следов этой статьи в блоге.

Копию статьи можно найти здесь.

http://web.archive.org/web/20120413052117/http://www.mofirouz.com/wordpress/2012/01/guice-shiro-1-2-and-vaadingwt/

Суть ответа: если вы используете хитрость, вы ДОЛЖНЫ включить

filter("/*").through(GuiceShiroFilter.class)

в вашем модуле ServletModule, иначе ни один из связанных сирофильтров никогда не получит удар.

0 голосов
/ 25 января 2012

Прямо после большого тестирования и возни с Широ (а также, наконец, с использованием версии 1.2) я начал работать над своим.

Я написал подробный ответ на своем сайте (в первую очередь потому что проще писать!).Посмотрите:

http://www.mofirouz.com/wordpress/2012/01/guice-shiro-1-2-and-vaadingwt/

Удачи, кто бы там ни был!

...