2013-05-27 3 views
0

Я действительно не знаю, как я задаю свой вопрос. Я разработал веб-приложение, и я использовал фреймворк (Spring, SpringSecurity)Весенняя безопасность, не обнаруживающая пользователя со страниц

приложение отлично работает, выполняет роль и привилегии для аутентификации и управления.

<sec:http auto-config="true" use-expressions="true"> 

     <sec:intercept-url pattern="/pagess/admin/**" access="hasRole('ROLE_ADMIN')" /> 
     <sec:intercept-url pattern="/pagess/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN','ROLE_VISTEUR')" /> 
     <sec:form-login login-page="/login.jsf" 
      authentication-failure-url="/loginFailed.jsf" default-target-url="/Menu.jsf" /> 
     <sec:logout logout-success-url="/login.jsf" delete-cookies="JSESSIONID" 
      invalidate-session="true" /> 
     <sec:access-denied-handler error-page="/interdit.jsf"/>          
     <sec:session-management invalid-session-url="/login.jsf"> 
      <sec:concurrency-control max-sessions="1" 
       error-if-maximum-exceeded="true" /> 
     </sec:session-management> 
    </sec:http> 

    <sec:authentication-manager alias="authenticationManager"> 
     <sec:authentication-provider> 
      <sec:jdbc-user-service data-source-ref="DataSource" 
       users-by-username-query=" 
       select username,password, enabled 
       from utilisateur where username=?" 
       authorities-by-username-query=" 
       select username, authority from utilisateur 
       where username =? " /> 

     </sec:authentication-provider> 
    </sec:authentication-manager> 
</beans:beans> 

но это только сегодня я заметил что-то странное. пока я нахожусь на страницах, которые я нажимаю на стрелку предыдущего google chrome из приложения на страницу аутентификации. Сразу после того, как я вытащил в противоположном смысле flech Advent, он позволил мне перейти к приложению, но это не нормально, что без аутентификации.

<context-param> 
    <param-name>contextConfigLocation</param-name> 
     <param-value> 
    /WEB-INF/application.xml 
    /WEB-INF/spring_sec.xml 
     </param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
<listener> 
    <listener-class> 
    org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
    </listener> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class> 
      org.springframework.web.filter.DelegatingFilterProxy 
     </filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

    <listener> 
<listener-class> 
org.springframework.security.web.session.HttpSessionEventPublisher 
</listener-class> 
</listener> 

    <listener> 
    <listener-class> 
    org.springframework.web.context.request.RequestContextListener 
    </listener-class> 
    </listener> 

Хау может я .thank заранее

+0

Просто чтобы прояснить по проблеме: Вы себя проверку подлинности. Затем перейдите на предыдущую страницу, используя навигацию браузера. И затем, вернувшись на страницу, требующую аутентификации, вы вошли в систему. Это верно? И что именно вы хотите это сделать? – Carsten

+0

да это моя проблема, он проходит на странице входа без заполнить имя пользователя и пароль –

ответ

0

Мммм. То, что вы описали, звучит как стандартное поведение. После входа в веб-приложение создается сеанс с контекстом безопасности, и пользователь оттуда считается аутентифицированным. Простая навигация от веб-сайта в кеше браузера не приведет к аннулированию сеанса. Поскольку это было бы довольно неудобно и потребовало бы, чтобы пользователь входил в систему при каждой навигации на новый сайт. Итак, как должно вести себя веб-приложение!

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

Однако для реализации приложения без сеанса вам необходимо установить время сеанса на очень низкий интервал или удалить объект аутентификации непосредственно после загрузки страницы. Это, как правило, не очень удобный подход. Для лучшего ответа вам, возможно, придется подробно остановиться на проблеме (которая пока не является проблемой), детализируя, что именно должно делать приложение.

+0

бака вы @Carsten для справки .this Моей logoutMethod публики Строки dologout() бросает IOException { \t FacesContext.getCurrentInstance() getExternalContext.() \t \t .invalidateSession(); this.username = ""; this.password = ""; \t ExternalContext context = FacesContext.getCurrentInstance(). GetExternalContext(); \t контексте.redirect (context.getRequestContextPath() \t \t \t \t + "/ j_spring_security_logout"); \t \t FacesContext.getCurrentInstance(). ResponseComplete(); \t \t null null; \t } –

+0

Но также после выхода из системы Когда я вернусь назад с помощью кнопки «google chrome», я разрешаю мне обращаться к приложению –

+0

Снова нет проблем с этим, и ничто ваше приложение не может с этим поделать, поскольку, когда вы используете навигацию браузера, локальный кешированный экземпляр отображаемой страницы используется без отправки каких-либо запросов на ваш сервер. Но так как любое действие на этой странице должно инициировать исключение, не прошедшее проверку подлинности, или что-то подобное, это не проблема. (Вы пробовали какие-либо действия на кэшированной странице? Что происходит?) – Carsten

0

заменить

<sec:logout logout-success-url="/login.jsf" delete-cookies="JSESSIONID" 
     invalidate-session="true" /> 

по

<sec:logout logout-url="/login.jsf" logout-success-url="/login.jsf" delete-cookies="JSESSIONID" 
     invalidate-session="true" /> 

, но я не уверен, что если положить /login.jsf для входа в систему и в то же время выход из системы будет работать.

вы можете пользователя /logout.jsf для logout-url, вам не нужно создавать logount.jsf, и пользователи будут иметь возможность выхода из системы с помощью /logout.jsf

+0

Ну, это может решить настоящую «проблему». Но что происходит, когда вместо перехода обратно пользователь просто перемещается куда-то еще, а затем обратно в веб-приложение? Из того, что я понимаю, речь идет не столько о регистрации пользователя в запланированном порядке, сколько в том, что после выхода из веб-страницы пользователь остается в системе. В конце концов Адриано заявил, что весенняя безопасность работает до сих пор. – Carsten

+0

Весна-безопасность работает очень хорошо. вы можете установить время простоя сеанса в вашем web.xml, что означает, что при отсутствии активности в это время пользовательский сеанс будет недействительным. Теперь, когда пользователь попадает на любую страницу, если он как действительный сеанс (и справа), он получит страницу, если у него нет сеанса, он будет перенаправлен на страницу входа. Если обратный URL-адрес указывает на страницу входа в систему, и у него уже есть сеанс, он будет перенаправлен на ваш URL-адрес по умолчанию, заданный по умолчанию-target-url, который является Menu.jsf –

+0

извините за задержку. Я искренне благодарен за вашу помощь. –

Смежные вопросы