2012-03-09 52 views
4

我为我的web应用程序使用spring security 3.1。Spring Security 3.1 - 如何识别用户已经登录或不是?

我已经实现了我的自定义过滤器来提供所请求URL的过滤。

用户登录后,用户点击登录URL,此时登录URL不应该被打开。我的意思是说我如何检查用户是否已经登录?

如果用户已经登录,则不应打开登录页面。它应该打开default-target-url页面。

谢谢。

回答

4

您可以使用SecurityContextHolder类中的静态方法从Security Context 获得Authentication对象,然后您可以找到用户当前是否已登录。

+0

感谢您的回答。 但我的问题是,如果用户已经登录,则不应显示登录页面。应显示登录页面主页面(登录页面后)。 所以请帮助我解决这个问题,如果可能的话,使用preauthentication过滤器。 谢谢。 – 2012-03-12 07:06:38

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

感谢您的回答。 但我的问题是,如果用户已经登录,则不应显示登录页面。应显示登录页面主页面(登录页面后)。 所以请帮助我解决这个问题,如果可能的话,使用preauthentication过滤器。 谢谢。 – 2012-03-12 07:06:31

+0

我更新了我的答案。如果您将配置添加到应用程序上下文中,那么当您访问索引页时,spring会检查您是否已通过身份验证。如果你不是,它会将你重定向到登录页面。您还可以看到:[安全命名空间配置](http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config。html) – 2012-03-12 08:42:01

+0

感谢您的回复。 但我想它也是副诗。我的意思是说,如果用户已经登录,那么登录页面将不会被打开,但目标网址将被打开。 谢谢。 – 2012-03-15 13:13:50

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

我现在正在编写类似的功能。在我来说,我只是添加了此代码与Spring的安全配置:当然

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

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

<!-- More configuration here --> 

</http> 

的这种配置会将所有“拒绝访问”请求您的主页。如果你只想为你的登录页面使用不同的重定向,你应该提供你自己的访问拒绝处理程序实现。

相关问题