春季安全保持在登录时的单个URL

时间:2010-12-30 06:14:33

标签: login spring-security

这是我的情况。

当第一次用户登陆网站时,他们会指向登录页面。 (以免说http://ex.com/)并且当他们成功登录时,他们会看到另一个页面具有相同的网址(http://ex.com/

但是,当他们在其他标签(http://ex.com)上打开网站时,他们会指向登录页面。

如何在我的网站中使用spring security实现此案例?

在处理传统servlet时很容易做到。我只需要有2个方法(doGet用于显示登录页面,doPost用于验证用户,如果有效,它将调用另一个视图)。

这是我的配置:

<security:http auto-config="true">        
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />                
    <security:form-login login-page="/login"
                         login-processing-url="/loginProcess" 
                         default-target-url="/login"
                         authentication-failure-url="/login?login_error=1" />
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" />
</security:http>

2 个答案:

答案 0 :(得分:2)

**编辑(删除不相关的答案)

您似乎需要使用Spring Security添加并发会话管理。请参阅以下链接:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

您可以注入SessionRegistry并查看主体是否已登录。如果是,请调用expireNow()

或者您可以在FilterChainProxy中的SessionManagementFilter上或之前实现过滤器:

  

SessionManagementFilter根据SecurityContextHolder的当前内容检查SecurityContextRepository的内容,以确定用户是否在当前请求期间进行了身份验证,通常是通过非交互式身份验证机制,例如预身份验证或记住我[ 19]。如果存储库包含安全上下文,则过滤器不执行任何操作。如果没有,并且线程本地SecurityContext包含(非匿名)Authentication对象,则过滤器假定它们已由堆栈中的先前过滤器进行了身份验证。然后它将调用配置的SessionAuthenticationStrategy。    - http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

答案 1 :(得分:1)

我认为您的配置存在问题

<security:http auto-config="true">        
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />                
    <security:form-login login-page="/login"
                         login-processing-url="/loginProcess" 
                         default-target-url="<home-page-url. ex: /home>"
                         authentication-failure-url="/login?login_error=1" />
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" />
</security:http>

default-target-url应指向应用程序成功登录后必须重定向的默认页面。

<强> EDITED 经过所需的再次发布后,我认为方法是让控制器处理/login请求以处理这两种情况

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class AppsController {

    @RequestMapping("/login")
    public ModelAndView view(HttpServletRequest request,
            HttpServletResponse response) {

        Authentication authentication = SecurityContextHolder.getContext()
                .getAuthentication();
        User user = authentication != null
                && authentication.getPrincipal() instanceof User ? (User) authentication
                .getPrincipal() : null;

        return user == null ? getLoginModelAndView() : getHomeModelAndView();
    }

    private ModelAndView getHomeModelAndView() {
        return null;
    }

    private ModelAndView getLoginModelAndView() {
        return null;
    }

}

如果会话中没有经过身份验证的用户,控制器将返回登录页面,但一旦用户登录,它将返回不同的页面。

Spring安全性会将已记录的用户缓存到用户会话中,并且可以使用SecurityContextHolder检索它。