栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot整合Shiro学习(下)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot整合Shiro学习(下)

SpringBoot整合Shiro(下)

基于【编程不良人】2020最新版Shiro教程,整合SpringBoot项目实战教程

哔哩哔哩链接:https://www.bilibili.com/video/BV1uz4y197Zm?p=1

在中篇中我们已经了解到shiro对jsp页面有很好的集成,但是与thymeleaf却没有,需要我们引入相关的依赖和配置才可以。接下来我们将学习shiro与thymeleaf的整合。

九、Shiro与thymeleaf整合 1.新建springboot项目

此处以ideal为例,我们新建一个springboot项目,

配置项目信息,

引入依赖,

对项目进行命名等配置,

2.引入依赖

创建好项目后,我们需要引入更多依赖,我们打开pom.xml文件,具体代码如下:



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.2.RELEASE
         
    
    com.example
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot
    
        1.8
    
    
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
        
            com.github.theborakompanioni
            thymeleaf-extras-shiro
            2.0.0
        
        
        
            org.apache.shiro
            shiro-spring-boot-starter
            1.5.3
        
        
        
            org.apache.shiro
            shiro-ehcache
            1.5.3
        
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
        
            com.alibaba
            fastjson
            1.2.70
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.1.2
        
        
        
            mysql
            mysql-connector-java
            8.0.23
        
        
        
            com.alibaba
            druid
            1.1.19
        

        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    


3.书写项目配置文件

我们很多配置都是和之前一样的,此处只需要将jsp的配置改为thymeleaf的配置即可,具体如下:

server.port=8080
server.servlet.context-path=/shiro
spring.application.name=shiro
# 关闭thymeleaf的缓存,方便测试,在项目上线时需要改为true
spring.thymeleaf.cache=false
# thymeleaf的很多配置都有默认值,基本上不用我们做很多配置
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/

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

