入门shiro(感觉成功了)首先感谢狂神,然后我就一本正经的复制代码了

项目结构

运行效果

数据库


  1. <dependencies>
  2. <!-- thymeleaf-shiro整合包 -->
  3. <dependency>
  4. <groupId>com.github.theborakompanioni</groupId>
  5. <artifactId>thymeleaf-extras-shiro</artifactId>
  6. <version>2.0.0</version>
  7. </dependency>
  8.  
  9. <!--快速生成pojo的方法有关的lombok-->
  10. <dependency>
  11. <groupId>org.projectlombok</groupId>
  12. <artifactId>lombok</artifactId>
  13. <version>1.16.10</version>
  14. </dependency>
  15. <!-- 引入 myBatis,这是 MyBatis官方提供的适配 Spring Boot 的,而不是Spring Boot自己的-->
  16. <dependency>
  17. <groupId>org.mybatis.spring.boot</groupId>
  18. <artifactId>mybatis-spring-boot-starter</artifactId>
  19. <version>2.1.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>mysql</groupId>
  23. <artifactId>mysql-connector-java</artifactId>
  24. <version>8.0.15</version>
  25. </dependency>
  26. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  27. <dependency>
  28. <groupId>com.alibaba</groupId>
  29. <artifactId>druid</artifactId>
  30. <version>1.1.12</version>
  31. </dependency>
  32. <!-- https://mvnrepository.com/artifact/log4j/log4j -->
  33. <dependency>
  34. <groupId>log4j</groupId>
  35. <artifactId>log4j</artifactId>
  36. <version>1.2.17</version>
  37. </dependency>
  38. <!--
  39. Subject 用户,
  40. SecurityManager 管理所有用户,
  41. Realm 连接数据,需要自定义
  42. -->
  43. <!--shiro整合spring的包-->
  44. <dependency>
  45. <groupId>org.apache.shiro</groupId>
  46. <artifactId>shiro-spring</artifactId>
  47. <version>1.4.0</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-web</artifactId>
  52. </dependency>
  53.  
  54. <!--thymeleaf模板-->
  55. <dependency>
  56. <groupId>org.thymeleaf</groupId>
  57. <artifactId>thymeleaf-spring5</artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.thymeleaf.extras</groupId>
  61. <artifactId>thymeleaf-extras-java8time</artifactId>
  62. </dependency>
  63.  
  64. <dependency>
  65. <groupId>org.springframework.boot</groupId>
  66. <artifactId>spring-boot-starter-test</artifactId>
  67. <scope>test</scope>
  68. <exclusions>
  69. <exclusion>
  70. <groupId>org.junit.vintage</groupId>
  71. <artifactId>junit-vintage-engine</artifactId>
  72. </exclusion>
  73. </exclusions>
  74. </dependency>
  75. </dependencies>
  1. ShiroConfig.class
  1.  
  1. @Configuration
  2. public class ShiroConfig {
  3. //ShiroFilterFactoryBean 第三步
  4. @Bean
  5. public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
  6. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  7. //设置安全管理器
  8. shiroFilterFactoryBean.setSecurityManager(securityManager);
  9. /*
  10. 添加shiro的内置过滤器
  11. anon:无须认证就可以访问
  12. authc:必须认证了才可以访问
  13. perms:拥有对某个资源的权限才能访问
  14. role:拥有某个角色才可以访问
  15. */
  16. Map<String, String> filterMap = new LinkedHashMap();
  17. // filterMap.put("/user/add","authc");
  18. // filterMap.put("/user/update","authc");
  19. filterMap.put("/user/add","perms[user:add]");
  20. filterMap.put("/user/update","perms[user:update]");
  21. filterMap.put("/user/*","authc");
  22.  
  23. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
  24. //设置跳转到登录页面
  25. shiroFilterFactoryBean.setLoginUrl("/toLogin");
  26. //设置到未授权页面
  27. shiroFilterFactoryBean.setUnauthorizedUrl("/noauth");
  28.  
  29. return shiroFilterFactoryBean;
  30. }
  31.  
  32. //DefaultWebSecurityManager 第二步
  33. @Bean(name = "securityManager")
  34. public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
  35. DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
  36. //关联realm
  37. securityManager.setRealm(userRealm);
  38. return securityManager;
  39. }
  40. //创建realm 域对象,需要自定义 第一步
  41. @Bean(name = "userRealm")
  42. public UserRealm getUserRealm(){
  43. return new UserRealm();
  44. }
  45.  
  46. //shiro 整合thymeleaf
  47. @Bean
  48. public ShiroDialect getShiroDialect(){
  49. return new ShiroDialect();
  50. }
  51. }

