承接上一篇博客: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(你们不一定会遇到这个错误)
再输入一个错误的账号密码
而输入正确的,即可!!!