请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在进行登录的时候即使账号密码正确还是回到登录页面,不会调到index.jsp这个页面

@RequestMapping("/loginUser")

    public String loginUser(@RequestParam("username") String username,

                            @RequestParam("password") String password,

                            HttpSession session) {

        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        Subject subject = SecurityUtils.getSubject();

        try {

            subject.login(token);

            User user = (User) subject.getPrincipal();

            session.setAttribute("user", user);

            return "index";

        } catch (Exception e) {

            return "login";

        }

    }

执行完    subject.login(token);就调到了catch后面的异常

正在回答

2回答

你好,看了你发这些,这个异常的根本原因,你可以这样去检查一下:

1、保证代码数据库连接正确。课程里application.properties里的数据库配置要保证换成了自己可以连接的。

2、用户名密码是否正确。课程默认sql里给的可登陆账户为:用户名admin,密码123

3、如果用户名密码没问题,需要确认一下CredentialMatcher里是否也是使用明文做的等值检查,这是如果修改也可能出现问题。

public class CredentialMatcher extends SimpleCredentialsMatcher {

   @Override
   public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
       UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
       String password = new String(usernamePasswordToken.getPassword());
       String dbPassword = (String) info.getCredentials();
       return this.equals(password, dbPassword);
   }
}

4、如果上面两点也都没有问题,那么检查一下你的mybatis里的sql是否拼写错误,之前有同学犯过类似的错误。感觉自己和课程里的一样,实际上有差别,我这里也贴一份出来,必要的时候你可以覆盖一下:

<mapper namespace="com.mmall.demo2.mapper.UserMapper">

   <resultMap id="userMap" type="com.mmall.demo2.model.User">
       <id property="uid" column="uid" />
       <result property="username" column="username" />
       <result property="password" column="password" />
       <collection property="roles" ofType="com.mmall.demo2.model.Role">
           <id property="rid" column="rid" />
           <result property="rname" column="rname" />
           <collection property="permissions" ofType="com.mmall.demo2.model.Permission">
               <id property="pid" column="pid" />
               <result property="name" column="name"/>
               <result property="url" column="url" />
           </collection>
       </collection>
   </resultMap>

   <select id="findByUsername" parameterType="string" resultMap="userMap">
     SELECT u.*, r.*, p.*
     FROM user u
       INNER JOIN user_role ur on ur.uid = u.uid
       INNER JOIN role r on r.rid = ur.rid
       INNER JOIN permission_role pr on pr.rid = r.rid
       INNER JOIN permission p on pr.pid = p.pid
     WHERE u.username = #{username}
   </select>
</mapper>

你按照这几个方向对照检查一下看看。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕斯5332939 #1
    非常感谢!是在application.properties 文件中mybatis.mapper-locations=mappers/*.xml  中locations中把s漏掉了
    回复 有任何疑惑可以回复我~ 2018-05-30 15:16:32
Jimin 2018-05-29 16:29:16

你好,在catch那里加个断点,看看出了什么异常,一旦走到这里就会回到之前的页面了,那个异常应该能看到根本的原因

0 回复 有任何疑惑可以回复我~
  • 提问者 慕斯5332939 #1
    异常:org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false].  Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
    回复 有任何疑惑可以回复我~ 2018-05-29 16:51:30
  • 提问者 慕斯5332939 #2
    我上网查了一些资料,我觉得应该是在明文加密这方面出了问题。可是我觉得我的代码也没问题
      @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
            String username = usernamePasswordToken.getUsername();
            User user = userService.findByUsername(username);
            return new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
        }
    
      @Bean
        public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
            DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
            creator.setProxyTargetClass(true);
            return creator;
        }
    
    请问哪里出了问题
    回复 有任何疑惑可以回复我~ 2018-05-29 17:06:54
  • 提问者 慕斯5332939 #3
    怕你看不清楚,间隔调大一点
    
     // 认证登录
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
            String username = usernamePasswordToken.getUsername();
            User user = userService.findByUsername(username);
            return new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
        }
    
    
    
    
    
     @Bean
        public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
            DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
            creator.setProxyTargetClass(true);
            return creator;
        }
    回复 有任何疑惑可以回复我~ 2018-05-29 17:08:57
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号