这是我的情况。
当第一次用户登陆网站时,他们会指向登录页面。 (以免说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>
答案 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
检索它。