mybatis.type-aliases-package=com.example.demo.entity
mybatis.mapper-locations=classpath:mapper
    @RequestMapping("loginView")
    public String toLogin(){
        return "login";
    }

    
    @RequestMapping("registerView")
    public String toRegister(){
        return "register";
    }

    
    @RequestMapping("indexView")
    public String toIndex(){
        return "index";
    }

    
    @RequestMapping("test")
    @ResponseBody
    public String test() {
        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
        System.out.println(redisTemplate);
        
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        // Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        // 使用Fastjson2JsonRedisSerializer来序列化和反序列化redis的value值
        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

        // Jackson之ObjectMapper对象的使用: https://blog.csdn.net/qq_41834086/article/details/111152470
        ObjectMapper mapper = new ObjectMapper();
        // ALL:此伪类型表明所有访问器都受到影响。ANY:所有类型的访问修饰符都是可接受的,从私有到公有。
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(LaissezFaireSubTypevalidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        serializer.setObjectMapper(mapper);
        // 使用Jackson2JsonRedisSerializerr来序列化和反序列化redis的value值
        redisTemplate.setValueSerializer(serializer);
        
        User tom = userService.findByUserName("tom");
        redisTemplate.opsForValue().set("123",tom);
        return "ok";
    }

    
    @RequestMapping("logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();//退出用户
        return "redirect:/user/loginView";
    }

    
    @RequestMapping("login")
    public String login(String username, String password, String code, HttpSession session) {
        //比较验证码
        String codes = (String) session.getAttribute("code");
        try {
            
            // 获取主体对象
            if (codes.equalsIgnoreCase(code)) {
                Subject subject = SecurityUtils.getSubject();
                // 在认证过程中使用subject.login进行认证, UsernamePasswordToken将用户名密码封装为token
                subject.login(new UsernamePasswordToken(username, password));
                return "redirect:/user/indexView";
            }else {
                throw new RuntimeException("验证码错误!");
            }
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            System.out.println("用户名错误!");
        } catch (IncorrectCredentialsException e) {
            e.printStackTrace();
            System.out.println("密码错误!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
        return "redirect:/user/loginView";
    }

    
    @RequestMapping("register")
    public String register(User user) {
        try {
            userService.register(user);
            return "redirect:/user/loginView";
        }catch (Exception e){
            e.printStackTrace();
            return "redirect:/user/registerView";
        }
    }

    
    @RequestMapping("save")
    public String save(){
        //基于角色
        //获取主体对象
        Subject subject = SecurityUtils.getSubject();
        //代码方式
        if (subject.hasRole("admin")) {
            System.out.println("有admin角色!");
        }else{
            System.out.println("无admin角色!");
        }
        //基于权限字符串
        
        if (subject.isPermittedAll("user:*")){
            System.out.println("拥有user:*权限");
        }else {
            System.out.println("没有user:*权限");
        }
        return "redirect:/user/indexView";
    }

    
    @RequestMapping("save2")
    // @RequiresRoles(value={"admin","user"})//用来判断角色,这里表示同时具有 admin user 角色才能进行此方法
    // 用来判断权限字符串,这里表示user:update:01才能进入此方法(如果是user:*:*(可以简写为user:*)或者*:*:*(全部角色)也可进入此方法)
    @RequiresPermissions("user:update:01")
    public String save2(){
        System.out.println("进入了此方法");
        return "redirect:/user/indexView";
    }

    
    @RequestMapping("getImage")
    public void getImage(HttpSession session, HttpServletResponse response) throws IOException {
        // 生成4位验证码
        String code = VerifyCodeUtils.generateVerifyCode(4);
        // 验证码放入session
        session.setAttribute("code",code);
        // 以response响应流的形式将验证码存入图片
        ServletOutputStream os = response.getOutputStream(); // 拿到响应流
        // 给响应流设置响应类型
        response.setContentType("image/png");
        VerifyCodeUtils.outputImage(220, 60, os, code);
    }
}

2.修改shiro配置

我们打开ShiroConfig.java文件,放行UserController.java更改后的请求和界面

具体代码如下:

package com.example.demo.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.example.demo.cache.RedisCacheManager;
import com.example.demo.realm.CustomerRealm;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


@Configuration
public class ShiroConfig {
    // 1.创建shiroFilter , 负责拦截所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 给filter设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        // 配置系统受限资源 和 配置系统公共资源
        Map map = new HashMap();
        // key为系统资源的路径,anon 表示设置为公共资源,它是一个filter
        map.put("/user/login","anon");// 放行登录请求
        map.put("/user/register","anon");// 放行注册请求
        map.put("/user/test","anon");// 测试自定义的序列化方式
        map.put("/user/getImage","anon");// 验证码请求放行
        map.put("/user/loginView","anon");// 放行登录界面跳转请求
        map.put("/user/registerView","anon");// 放行注册界面跳转请求
        map.put("/login.html","anon");// 放行注册界面
        map.put("/register.html","anon");// 放行注册界面
        map.put("/user/indexView","authc"); // authc 表示请求这个资源需要认证和授权,它是一个filter
        map.put("
    @Bean(name = "shiroDialect")
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }
}

3.将jsp页面更改为html页面,此处需要注意的是我们需要引入thymeleaf和shiro的命名空间,即


此处我们先扩展shiro与thymeleaf整合常见权限控制标签使用:

5.常见权限控制标签使用

Please login

Welcome back John! Not John? Click here to login.

Hello, , how are you today?

Update your contact information

Hello, , how are you today?

Please login in order to update your credit card information.

Administer the system

Sorry, you are not allowed to developer the system.

You are a developer and a admin.

You are a admin, vip, or developer.

添加用户

Sorry, you are not allowed to delete user accounts.

You can see or add users.

You can see or delete users.

Create a new User

了解了之后,我们书写代码,具体代码如下:

index.html




    
    
    
    主页


系统主页

Hello, , how are you today?

退出登录

login.html




    
    Title


登录界面

用户名:
密 码 :
请输入验证码:

前往注册

register.html




    
    Title


注册界面

用户名:
密 码 :

返回登录
6.加入shiro的方言配置
  • 页面标签不起作用一定要记住加入方言处理

  • 之后我们还要引入shiro的方言配置,因为thymeleaf与shiro结合后默认是没有解析shiro的方言的,所以页面上的shiro页面标签不起作用,我们打开ShiroConfig.java文件,加入以下代码,

@Bean(name = "shiroDialect")
public ShiroDialect shiroDialect(){
    return new ShiroDialect();
}

重启项目,进行登录,登录成功。

源码获取

至此,我们的SpringBoot整合Shiro就讲解完成了。源码和数据库文件可以通过关注我的微信公众号 我爱学习呀嘻嘻 ,回复关键字“shiro集成”进行获取哦。

SpringBoot整合Shiro学习(上)

SpringBoot整合Shiro学习(中)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/585242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号