Shiro 1.2 не работает с Guice (и Vaadin)
Первый раз, пожалуйста, будьте добры!
У меня есть небольшая проблема с настройкой Shiro для фильтрации сгенерированных Vaadin страниц с помощью Guice.
Я смотрел онлайн на различных веб-сайтах, включая руководства Apache Shiro и т. Д. Проблема в том, что большинство веб-сайтов склонны делать это "старым" способом, то есть используя Shiro 1.1 (который не имеет встроенной поддержки Guice).
Так вот в чем проблема. Мои страницы не фильтруются через Широ. Я пробовал множество разных вещей, включая использование AOP для аутентификации методов, настройку фильтров вручную в файле web.xml. Даже настройку файла shiro.ini (что я НЕ хочу делать ни при каких обстоятельствах).
Итак, вот список вещей, которые я использую: - Shiro 1.2.0-SNAPSHOT - Guice 3.0 - Vaadin 6.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>
Вот серво инжектор:
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);
}
}
Класс realm возвращает "true" для support (), но возвращает "null" для всего, симулируя, что пользователь не существует.
Шансы сделать что-то не так или пропустить шаг очень высоки. Может кто-нибудь, пожалуйста, объясните, что мне не хватает, чтобы я мог хотя бы получить базовую аутентификацию HTTP?
Большое спасибо! Пн.
2 ответа
Естественно, ссылка на блог истекла, и сайт, на который теперь перенаправлен сайт, не содержит никаких следов этой статьи в блоге.
Копию статьи можно найти здесь.
Суть ответа: если вы используете хитрость, то вы ДОЛЖНЫ включить
filter("/*").through(GuiceShiroFilter.class)
в вашем модуле ServletModule, иначе ни один из связанных фильтров Широ никогда не попадет под удар.
Сразу после долгих испытаний и работы с Широ (а также, наконец, с использованием версии 1.2) я начал работать.
Я написал подробный ответ на своем сайте (в первую очередь потому, что его легче написать!). Посмотри:
http://www.mofirouz.com/wordpress/2012/01/guice-shiro-1-2-and-vaadingwt/
Удачи всем, кто там!