UserRealm.class

  1. public class UserRealm extends AuthorizingRealm {
  2. @Autowired
  3. private UserService userService;
  4. @Override //授权
  5. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  6. System.out.println("-----授权了-----AuthorizationInfo");
  7. SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
  8. // info.addStringPermission("user:add");
  9. //从数据库查权限
  10. Subject subject = SecurityUtils.getSubject();
  11. User currentUser = (User) subject.getPrincipal();//其实就是拿认证成功的时候的那个user
  12. info.addStringPermission(currentUser.getPerms());
  13.  
  14. return info;
  15. }
  16.  
  17. @Override //认证
  18. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  19. System.out.println("-----认证了-----AuthenticationInfo");
  20. UsernamePasswordToken userToken = (UsernamePasswordToken) token;
  21. //用户名,密码去数据库取
  22. User user = userService.queryUserByUsername(userToken.getUsername());
  23. if (user==null){ //没有这个人
  24. return null; //其实就是抛出UnknownAccountException异常
  25. }
  26. //之后密码认证,shiro 它自己会做
  27. SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(user,user.getPassword(),"");
  28. Subject currentSubject = SecurityUtils.getSubject();
  29. Session session = currentSubject.getSession();
  30. session.setAttribute("loginUser",user);
  31. return info;
  32. }
  33. }

MyController.class

  1. @Controller
  2. public class MyController {
  3. @RequestMapping({"/","/index"})
  4. public String toIndex(Model model){
  5. model.addAttribute("msg","hello shiro!!!");
  6. return "index";
  7. }
  8. @RequestMapping("/user/add")
  9. public String add(){
  10. return "user/add";
  11. }
  12. @RequestMapping("/user/update")
  13. public String update(){
  14. return "user/update";
  15. }
  16. @RequestMapping("/toLogin")
  17. public String toLogin(){
  18. return "login";
  19. }
  20. @RequestMapping("/login")
  21. public String login(String username,String password,Model model){
  22. //获取当前输入的用户
  23. Subject subject = SecurityUtils.getSubject();
  24. //封装用户的数据
  25. UsernamePasswordToken token = new UsernamePasswordToken(username,password);
  26. //登录,没有异常就说明登录成功
  27. try {
  28. subject.login(token);
  29. return "index";
  30. } catch (UnknownAccountException e) {
  31. model.addAttribute("msg","用户名错误");
  32. return "login";
  33. }catch (IncorrectCredentialsException e){
  34. model.addAttribute("msg","密码错误");
  35. return "login";
  36. }
  37. }
  38. //没授权
  39. @RequestMapping("/noauth")
  40. @ResponseBody
  41. public String unauthorized(){
  42. return "没经授权无法进入";
  43. }
  44. //退出
  45. @RequestMapping("/logout")
  46. public String logout(){
  47. Subject currentUser = SecurityUtils.getSubject();
  48. currentUser.logout();
  49. System.out.println("退出了");
  50. return "login";
  51. }
  52. }

User.class

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class User {
  5. private int id;
  6. private String username;
  7. private String password;
  8. private String perms;
  9. }

UserMapper.class

  1. @Mapper
  2. @Repository
  3. public interface UserMapper {
  4. public User queryUserByUsername(String username);
  5. }

UserService.class

  1. public interface UserService {
  2. public User queryUserByUsername(String username);
  3. }

UserServiceImpl.class

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Override
  6. public User queryUserByUsername(String username) {
  7. return userMapper.queryUserByUsername(username);
  8. }
  9. }

UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.kuang.mapper.UserMapper">
  7. <select id="queryUserByUsername" parameterType="String" resultType="User">
  8. select * from user where username=#{username}
  9. </select>
  10. </mapper>

