Apache Shiro JDBC登录配置失败,但文件访问限制功能正常
兄弟,我懂你这种卡壳到崩溃的感觉——权限拦截正常但登录死活用不了,确实是Shiro配置里最让人头疼的坑之一。结合我折腾Shiro+JSP+MySQL的经验,给你几个针对性的排查点,你挨个试试:
核对登录表单参数与Shiro配置
先检查你登录页面(questionSetup1.jsp)的表单字段名,是不是和Shiro配置里的参数完全一致?比如在shiro.ini里如果配置了usernameParam=username、passwordParam=password,那表单里的输入框name属性必须是username和password,差一个字母都不行。要是你表单里写的是userName或者pwd,Shiro根本拿不到认证参数,自然登不上。排查Realm的认证逻辑
咱得把自定义Realm里的doGetAuthenticationInfo方法掰开揉碎了查:- 先确认
token.getPrincipal()是不是能正确获取到用户输入的用户名,别在这里就空了; - 连接MySQL查询用户数据的时候,有没有写错表名、字段名?比如是不是把
password写成pwd了,或者WHERE条件写错导致查不到用户? - 返回
SimpleAuthenticationInfo的时候,参数是不是正确?第一个是用户名,第二个是数据库里存的密码(注意是明文还是加密后的,要是加密了就得和Shiro的加密配置对应),第三个是Realm的名字(比如this.getName())。
建议在这些关键步骤加个打印日志,比如输出查询到的用户信息、传入的密码,一眼就能看出哪步出问题。
- 先确认
检查登录路径的拦截规则
你在shiro.ini里配置了authc.loginUrl=/questionSetup1.jsp对吧?那首先得确保这个登录页面的路径没有被Shiro拦截,必须在filterChainDefinitions里加一行:/questionSetup1.jsp = anon,不然登录页面自己都被重定向,根本没法正常提交登录请求。另外,表单的action属性必须对应Shiro的登录处理路径,默认是/login,要是你改了配置,得同步改表单的action。密码加密的坑别踩
如果你的MySQL里存的是加密后的密码,那Shiro必须配置对应的加密规则。比如在shiro.ini里加这段配置:credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher credentialsMatcher.hashAlgorithmName=MD5 credentialsMatcher.hashIterations=2 myRealm.credentialsMatcher=$credentialsMatcher要是你存的是明文密码,那得把加密相关的配置删掉,不然Shiro会把用户输入的明文加密后和数据库的明文比对,肯定不匹配,登录失败。
打开Shiro的Debug日志找线索
把Shiro的日志级别调到DEBUG,能看到登录过程的详细报错信息——是用户名不存在、密码不匹配,还是有其他异常?比如在log4j配置里加:<logger name="org.apache.shiro" level="DEBUG"/>日志里的错误信息是最直接的线索,别嫌麻烦,这步能帮你快速定位问题根源。
内容的提问来源于stack exchange,提问作者chris loughnane

