2012-03-09 1 views
4

Я использую весеннюю безопасность 3.1 для своего веб-приложения.Spring Security 3.1 - как идентифицировать пользователя уже вошел в систему или нет?

Я внедрил свой собственный фильтр для обеспечения фильтрации запрошенного URL-адреса.

Как только пользователь зарегистрировался, а затем пользователь попал в URL-адрес входа, в это время URL-адрес не должен открываться. Я хочу сказать, как я могу проверить, что пользователь уже зарегистрирован или нет?

Если пользователь уже зарегистрирован, то страница входа в систему не открывается. Он должен открыть страницу целевого URL-адреса.

Спасибо.

ответ

4

Вы можете использовать статический метод в классе SecurityContextHolder получить Security Context , где вы можете получить объект проверки подлинности, а затем вы можете найти ли пользователь в настоящее время вошли в систему или нет.

+0

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

0

Попробуйте это:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
if (authentication == null) { 
//not authorized 
} 
Object principalObject = authentication.getPrincipal(); 
if (principalObject == null) { 
//not authorized 
} 

Или вы можете настроить безопасность, я думаю, что это то, что вам нужно в ApplicationContext:

<security:http auto-config="true" authentication-manager-ref="authenticationManager"> 
     <!-- Don't set any role restrictions on login.jsp and index.jsp --> 
     <security:intercept-url pattern="/login" 
           access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
     <security:intercept-url pattern="/urlOfAView" 
           access="IS_AUTHENTICATED_ANONYMOUSLY"/> 

     <!-- Restrict access to ALL other pages --> 
     <security:intercept-url pattern="/**" access="ROLE_USER"/> 

     <!-- Set the login page and what to do if login fails --> 
     <security:form-login login-page="/login" 
          authentication-failure-url="/login?login_error=1" default-target-url="/loginUser"/> 

     <!-- Set the logout page and where to go after logout is successful --> 
     <security:logout logout-success-url="/index"/> 
    </security:http> 

Я использую Spring 3.1, так что мои пространств имен:

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

Удача

+0

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

+0

Я обновил свой ответ. Если вы добавите конфигурацию в контекст приложения, при посещении страницы индекса весна проверит, если вы прошли аутентификацию. Если вы этого не сделаете, он перенаправит вас на страницу входа. Вы также можете увидеть: [Конфигурация пространства имен безопасности] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html) –

+0

Спасибо за ваш ответ. Но я хочу также и наоборот. Я хочу сказать, что если пользователь уже зарегистрирован, страница входа в систему не будет открыта, но целевой URL будет открыт. Спасибо. –

4

Я искал решение для решения одной и той же проблемы. Я закончил делать следующее:

@RequestMapping(method = RequestMethod.GET, value = "/admin/login") 
public ModelAndView login(HttpServletRequest request) { 
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    if(principal instanceof UserDetails && validLogin((UserDetails) principal)){ 
     return new ModelAndView("redirect:/admin/home"); // Go to admin home if already 
                 // logged in 
    } 

    final String error = request.getParameter("login_error"); 
    return loginPage.display(error); // Not logged in, so admin login page is displayed 
} 

private boolean validLogin(UserDetails userDetails) { 
    // This function does a check to ascertain the validity of the logged in user 
    // You may also consider evaluating userDetails.getAuthorities() 
    return userDetails.isAccountNonExpired() && 
      userDetails.isAccountNonLocked() && 
      userDetails.isCredentialsNonExpired() && 
      userDetails.isEnabled(); 
} 

Но я уверен, что существует более настраиваемый способ достижения этого.

0

Я пишу аналогичную функциональность прямо сейчас. В моем случае я просто добавил этот код весной конфигурации безопасности:

<http pattern="/**" auto-config="false" use-expressions="true" > 

<intercept-url pattern="/login" access="!isAuthenticated()" /> 
<access-denied-handler error-page="/"/> 

<!-- More configuration here --> 

</http> 

Конечно эта конфигурация перенаправляет все «отказано в доступе» запросы на главной странице. Если вам нужна другая переадресация только для вашей страницы входа в систему, вы должны предоставить свою собственную реализацию отказа от отказа.

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