SpringBoot和shiro整合项目实战四(图解超详细)

承接上一篇博客:https://blog.csdn.net/qq_41115379/article/details/113088489
首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:https://www.bilibili.com/video/BV1ct411x7CN
在这里插入图片描述

首先在pom里导入对应的依赖

<!-- druid -->

    <dependency>

      <groupId>com.alibaba</groupId>

      <artifactId>druid</artifactId>

      <version>1.0.9</version>

    </dependency>



    <!-- mysql -->

    <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

    </dependency>



    <!-- Spring的MyBatis启动器 -->

    <dependency>

      <groupId>org.mybatis.spring.boot</groupId>

      <artifactId>mybatis-spring-boot-starter</artifactId>

      <version>1.1.1</version>

    </dependency>

我选择用Navicat来做对应数据库操作
首先是创建数据库,我给的数据库名字是test_shiro
在这里插入图片描述
并创建对应的用户表


CREATE TABLE USER(

 id INT PRIMARY KEY AUTO_INCREMENT,

 NAME VARCHAR(20),

 PASSWORD VARCHAR(20)

);

在这里插入图片描述
顺便也是插入一条记录来方便测试
在这里插入图片描述

然后就是配置application,properties,创建在src/main/resources.但是如果你使用的是idea的话,是会在创建项目的时候自带创建一个这个的。
在这里插入图片描述

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test_shiro?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin
# 连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# mybatis 别名扫描
mybatis.type-aliases-package=com.example.domain

这里的用户名和密码,以及数据库名都需要做对应的修改
对于数据库的连接,也可以用idea测试一下
在这里插入图片描述
然后创建对应的包
在这里插入图片描述
创建User类

package com.example.domain;

public class User {
    
    
    private Integer id;
    private String name;
    private String password;

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }
    
    
}

再创建UserMapper接口

package com.example.mapper;

import com.example.domain.User;

public interface UserMapper {
    
    
    //这里只有一个方法
    public User findByName(String name);
}

再是,创建一个xml来对这个接口进行实现,这边和视频不一样的在于,看了下面的评论区:
在这里插入图片描述
所以第一步是 对application,properties进行修改加入

mybatis.mapper-locations=classpath*:mapping/*.xml

再创建对应的文件夹
和xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findByName" parameterType="String" resultType="user">
        SELECT  id,NAME,PASSWORD FROM user where name=#{value }
    </select>

</mapper>

再创建业务包
在这里插入图片描述
创建UserService接口和实现
UserService

package com.example.service;

import com.example.domain.User;

public interface UserService {
    
    
    //也是对应的方法
    public User  findByName(String name);
}

UserServiceImpl

package com.example.serviceImpl;

import com.example.domain.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

//这个用来实现这个方法
@Service
public class UserServiceImpl  implements UserService {
    
    
    //实现这个方法的途径 其实就是调用mapper接口
    //注入mapper 而且是用自动注入的方法
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findByName(String name) {
    
    
        //就是直接调用userMapper
        return userMapper.findByName(name);
    }
}

但这边userMapper会提示这个错误
在这里插入图片描述
所以需要修改启动类application加入

@MapperScan("com.example.mapper")

最后修改UserReal实现真正的数据库连接

package com.example.shiro;

import com.example.domain.User;
import com.example.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 自定义的Realm shiro有两个功能,认证和授权,所以刚好实现这两个功能
 */
public class UserRealm extends AuthorizingRealm {
    
    

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    
    
        System.out.println("执行授权逻辑");
        return null;
    }
    @Autowired
    private UserService userService;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    
    
        System.out.println("执行认证逻辑");
        /*//假设数据库的用户名和密码
        String name="wzw";
        String password="123";*/

        //这里就用真的连接了数据库的
        //编写shiro判断逻辑,也就是判断用户名和密码
        //首先是判断用户名, 也就是看和数据库的是否一致,强制转换这个,然后就可以对比了
        UsernamePasswordToken token= (UsernamePasswordToken)authenticationToken;

        //这里用来查询用户名
        User user=userService.findByName(token.getUsername());
       /* if(!token.getUsername().equals(name)){
            //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的
            return null;//shiro底层 UnKnowAccountException
        }*/
        if(user==null){
    
    
            //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的
            return null;//shiro底层 UnKnowAccountException
        }
        //判断密码的话,可以认为是shiro可以自动判断,只需要返回AuthenticationInfo的一个子类,并且返回对应的参数即可
        //第一个和最后一个参数可以省略,只需要中间这个参数是密码即可
      //  return new SimpleAuthenticationInfo("",password,"");
        //这里是新的
        return new SimpleAuthenticationInfo("",user.getPassword(),"");
    }
}

然后启动一下,测试一下
输入一个错误的用户名
在这里插入图片描述
这里报错了,所以要再application.properties进行修改com.mysql.cj.jdbc.Driver(你们不一定会遇到这个错误)
再输入一个错误的账号密码
在这里插入图片描述

在这里插入图片描述
而输入正确的,即可!!!

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/113106449