2.SSM-Project-Day06 shiro框架-用户登录-重坑:错误报告要仔细看

本文详细记录了SSM项目中整合Shiro框架进行用户登录时遇到的坑,重点在于解决 Dao 层 SysUserDao 没有被扫描到的问题。报错原因分析指出是缺少对配置文件的全面加载,以及对框架原理和属性理解不足。通过逐步排查,最终成功解决异常,确保了登陆信息的正常处理。
摘要由CSDN通过智能技术生成

一、Dao-SysUserDao

//    根据用户名查找用户
    SysUser findUserByUserName(String username);

二、Mapper

<select id="findUserByUserName"
            resultType="com.jt.sys.SysUser">
      select *
      from sys_users
      where username=#{username}
   </select>

三、在Service-Realm文件夹中新建类ShiroUserRealm

@Service
public class ShiroUserRealm extends AuthorizingRealm {

    @Autowired
    private SysUserDao sysUserDao;
    /**
     * 指定加密算法和加密次数(默认就是1次)
     * @param credentialsMatcher
     */
    @Override
    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {

        HashedCredentialsMatcher hashMatcher=
                new HashedCredentialsMatcher("MD5");
        //hashMatcher.setHashIterations(1024);
        super.setCredentialsMatcher(hashMatcher);
    }
    /**
     * 负责用户认证信息的获取以及封装
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        System.out.println("doGetAuthenticationInfo");
        //1.获取用户身份信息(例如用户名)
        String userName=(String)token.getPrincipal();//身份(控制层提交)
        //2.基于用户名访问数据库获取用户信息
        SysUser user=sysUserDao.findUserByUserName(userName);
        //3.对用户信息进行验证
        //3.1验证是否为空(为空说明此此用户不存在)
        if(user==null)
            throw new UnknownAccountException();
        //3.2验证此用户是否被禁用了(禁用则不允许登录)
        if(user.getValid()==0)
            throw new LockedAccountException();
        //4.基于业务封装用户数据?(例如密码,盐值)
        ByteSource credentialsSalt=
                ByteSource.Util.bytes(user.getSalt());
        SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(
                user, //principal (身份)
                user.getPassword(),//hashedCredentials(已加密的密码)
                credentialsSalt, //credentialsSalt
                this.getName());//realmName(当前类的名字)
        return info;//将此值返回给认证管理器(Authentication)
    }

    //     后授权  :负责用户授权信息的获取及封装
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

}

四、Controller-SysUserController

//    用户登录界面
    @RequestMapping("doLogin")
    @ResponseBody
public JsonResult doLogin(String username,String password){
    //1.获取Subject对象
    Subject subject=SecurityUtils.getSubject();
    //2.通过Subject提交用户信息,交给shiro框架进行认证操作
    //2.1对用户进行封装
    UsernamePasswordToken token=
            new UsernamePasswordToken(
                    username,//身份信息
                    password);//凭证信息
    //2.2对用户信息进行身份认证
    subject.login(token);
    //分析:
    //1)token会传给shiro的SecurityManager
    //2)SecurityManager将token传递给认证管理器
    //3)认证管理器会将token传递给realm
    return new JsonResult("login ok");
}

五、配置文件信息

 <import resource="classpath:spring-configs.xml"/>
  
    <!-- 配置shiro中的SecurityManager -->
    <bean id="securityManager"
          class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroUserRealm"/>
    </bean>

报错:

01-Apr-2019 21:44:49.232 警告 [RMI TCP Connection(5)-127.0.0.1] org.springframework.web.context.support.XmlWebApplicationContext.refresh Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilterFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'SecurityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'shiroUserRealm' while setting bean property 'realm'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'shiroUserRealm': Unsatisfied dependency expressed through field 'sysUserDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jt.sys.dao.SysUserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
01-Apr-2019 21:44:49.235 严重 [RMI TCP Connection(5)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilterFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'SecurityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'shiroUserRealm' while setting bean property 'realm'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'shiroUserRealm': Unsatisfied dependency expressed through field 'sysUserDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jt.sys.dao.SysUserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值