eternity_zzy 2017-11-01 02:14 采纳率: 100%
浏览 2194
已采纳

springBoot集成mybatis与shiro

最近在做一个springBoot集成mybatis与shiro的Demo 但是遇到shiro验证用户名密码一直提示不正确,实在是搞不明白,demo奉上http://pan.baidu.com/s/1jI3m9ZC,望解答,谢谢。

  • 写回答

2条回答 默认 最新

  • 独家de记忆 2017-11-01 05:34
    关注

    简单的对你的代码修改了下,以下贴出:
    1.首先你的ShiroAction.userLogin,补货异常,不是你那么使用的。

     @RestController
    public class ShiroAction {
        private static final Logger logger = LoggerFactory.getLogger(ShiroAction.class);
        /**
         * 
         * @Title: userLogin
         * @Description: 用户登录
         * @return
         */
        @RequestMapping(value="/login",method=RequestMethod.POST)
        public String userLogin(HttpServletRequest request,String username, String password, Map<String, Object> map) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            Subject subject = SecurityUtils.getSubject();
            String msg=null;
            try {
                logger.info("对用户[" + username + "]进行登录验证..验证开始");  
                subject.login(token);  
                logger.info("对用户[" + username + "]进行登录验证..验证通过");  
            }catch(UnknownAccountException uae){  
                logger.info("对用户[" + username + "]进行登录验证..验证未通过,未知账户");  
                msg = "未知账户";  
            }catch(IncorrectCredentialsException ice){  
                logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证");  
                msg = "密码不正确";  
            }catch(LockedAccountException lae){  
                logger.info("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定");  
                msg = "账户已锁定";  
            }catch(ExcessiveAttemptsException eae){  
                logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多");  
                msg = "用户名或密码错误次数过多";  
            }catch(AuthenticationException ae){  
                //通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景  
                logger.info("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下");  
                ae.printStackTrace();  
                msg = "用户名或密码不正确";  
            }  
            map.put("msg", msg);
            //验证是否登录成功  
            if(subject.isAuthenticated()){  
                logger.info("用户[" + username + "]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)");  
                return "/login";
            }else{  
                token.clear();  
                return "/login";
            }  
        }
    }
    

    MyRealm.中的验证代码:

     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            System.out.println("使用了自定义的realm,用户认证...");
            System.out.println("用户名:" + ((UsernamePasswordToken) token).getUsername());
            System.out.println("密码:" + new String(((UsernamePasswordToken) token).getPassword()));
    
            // 获取用户名
            String userName = (String) token.getPrincipal();
            // 依据用户名去数据库查询
            // 查询到了数据,验证密码是否正确
            // 密码正确,认证通过
            // 密码错误,认证失败
            // 没有查询到数据,认证失败
            sysUser su = new sysUser();
            su.setLoginName(userName);
            su = sysUserserviceImpl.selectByPrimaryKey(su);
            SimpleAuthenticationInfo SimpleAuthenticationInfo = new SimpleAuthenticationInfo(su.getLoginName(), su.getPassword(), this.getName());
            return SimpleAuthenticationInfo;
        }
    

    最后,最关键的一点,你的密码明文传输到shiro,并未使用加密处理,但是数据库中的密码却使用了加密,修改方法,就是在ShiroAction的UsernamePasswordToken生成之前对密码加密,当然,靠谱的是在前端就加密处理;

    我在你这个例子上面,密码框直接贴数据库加密后的串,点击登陆:
    以下是执行日志:

     2017-11-01 13:34:26.224  INFO 11232 --- [nio-8080-exec-9] com.kfit.zzy.controller.ShiroAction      : 对用户[admin]进行登录验证..验证开始
    使用了自定义的realm,用户认证...
    用户名:admin
    密码:d3c59d25033dbf980d29554025c23a75
    2017-11-01 13:34:26.228  INFO 11232 --- [nio-8080-exec-9] com.kfit.zzy.controller.ShiroAction      : 对用户[admin]进行登录验证..验证通过
    2017-11-01 13:34:26.228  INFO 11232 --- [nio-8080-exec-9] com.kfit.zzy.controller.ShiroAction      : 用户[admin]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