Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> spring security, где хранятся инстансы спринга? 
:(
    Опции темы
iluvatar
Дата 28.8.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Есть у меня авторизация на сайте, я хочу давать пользователям возможность менять имя и эл.ящик
Но есть проблемка - remember me service, который парсит куки пользователя на наличие зарегенного пользователя. Идентификатором как раз является имя пользователя. Т.е. мне по сути надо просто бросить пользователю новую куку. Нашел метод с помощью которого это можно сделать - в моем случае это TokenBasedRememberMeServices.onLoginSuccess()


Вопрос такой - как мне получить инстанс этого класса? Вообще-то он хранится в фильтре RememberMeAuthenticationFilter, поле rememberMeServices. Но к фильтру я тоже не знаю как обратиться, статических методов там нет.

Очень не хочется писать свой фильтр или сервис только из-за этого. По сути мне надо обратиться к созданному объекту, который хранится где-то в дебрях спринга. Как можно это сделать?
PM MAIL ICQ   Вверх
Старовъръ
Дата 28.8.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



Все spring-контексты загружаются в web.xml по средством: 
Код

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/ApplicationContext-security.xml classpath:ApplicationContext.xml
            classpath:ApplicationContext-Hibernate.xml classpath:ApplicationContext-Dao.xml
            classpath:ApplicationContext-Aop.xml
        </param-value>
    </context-param>


PM MAIL WWW   Вверх
iluvatar
Дата 28.8.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



А как обратиться к описанному contextConfigLocation ?
По идее я должен где-то статический метод вызвать, но у какого класса?

Это сообщение отредактировал(а) iluvatar - 28.8.2010, 18:16
PM MAIL ICQ   Вверх
Старовъръ
Дата 28.8.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



1. Тебе самому нужно создать бин remember-me-service.
2. Создать ты его должен в applicationContext-security.xml который подсоединяется через конфиг параметры, иже указаны выше.
3. Ты все конфиги можешь там прописать и ссылаться на бины друг друга.
Вот пример spring security 2.x:
Код

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
             http://www.springframework.org/schema/security
             http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

    <http access-denied-page="/index.html">
        <intercept-url pattern="/login.html" access="ROLE_ANONYMOUS"/>
        <intercept-url pattern="/home.html" access="ROLE_MEMBER"/>
        <intercept-url pattern="/myentities.html" access="ROLE_MEMBER"/>
        <intercept-url pattern="/deletentity.html" access="ROLE_MEMBER"/>
        <intercept-url pattern="/editentity.html" access="ROLE_MEMBER"/>
        <intercept-url pattern="/logout.html" access="ROLE_MEMBER"/>
        <intercept-url pattern="/coockiestheft.html" access="ROLE_ANONYMOUS"/>
        <intercept-url pattern="/*.html" access="ROLE_MEMBER, ROLE_ANONYMOUS"/>

        <form-login login-page="/login.html" default-target-url="/index.html"
                    authentication-failure-url="/login.html?error=1"/>

        <logout logout-url="/logout.html" logout-success-url="/index.html" invalidate-session="true"/>
        <anonymous granted-authority="ROLE_ANONYMOUS" username="anonymous"/>
        <remember-me services-ref="rememberMeServices"/>
    </http>

    <beans:bean id="rememberMeServices"
                class="org.springframework.security.ui.rememberme.PersistentTokenBasedRememberMeServices">
        <beans:property name="tokenRepository" ref="jdbcTokenRepository"/>
        <beans:property name="userDetailsService" ref="authenticationService"/>
        <beans:property name="key" value="SpringSecured"/>
        <beans:property name="alwaysRemember" value="true"/>
    </beans:bean>

    <beans:bean id="jdbcTokenRepository" class="org.springframework.security.ui.rememberme.JdbcTokenRepositoryImpl">
        <beans:property name="createTableOnStartup" value="false"/>
        <beans:property name="dataSource" ref="dataSource"/>
    </beans:bean>

    <beans:bean id="authenticationProvider" class="com.myapp.MyAuthenticationProvider">
        <custom-authentication-provider/>
        <beans:property name="authenticationService" ref="authenticationService"/>
        <beans:property name="userDetailsService" ref="userDetailsService"/>
    </beans:bean>

</beans:beans>

PM MAIL WWW   Вверх
iluvatar
Дата 28.8.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



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

мне нужно в конкретном месте вызвать конкретный метод проинициализированного спрингом класса.
т.е. в фильтре RememberMeAuthenticationFilter в методе doFilter доступно поле rememberMeServices. Этот объект был создан спрингом. Мне нужно получить этот объект в произвольном месте моей программы, не только в фильтре.

Вопрос - где хранятся объекты созданные спрингом и как к ним обращаться из произвольного класса. Это же инстансы, они должны где-то храниться.

Если еще проще - как в каком-нить экшене получить rememberMeService, описанный в applicationContext?
PM MAIL ICQ   Вверх
Старовъръ
Дата 29.8.2010, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



Цитата
у меня все прекрасно работает, конфиг есть, но только переписывать rememberMeService мне не надо, мне стандартного хватает за глаза.
Посмотри выше, это и есть пример конфигурации стандартного сервиса. Когда бин создан в контексте, ты можешь на него ссылаться в других бинах. 
Цитата
т.е. в фильтре RememberMeAuthenticationFilter в методе doFilter доступно поле rememberMeServices. Этот объект был создан спрингом.
С какой это стати? Сам был создан? Из spring security reference:
Цитата
The beans required in an application context to enable remember-me services are as follows: 
Код

<bean id="rememberMeFilter" class=
 "org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
  <property name="rememberMeServices" ref="rememberMeServices"/>
  <property name="authenticationManager" ref="theAuthenticationManager" />
</bean>

<bean id="rememberMeServices" class=
 "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
  <property name="userDetailsService" ref="myUserDetailsService"/>
  <property name="key" value="springRocks"/>
</bean>

<bean id="rememberMeAuthenticationProvider" class=
 "org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationProvider">
  <property name="key" value="springRocks"/>
</bean>
Don't forget to add your RememberMeServices implementation to your UsernamePasswordAuthenticationFilter.setRememberMeServices()  property, include the RememberMeAuthenticationProvider in your AuthenticationManager.setProviders() list, and add RememberMeAuthenticationFilter into your FilterChainProxy (typically immediately after your UsernamePasswordAuthenticationFilter).

PM MAIL WWW   Вверх
iluvatar
Дата 29.8.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Я вообще не об этом. Я не показывал свой конфиг, но поверь там у меня все прекрасно, конфиг у меня рабочий. Речь вообще не о конфиге. И даже не о security.

Еще проще опишу свою проблему. 
Я описываю два бина (любых), первый содержит второй в одном из своих полей. Второй соответственно доступен из первого, а мне надо его получить в произвольном месте моего класса, которые создается не через спринг. 
Как мне получить мой вложенный бин в struts-экшене например?
PM MAIL ICQ   Вверх
wedens
Дата 29.8.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Цитата(iluvatar @ 29.8.2010,  11:37)
Я вообще не об этом. Я не показывал свой конфиг, но поверь там у меня все прекрасно, конфиг у меня рабочий. Речь вообще не о конфиге. И даже не о security.

Еще проще опишу свою проблему. 
Я описываю два бина (любых), первый содержит второй в одном из своих полей. Второй соответственно доступен из первого, а мне надо его получить в произвольном месте моего класса, которые создается не через спринг. 
Как мне получить мой вложенный бин в struts-экшене например?

а в чем проблема собственно стратс экшн добавить в спринг и подключить внешний бин через Autowired и через getter вынуть внутренний, не?

Это сообщение отредактировал(а) wedens - 29.8.2010, 12:57
PM MAIL   Вверх
iluvatar
Дата 29.8.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



алиллуйя!!!
небеса разверзлись и ниспослали мне решение!!!
Спасибо, сегодня буду пробовать
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.