Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Как аутентифицировать пользователя вручную


Автор: bingo 6.9.2007, 00:59
Ситуация такова, что после определенного количества невалидных попыток войти в систему, пользователь лочится на определенное время.
Но не знаю теперь как реализовать так, что если период блокировки истекает, то пользователь может войти в систему. =)
Делаю так:
проверяю объект org.springframework.context.ApplicationEvent на "соответствие" классу org.acegisecurity.event.authentication.AuthenticationFailureLockedEvent и вношу соответствующие изменения в БД. Но вот как быть чтобы пользователя тут же и аутентифицировать?.. (т.е. сейчас получается, что пользователю приходится повторить попытку входа: 1-ый раз - аккаунт разблокируется, 2-ой раз - успешный вход =)).
Первое что попалось в глаза - это метод setAuthenticated(boolean isAuthenticated) из org.acegisecurity.Authentication, но получил тут же exception:
Код

java.lang.IllegalArgumentException: Cannot set this token to trusted - use constructor containing GrantedAuthority[]s instead

И где этот конструктор... =)
Подскажите, что можно сделать?

Автор: Zamuta 6.9.2007, 09:59
bingo, я ловлю BadCredentialsException и после n неудачных попыток делаю его enable = false в бд (Помнишь, где при настройке applicationContext.xml указывется SELECT username, password, enabled FROM users WHERE username = ?). Для разлочки нужно запросить ключ. Количество неудачных попыток храню в сессии....

Добавлено через 1 минуту и 44 секунды
Цитата

что если период блокировки истекает, то пользователь может войти в систему.


Храни в сессии, как сессия умрёт, так и пускай заного...

Автор: bingo 6.9.2007, 21:59
Что-то не совсем понял про это =): 
Цитата

Помнишь, где при настройке applicationContext.xml указывется SELECT username, password, enabled FROM users WHERE username = ?

Вообщем логика в моем понимании и как я предполагаю реализовать 'enabled' - это для пользователей, чтоб могли друг друга отключать вручную, а 'nonLocked' - для автоматической блокировки/разблокировки пользователей при входе в систему.

Сессия - вариант, бесспорно, но мне не нравится, т.к. если "клиент" создает новую сессию каждый раз, то получается аккаунт никогда не заблокируется. И кроме того, я хочу блокировку делать, ну минут 10 или 20, а для жизни сессии это как-то маловато.

Автор: Zamuta 7.9.2007, 08:33
Цитата
Вообщем логика в моем понимании и как я предполагаю реализовать 'enabled' - это для пользователей, чтоб могли друг друга отключать вручную, а 'nonLocked' - для автоматической блокировки/разблокировки пользователей при входе в систему.

Расскажи про специфику приложения. Не понятно зачем пользователи будут отключать друг друга.
Цитата
Ситуация такова, что после определенного количества невалидных попыток войти в систему, пользователь лочится на определенное время.
Но не знаю теперь как реализовать так, что если период блокировки истекает, то пользователь может войти в систему. =)

Как узнать, что пользователь вводит не тот пароль? Ловить BadCredentialsException . А как иначе? Вот по этому событию и делай что хочешь. Хоть поля для ввода логина и пароля делай неактивными. 
Цитата
Сессия - вариант, бесспорно, но мне не нравится, т.к. если "клиент" создает новую сессию каждый раз, то получается аккаунт никогда не заблокируется. И кроме того, я хочу блокировку делать, ну минут 10 или 20, а для жизни сессии это как-то маловато. 

Вот именно, что не заблокируется. Будет каждый раз браузер по новой открывать и вводить пароль. Но так он всё равно простым перебором не сможет сломать, глупо это. 
Почему 10 или 20 минут это мало. 10 или 20 минут с последней активности пользователя. Т.е. если в сессии нет активности 10 или 20 минут то тогда она умирает....
Цитата
Что-то не совсем понял про это =): 
Цитата 
Цитата
Помнишь, где при настройке applicationContext.xml указывется SELECT username, password, enabled FROM users WHERE username = ?


Это:
Код

<bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="usersByUsernameQuery">
            <value>SELECT username, password, enabled FROM users WHERE username = ?</value>
        </property>
        <property name="authoritiesByUsernameQuery">
            <value>SELECT username, authority FROM users WHERE username = ?</value>
        </property> 
    </bean>

Автор: bingo 7.9.2007, 15:09
Цитата

Расскажи про специфику приложения. Не понятно зачем пользователи будут отключать друг друга.

Это я просто так выразился =), администраторы могут "выключать" пользователей.
Цитата

Как узнать, что пользователь вводит не тот пароль? Ловить BadCredentialsException . А как иначе? Вот по этому событию и делай что хочешь. Хоть поля для ввода логина и пароля делай неактивными. 

Это я понял =), вопрос в другом.
Цитата

10 или 20 минут с последней активности пользователя.

Это и смущает, что точно сказать нельзя когда аккаунт разлочится.
А 10-20 минут мало для сессии, т.к. в принципе пользователи будут что-то запускать, заниматься своими делами, а потом будут возвращаться к работе с моим приложением через полчаса, а может и позже.
Цитата

SELECT username, password, enabled FROM users WHERE username = ?

Я просто по-другому делаю, через свою имплементацию сервиса и соотвующего DAO.

ps: вообщем не знаю =), хочу сделать как задумал изначально, т.е. главный вопрос как аутентифицировать пользователя вручную в моей имплементации org.springframework.context.ApplicationListener и отлавливая соответсвующие acegi-even'ы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)