Java SpringBoot学习笔记 43 Shiro整合Mybatis

来自B站【狂神说Java】SpringBoot最新教程IDEA版通俗易懂

1. 导入依赖

                <!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		
		<!-- druid数据源 -->
		<dependency>
		  <groupId>com.alibaba</groupId>
		  <artifactId>druid</artifactId>
		  <version>1.2.11</version>
		</dependency>
		
		<!-- log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		
		<!-- mybatis -->
		<dependency>
		  <groupId>org.mybatis.spring.boot</groupId>
		  <artifactId>mybatis-spring-boot-starter</artifactId>
		  <version>2.2.2</version>
		</dependency>
		
		<!-- lombok -->
		<dependency>
		  <groupId>org.projectlombok</groupId>
		  <artifactId>lombok</artifactId>
		</dependency>

2. 增加类 com.example.shiro.pojo.User.java

package com.example.shiro.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

	private int id;
	private String name;
	private String pwd;
	
}

3. 增加接口,配置mybatis和数据源

3.1 com.example.shiro.mapper.UserMapper

package com.example.shiro.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import com.example.shiro.pojo.User;

@Repository
@Mapper
public interface UserMapper {

	User queryUserByName(String name);
	
}

3.2 resources 增加 mapper

<?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.shiro.mapper.UserMapper">

	<select id="queryUserByName" resultType="User">
		select * from `user` where `name` = #{name}
	</select>

</mapper>

3.3 增加 application.yml

spring: 
  datasource: 
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

    #SpringBoot 默认不注入这些值,需要自己绑定
    #druid数据源专有配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: false
    #配置监控统计拦截的filter:stat监控统计、wall防御SQL注入、log4j日志记录
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#整合Mybatis
mybatis: 
  type-aliases-package: com.example.shiro.pojo
  mapper-locations: classpath:mapper/*.xml

4. 增加 UserService 及其实现类

package com.example.shiro.service;

import com.example.shiro.pojo.User;

public interface UserService {

	User queryUserByName(String name);
	
}

package com.example.shiro.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.shiro.mapper.UserMapper;
import com.example.shiro.pojo.User;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	UserMapper userMapper;
	
	@Override
	public User queryUserByName(String name) {
		return userMapper.queryUserByName(name);
	}

}

5. UserRealm 的认证方法中调整为从数据库获取用户

package com.example.shiro.config;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
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;

import com.example.shiro.pojo.User;
import com.example.shiro.service.UserService;

public class UserRealm extends AuthorizingRealm {

	@Autowired
	UserService userService;
	
	/**
	 * 授权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		System.out.println("执行了 => 授权 doGetAuthorizationInfo");
		return null;
	}

	/**
	 * 认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("执行了 => 认证 doGetAuthenticationInfo");
		UsernamePasswordToken userToken = (UsernamePasswordToken) token;
		// 连接真实的数据库
		User user = userService.queryUserByName(userToken.getUsername());
		if (user == null) {
			return null;// UnknownAccountException
		}
		// 密码认证,shiro框架来实现
		// 加密方式 1. MD5   2.MD5 盐值
		return new SimpleAuthenticationInfo("", user.getPwd(), "");
	}

}

6. 测试

posted @ 2022-09-04 13:11  君子键  阅读(34)  评论(0)    收藏  举报