Shiro的验证机制 和同一浏览器 多次登录的BUG
来源:互联网 发布:python语言 编辑:程序博客网 时间:2024/06/14 06:33
Shiro同时登陆多个账户异常
5条回复
5571 views
关于一个浏览器同时登陆多个账户,自动跳转到原登录页面的逻辑错误。
方法1
对shiro源码进行了调试,发现是AuthenticationFilter验证逻辑的问题:
1.它首先验证是否有允许访问页面(isAccessAllowed方法)。
2.在拒绝访问中(FormAuthenticationFilter的onAccessDenied方法)才会进行判断是否是登录提交(isLoginSubmission)。
因为已经登陆了一个用户所以isAccessAllowed直接返回为true,进入LoginController,找到匹配方法fail直接返回LOGIN_PAGE。
由于有权限访问该登录(其他)页面FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME没有值,返回为Null,所以在
keta-security中会跳转到login页面并且显示"登陆失败,其他错误!"。
方法1
对shiro源码进行了调试,发现是AuthenticationFilter验证逻辑的问题:
1.它首先验证是否有允许访问页面(isAccessAllowed方法)。
2.在拒绝访问中(FormAuthenticationFilter的onAccessDenied方法)才会进行判断是否是登录提交(isLoginSubmission)。
因为已经登陆了一个用户所以isAccessAllowed直接返回为true,进入LoginController,找到匹配方法fail直接返回LOGIN_PAGE。
由于有权限访问该登录(其他)页面FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME没有值,返回为Null,所以在
keta-security中会跳转到login页面并且显示"登陆失败,其他错误!"。
分析、修改逻辑,首先验证是否是登录操作,再进行验证是否有权限访问页面。继承FormAuthenticationFilter,覆盖isAccessAllowed方法。
01
/**
02
*
03
* @author <a href="mailto:ketayao@gmail.com">ketayao</a>
04
* Version 1.1.0
05
* @since 2012-10-29 上午9:37:02
06
*/
07
08
public
class
BaseFormAuthenticationFilter
extends
FormAuthenticationFilter {
09
private
static
final
Logger log = LoggerFactory.getLogger(BaseFormAuthenticationFilter.
class
);
10
11
/**
12
*
13
* @param request
14
* @param response
15
* @param mappedValue
16
* @return
17
* @see org.apache.shiro.web.filter.authc.AuthenticatingFilter#isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.Object)
18
*/
19
@Override
20
protected
boolean
isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
21
try
{
22
// 先判断是否是登录操作
23
if
(isLoginSubmission(request, response)) {
24
if
(log.isTraceEnabled()) {
25
log.trace(
"Login submission detected. Attempting to execute login."
);
26
}
27
return
false
;
28
}
29
}
catch
(Exception e) {
30
log.error(Exceptions.getStackTraceAsString(e));
31
}
32
33
return
super
.isAccessAllowed(request, response, mappedValue);
34
}
35
}
方法2
- 在loginUrl页面判断用户是否已经登陆,如果已经登陆了,则提示用户可以选择进入系统或者登出:
<ui:fragment rendered="#{not empty request.remoteUser}"> 您已经登陆系统,请选择<a href="dashboard.html">进入系统</>,或者<a href="logout.do">登出系统来用其它用户登陆</></ui:fragment>
- 方法3
- 或者,你希望用户这样干的时候,直接将其重定向到系统首页去,则利用filter来做此事
@WebFilter(urlPatterns = "/login.xhtml")public class LoginPageFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; if (request.getRemoteUser() != null)) { response.sendRedirect(request.getContextPath() + "/home.xhtml"); // Redirect to home page. } else { chain.doFilter(req, res); // User is not logged-in, so just continue request. } } // Add/generate init() and destroy() with NOOP.}
阅读全文
1 0
- Shiro的验证机制 和同一浏览器 多次登录的BUG
- 我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录)
- Shiro登录机制验证,自定义FormAuthenticationFilter
- 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程
- Shiro在web的基础验证(登录验证)
- 扯淡的bug--shiro
- Application变量在线列表和禁止同一帐号多次登录
- SSM+Shiro写的一个简单的登录验证
- 同一页面多次使用kindEditor的上传文件——兼容大部分浏览器
- SSM+Shiro系统登录验证码的实现
- SSM+Shiro系统登录验证码的实现
- 基于权限安全框架Shiro的登录验证功能实现
- 避免同一文件include多次的方法
- HBase多次加载-ROOT-和META的bug
- 优化 shiro 多次调用 redis 的问题
- shiro验证的API
- 烦人的QQ登录验证机制
- Oracle 验证登录的三种机制
- Java-普通代码块,构造代码块,静态代码块
- vb.net 教程 3-4 窗体编程 ImageList
- Python3 加密(hashlib / hmac)
- 01背包问题
- CAN总线
- Shiro的验证机制 和同一浏览器 多次登录的BUG
- Java设计模式之观察者模式
- Centos6.5 中 ssh免密码登录配置
- 奇偶数排序
- java.lang.NullPointerException 在SSH框架中编写增加功能遇到的问题
- web编程速度大比拼(nodejs go python)(非专业对比)
- C++第6次实验
- [System.out.println("");]快速唤醒指令
- Android系统Binder机制学习总结