NutzCN Logo
问答 关于Shiro登录报验证码错误的问题
发布于 3306天前 作者 qq_f34225b9 3987 次浏览 复制 上一个帖子 下一个帖子
标签: shiro

模仿nutz-book提供的例子进行学习,在加入shiro后,遇到了一些问题,通过查看[(关于Shiro登录无法跳转登陆成功之后的页面]https://nutz.cn/yvr/t/1aqf8oq7fogolr3apbumgsva0i)、[我模仿NutzBook发现我的项目NutDaoRealm从未调用过](https://nutz.cn/yvr/t/v4e0hr0r6ih66qov5uivuj19e6)2个帖子后解决了一部分,还有以下的问题:

1、doGetAuthenticationInfo和doGetAuthorizationInfo方法仍旧未被调用过?
2、第一次访问http://127.0.0.1:8888/alumni/login/login,默认GET方式,跳转到WEB-INF\jsp\login\login.jsp的登录页面,输入用户名、密码和验证码后,通过ajax使用POST方式提交${ctx}/login/login,总是返回“验证码错误”的响应信息,但是login方法已经删除,又没有调用到doGetAuthenticationInfo,这个错误是如何产生的?

shiro.ini配置如下:
[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
nutzdao_realm = com.project.alumni.shiro.realm.NutDaoRealm
nutzdao_realm.credentialsMatcher = $sha256Matcher

authc = org.nutz.integration.shiro.CaptchaFormAuthenticationFilter
authc.loginUrl = /login/login
logout.redirectUrl= /login/login

[urls]
/rs/* = anon
/login/logout = logout
/login/* = authc

9 回复

我之前的答复已经把流程说得很清楚,完全可以逐层debug

既然总是无法配置成功,何不先把nutzbook完整跑一次呢?即使是本站的源码也可以

既然是报验证码错误,那完全可以找到该报错信息所在的代码进行debug

来自炫酷的 NutzCN

@wendal nutzbook有跑了一遍,流程我也基本了解,我自己的工程也是按照向导一步步做下来的,但是真的找不到报“验证码错误”的地方,晚上我把nutz-integration-shiro-1.b.53.r2.jar去掉,用nutzbook中的源码org.nutz.integration.shiro.替换之后,就不会报错,doGetAuthenticationInfo也会被调用到,然后再换成jar包就不行了,不明白什么原因

既然有"成功"和"不成功"的两份代码,自行分析差异了

@wendal 刚才抽空看了一下,是如下原因导致的:

1、nutzbook中与shiro集成的源码中,CaptchaFormAuthenticationFilter这个类重写了createToken方法,最终返回的是CaptchaUsernamePasswordToken

2、nutz-integration-shiro-1.b.53.r2.jar中,CaptchaFormAuthenticationFilter这个类直接调用了shiro的FormAuthenticationFilter类的createToken方法,最终返回的是UsernamePasswordToken

很好,我明天看看代码

来自炫酷的 NutzCN

我检查了一下, 无论是maven上的版本还是我本地版本,都是这个呢

        AuthenticationToken token = new CaptchaUsernamePasswordToken(username, password, rememberMe, host, captcha);
        try {
            subject.login(token);
            return onLoginSuccess(token, subject, request, response);
        }
        catch (AuthenticationException e) {
            return onLoginFailure(token, e, request, response);
        }

要不,重新下载试试?

@wendal nutzbook中执行的是CaptchaFormAuthenticationFilter类中的match方法,在里面去创建token,没有执行executeLogin,我觉得会不会maven上的版本也是这样,晚点有空再看看

@wendal 好吧,算是我的问题吧,maven上的版本的确是执行executeLogin,但是在session中取不到验证码参数时,默认取属性名为“nutz_captcha”的属性值:

Object _expected = session.getAttribute(captchaParam);
if (_expected == null)
            _expected = session.getAttribute("nutz_captcha");

而我则在Tookit中把captcha_attr改成自己的命名方式

能找到原因就好

来自炫酷的 NutzCN

添加回复
请先登陆
回到顶部