用户可以在同一机器上反复登陆
来源:6-4 重构用户名密码登录

LayLowMay
2019-09-01
无论是browser版本下同一浏览器,还是app版本的同一deviceId下,用户在登陆成功后还是可以依旧访问loginProcessingUrl(authentication/form)再继续换用户名登陆或者登陆失败。
请问怎么防止这一情况
----------------------------- 以下是我想到的一些方法 -----------------------------
package com.imooc.security.core.authentication.anonymous; import com.imooc.security.core.properties.SecurityConstants; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 指定url才进行判断,如果是匿名(未登陆状态)就允许通过,已登陆抛出异常不允许访问 */ @Component("anonymousAllowFilter") public class AnonymousAllowFilter extends OncePerRequestFilter implements InitializingBean { /** * 存放所有匿名允许通过的的url */ private List<String> allowUrlList = new ArrayList<>(); /** * 检查器,检查用户是否匿名(未登录) */ @Autowired private AnonymousInspection inspection; /** * 验证请求url与配置的url是否匹配的工具类 */ private AntPathMatcher pathMatcher = new AntPathMatcher(); @Autowired private AnonymousExceptionHandler handler; /** * 讲系统中配置的需要校验验证码的URL根据校验的类型放入map * * @param urlString */ protected void addUrlToList(String urlString) { if (StringUtils.isNotBlank(urlString)) { String[] urls = StringUtils.splitByWholeSeparatorPreserveAllTokens(urlString, ","); for (String url : urls) { allowUrlList.add(url); } } } protected boolean isRequestMatch(HttpServletRequest request) { for (String url : allowUrlList) { if (pathMatcher.match(url, request.getRequestURI())) { return true; } } return false; } /** * 在其他参数组装完毕后,初始化urls这个值 * @throws ServletException */ @Override public void afterPropertiesSet() throws ServletException { super.afterPropertiesSet(); allowUrlList.add(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_FORM); allowUrlList.add(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE); allowUrlList.add(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_OPENID); addUrlToList(inspection.urls()); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { try { if (isRequestMatch(request) && !inspection.anonymous()) { throw new AnonymousException("您已经登陆"); } } catch (AnonymousException e) { handler.handle(request, response, e); return; } chain.doFilter(request, response); } }
我根据老师您的课程写了一个过滤器摆在最前面,不知道这种解决方法好不好
写回答
1回答
-
JoJo
2019-09-03
额...没明白,为什么要防止?要防止的话自己判断下就好了,浏览器环境下登录成功后判断一下登录用户和session里的用户是否一致,app环境下判断一下deviceId就可以了。
012019-09-04
Spring Security技术栈开发企业级认证与授权
Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全
2662 学习 · 1561 问题
相似问题
学友们,你们的并发登录能成功吗?
回答 1
thymeleaf 判断登陆状态 异常
回答 1