application.properties

  1. mybatis.type-aliases-package=com.kuang.pojo
  2. mybatis.mapper-locations=classpath:mapper/*.xml

application.yml

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

index.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org"
  3. xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>shiro</title>
  7. </head>
  8. <body>
  9. <h1>首页</h1>
  10. <div th:if="${session.loginUser==null}">
  11. <a th:href="@{/toLogin}">登录</a>
  12. </div>
  13. <p th:text="${msg}"></p>
  14. <hr/>
  15.  
  16. <div shiro:hasPermission="user:add">
  17. <a th:href="@{/user/add}">add</a>
  18. </div>
  19. <div shiro:hasPermission="user:update">
  20. <a th:href="@{/user/update}">update</a>
  21. </div>
  22. <div th:if="${session.loginUser}">
  23. <p><a th:href="@{/logout}">退出</a></p>
  24. </div>
  25. </body>
  26. </html>

login.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>shiro登录</title>
  6. </head>
  7. <body>
  8. <div>
  9. <p th:text="${msg}" style="color: red"></p>
  10. <form method="get" th:action="@{/login}">
  11. <p>用户名:<input type="text" name="username"></p>
  12. <p>密 码:<input type="text" name="password"></p>
  13. <p><input type="submit" value="登录"></p>
  14. </form>
  15. </div>
  16. </body>
  17. </html>

add.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>增加</title>
  6. </head>
  7. <body>
  8. <h2>add</h2>
  9. </body>
  10. </html>

update.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>更新</title>
  6. </head>
  7. <body>
  8. <h2>update</h2>
  9. </body>
  10. </html>

总结一下:首先搭建好环境是关键:springboot--》MVC--》mybatis,然后进行shiro的过滤,认证,授权。。。

主要理解好

  1. ShiroConfig
  1. ShiroFilterFactoryBean
  1. setFilterChainDefinitionMap()
  1. DefaultWebSecurityManager
    自定义域 UserRealm 继承 AuthorizingRealm
  1. AuthorizationInfo SimpleAuthenticationInfo
  1. AuthenticationInfo    SimpleAuthorizationInfo
  1. UsernamePasswordToken
  1. SecurityUtils
  1. getSession()
  1. getSubject()
  1. getPrincipal()
  1. AuthenticationToken
  2.  
  3. 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

shiro学习(五、springboot+shiro+mybatis+thymeleaf)的更多相关文章

  1. mybatis源码学习(四)--springboot整合mybatis原理

    我们接下来说:springboot是如何和mybatis进行整合的 1.首先,springboot中使用mybatis需要用到mybatis-spring-boot-start,可以理解为mybati ...

  2. 【Shiro学习之一】Shiro入门

    一.Shiro Apache Shiro是一个Java安全框架. 1.官网:http://shiro.apache.org/ 2.三个核心组件 Subject:即“当前操作用户”,可以指人.第三方进程 ...

  3. spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid

    SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...

  4. Shiro Demo:SpringBoot+Shiro+Druid+MyBatis

    访问start.spring.io生成项目: 然后选择依赖: pom.xml: <?xml version="1.0" encoding="UTF-8"? ...

  5. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  6. SpringBoot学习(五)-->SpringBoot的核心

    SpringBoot的核心 1.入口类和@SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的J ...

  7. shiro系列五、shiro密码MD5加密

    Shiro-密码的MD5加密   1.密码的加密 在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密 ...

  8. 【Shiro学习之六】shiro编码/加密

    apahce shiro:1.6.0 密码存储,应该加密/生成密码摘要存储,而不是存储明文密码. 1.编码/解码Shiro 提供了 base64和 16进制字符串编码/解码的API支持, 方便一些编码 ...

  9. springboot学习笔记:11.springboot+shiro+mysql+mybatis(通用mapper)+freemarker+ztree+layui实现通用的java后台管理系统(权限管理+用户管理+菜单管理)

    一.前言 经过前10篇文章,我们已经可以快速搭建一个springboot的web项目: 今天,我们在上一节基础上继续集成shiro框架,实现一个可以通用的后台管理系统:包括用户管理,角色管理,菜单管理 ...

  10. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例

    1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...

随机推荐

  1. 数据库 | Redis 缓存雪崩解决方案

    Redis 雪崩 缓存层承载着大量的请求,有效保护了存储层.但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景. 解决缓存雪崩,可以从 ...

  2. js 操作select和option常见用法

    1.获取选中select的value和text,html <select id="mySelect"> <option value="1"&g ...

  3. 深度学习之DCGAN

    1.知识点 """ DCGAN:相比GAN而言,使用了卷积网络替代全连接 卷积:256*256*3 --- > 28*28*14 -->结果 ,即H,W变小, ...

  4. PCD(点云数据)文件格式

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=54 为什么用一种新的文件格式? PCD文件格式并非白费力气地做重复工作,现有 ...

  5. Java中非静态成员变量、静态成员变量的初始化时机

    转: Java中非静态成员变量.静态成员变量的初始化时机. 2018年05月22日 11:48:11 SilenceCarrot 阅读数 421   版权声明:技术就要分享才有意思,欢迎大家分享(注明 ...

  6. 前端需要掌握的Babel知识

    Babel 是怎么工作的 Babel 是一个 JavaScript 编译器. 做与不做 注意很重要的一点就是,Babel 只是转译新标准引入的语法,比如: 箭头函数 let / const 解构 哪些 ...

  7. postgres serial创建自增列

    Sequence是数据库中一类特殊的对象,其用于生成唯一数字标识符.一个典型的应用场景就是手动生成一系列主键.Sequence和MySQL中的AUTO_INCREMENT的概念很像. 创建序列Sequ ...

  8. 【数学建模】线性规划各种问题的Python调包方法

    关键词:Python.调包.线性规划.指派问题.运输问题.pulp.混合整数线性规划(MILP) 注:此文章是线性规划的调包实现,具体步骤原理请搜索具体解法.   本文章的各个问题可能会采用多种调用方 ...

  9. 阿里云Centos7挂载数据盘

    查看磁盘情况 fdisk -l fdisk /dev/vdb 根据提示,分别输入 n. p. . enter.enter.wq fdisk -l mkfs.ext3 /dev/vdb1 挂载磁盘,写入 ...

  10. Kettle实现从mysql中取2张表数据关联的数据,并写入到mongodb中

    1 建立转换,并设置DB连接到mysql 选中DB连接:连接类型选择MySQL,输入主机名称,数据库名称,端口号,用户名,密码 输入连接名称,点击确定.(可以先点击测试,测试一下是否连接成功) 如下图 ...