• SpringBoot的shiro整合mybatis+druid数据源


    目录

    1、导入需要的包、依赖

    2、创建application.yml配置文件,编写druid的配置,以及在application.properties里面配置mybatis

    3、连接数据库mybatis,并补充完整项目的包目录

    4、在pojo里面编写User类

    5、mapper里面编写UserMapper接口,并写一个查询方法

    6、在resources下面创建的mybatis\mapper里面编写UserMapper.xml实现UserMapper类里面的方法 

    7、在service里面编写UserService接口和UserServiceImpl实现类 

    8、在测试类先测试一下 

    9、底层测试完没问题之后,就去改造UserRealm类

    10、效果

    11、在整合mybatis和添加druid的步骤中,不需要对MyController和ShiroConfig两个类进行改变

    12、主要代码

    12.1、pom.xml

    12.2、application.yml

    12.3、UserRealm

    12.4、MyController

    注意:整个项目到目前为止,需要注意一些类或接口里面的spring的注解。(很重要)


    在springboot-07-shiro配置好了登录认证的基础上做的改变,就是添加了真实数据库,用户名、密码从数据库中取出。以及加上了driud数据源

    1、导入需要的包、依赖

    2、创建application.yml配置文件,编写druid的配置,以及在application.properties里面配置mybatis

    3、连接数据库mybatis,并补充完整项目的包目录

    pojo、mapper、service

    4、在pojo里面编写User类

    5、mapper里面编写UserMapper接口,并写一个查询方法

    6、在resources下面创建的mybatis\mapper里面编写UserMapper.xml实现UserMapper类里面的方法 

    7、在service里面编写UserService接口和UserServiceImpl实现类 

    8、在测试类先测试一下 

    测试ok,代表底层代码没问题

    9、底层测试完没问题之后,就去改造UserRealm类

    因为是从UserRealm类这一步开始从数据库中拿数据,之前的是伪造的数据

    10、效果

    数据库中的数据

     

    11、在整合mybatis和添加druid的步骤中,不需要对MyController和ShiroConfig两个类进行改变

    12、主要代码

    12.1、pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.4version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.zhougroupId>
    12. <artifactId>shiro-springbootartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>shiro-springbootname>
    15. <description>shiro-springbootdescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>mysqlgroupId>
    22. <artifactId>mysql-connector-javaartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>com.alibabagroupId>
    26. <artifactId>druidartifactId>
    27. <version>1.1.21version>
    28. dependency>
    29. <dependency>
    30. <groupId>log4jgroupId>
    31. <artifactId>log4jartifactId>
    32. <version>1.2.17version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.mybatis.spring.bootgroupId>
    36. <artifactId>mybatis-spring-boot-starterartifactId>
    37. <version>2.1.1version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.projectlombokgroupId>
    41. <artifactId>lombokartifactId>
    42. dependency>
    43. <dependency>
    44. <groupId>org.apache.shirogroupId>
    45. <artifactId>shiro-springartifactId>
    46. <version>1.4.1version>
    47. dependency>
    48. <dependency>
    49. <groupId>org.thymeleafgroupId>
    50. <artifactId>thymeleaf-spring5artifactId>
    51. dependency>
    52. <dependency>
    53. <groupId>org.thymeleaf.extrasgroupId>
    54. <artifactId>thymeleaf-extras-java8timeartifactId>
    55. dependency>
    56. <dependency>
    57. <groupId>org.springframework.bootgroupId>
    58. <artifactId>spring-boot-starter-webartifactId>
    59. dependency>
    60. <dependency>
    61. <groupId>org.springframework.bootgroupId>
    62. <artifactId>spring-boot-starter-testartifactId>
    63. <scope>testscope>
    64. dependency>
    65. dependencies>
    66. <build>
    67. <plugins>
    68. <plugin>
    69. <groupId>org.springframework.bootgroupId>
    70. <artifactId>spring-boot-maven-pluginartifactId>
    71. plugin>
    72. plugins>
    73. build>
    74. project>

    12.2、application.yml

    1. spring:
    2. datasource:
    3. driver-class-name: com.mysql.cj.jdbc.Driver
    4. # 假如时区报错了,就增加一个时区的配置就ok了 serverTimezone=UTC
    5. url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    6. username: root
    7. password: 123456
    8. type: com.alibaba.druid.pool.DruidDataSource # 自定义源数据
    9. #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    10. #druid 数据源专有配置
    11. initialSize: 5
    12. minIdle: 5
    13. maxActive: 20
    14. maxWait: 60000
    15. timeBetweenEvictionRunsMillis: 60000
    16. minEvictableIdleTimeMillis: 300000
    17. validationQuery: SELECT 1 FROM DUAL
    18. testWhileIdle: true
    19. testOnBorrow: false
    20. testOnReturn: false
    21. poolPreparedStatements: true
    22. #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    23. #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
    24. #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    25. filters: stat,wall,log4j
    26. maxPoolPreparedStatementPerConnectionSize: 20
    27. useGlobalDataSourceStat: true
    28. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

    12.3、UserRealm

    1. package com.zhou.config;
    2. import com.zhou.pojo.User;
    3. import com.zhou.service.UserService;
    4. import org.apache.shiro.authc.*;
    5. import org.apache.shiro.authz.AuthorizationInfo;
    6. import org.apache.shiro.realm.AuthorizingRealm;
    7. import org.apache.shiro.subject.PrincipalCollection;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. // 自定义的UserRealm extends AuthorizingRealm
    10. public class UserRealm extends AuthorizingRealm {
    11. @Autowired
    12. UserService userService;
    13. // 授权
    14. @Override
    15. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    16. System.out.println("执行了====>授权doGetAuthorizationInfo");
    17. return null;
    18. }
    19. // 认证
    20. @Override
    21. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    22. System.out.println("执行了====>认证doGetAuthorizationInfo");
    23. // // 用户名,密码 数据库中取出
    24. // String username = "root";
    25. // String password = "123456";
    26. UsernamePasswordToken userToken = (UsernamePasswordToken) token;
    27. // // 用户名判断
    28. // if (!userToken.getUsername().equals(username)){
    29. // return null; // 抛出异常 UnknownAccountException
    30. // }
    31. // 连接真实的数据库
    32. User user = userService.queryUserByName(userToken.getUsername());
    33. if (user == null){ // 没有这个人
    34. return null; // 抛出异常 UnknownAccountException
    35. }
    36. // 可以加密: MD5 MD5盐值加密
    37. // 密码认证 shiro做, 密码加密了
    38. // return new SimpleAuthenticationInfo("",password,"");
    39. return new SimpleAuthenticationInfo("", user.getPwd(), "");
    40. }
    41. }

    12.4、MyController

    1. package com.zhou.controller;
    2. import org.apache.shiro.SecurityUtils;
    3. import org.apache.shiro.authc.IncorrectCredentialsException;
    4. import org.apache.shiro.authc.UnknownAccountException;
    5. import org.apache.shiro.authc.UsernamePasswordToken;
    6. import org.apache.shiro.subject.Subject;
    7. import org.springframework.stereotype.Controller;
    8. import org.springframework.ui.Model;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. @Controller
    11. public class MyController {
    12. @RequestMapping({"/", "/index"})
    13. public String toIndex(Model model){
    14. model.addAttribute("msg", "hello,shiro");
    15. return "index";
    16. }
    17. @RequestMapping("/user/add")
    18. public String add(){
    19. return "user/add";
    20. }
    21. @RequestMapping("/user/update")
    22. public String update(){
    23. return "user/update";
    24. }
    25. @RequestMapping("/toLogin")
    26. public String toLogin(){
    27. return "login";
    28. }
    29. @RequestMapping("/login")
    30. public String login(String username, String password, Model model){
    31. // 获取当前的用户
    32. Subject subject = SecurityUtils.getSubject();
    33. // 封装用户的登录数据
    34. UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    35. try{
    36. subject.login(token); // 执行登录的方法,如果没有异常就ok
    37. return "index";
    38. }catch (UnknownAccountException e){ // 用户名不存在
    39. model.addAttribute("msg", "用户名错误");
    40. return "login";
    41. }catch (IncorrectCredentialsException e){ // 密码不存在
    42. model.addAttribute("msg", "密码错误");
    43. return "login";
    44. }
    45. }
    46. }

    注意:整个项目到目前为止,需要注意一些类或接口里面的spring的注解。(很重要)

    controller类里面的@Controller

    config类里面的@Configuration

     

     mapper接口里的@Repository,@Mapper

    service实现类里的@Service

     

    调用接口时的@Autowired

  • 相关阅读:
    如何在Visual Studio Code中禁用Less文件保存时自动编译为CSS的功能
    在Jetson Nano上安装ncnn深度学习框架
    使用STM32CubeMX实现LED闪烁
    大家要的Biotin-PEG3-Br/acid/NHS ester/alcohol/amine合集分享
    java简介
    Redis缓存穿透和缓存击穿和缓存雪崩
    vCenter学习笔记
    windows服务器自带IIS搭建网站并发布公网访问【内网穿透】
    C++结构型模式-适配器模式
    【网络安全入门】学习网络安全必须知道的100 个网络基础知识
  • 原文地址:https://blog.csdn.net/qq_43880100/article/details/127411509