Springboot实现Shiro整合JWT的示例代码

下面来详细讲解如何实现Spring Boot整合Shiro和JWT的示例代码。

简介

Shiro是一个强大的安全框架,提供了多种安全特性,例如:认证、授权、加密等等。JWT是一种轻量级的认证机制,它可以使用JSON格式存储用户信息,并且可以在客户端和服务端之间传递。

本文将介绍如何通过Spring Boot实现Shiro整合JWT的示例代码。

示例1:环境搭建

首先,我们需要搭建Spring Boot的环境,具体步骤如下:

  1. 首先,需要安装Java环境,可参考官网文档下载并安装。

  2. 下载并安装Maven,可根据官网文档进行安装。

  3. 创建Spring Boot项目,可使用Spring Initializr进行创建。

  4. 在pom.xml文件中添加Shiro和JWT的依赖项,具体依赖项可参考如下代码块:

```xml

org.apache.shiro
shiro-spring
1.7.1


io.jsonwebtoken
jjwt
0.9.1

```

  1. 配置application.yml文件,具体配置可参考如下代码块:

```yml
# 数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root

# JWT配置
jwt:
secret: 123456
expireTime: 1800

# Shiro配置
shiro:
filterChainDefinitions: /login = anon\n/** = authc
loginUrl: /login
```

  1. 在WebMvcConfigurer中配置ShiroFilterFactoryBean,具体代码可参考如下代码块:

```java
@Configuration
public class ShiroConfig {

   @Autowired
   private Environment env;

   @Bean
   public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
       ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
       shiroFilterFactoryBean.setSecurityManager(securityManager);
       shiroFilterFactoryBean.setLoginUrl(env.getProperty("shiro.loginUrl"));

       Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
       filterChainDefinitionMap.put("/logout", "logout");
       filterChainDefinitionMap.putAll(parseFilterChainDefinitions(env.getProperty("shiro.filterChainDefinitions")));
       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

       return shiroFilterFactoryBean;
   }

   @Bean
   public SecurityManager securityManager(Realm realm) {
       DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
       securityManager.setRealm(realm);
       return securityManager;
   }

   @Bean
   public Realm realm() {
       JwtRealm realm = new JwtRealm();
       realm.setCredentialsMatcher(new JwtMatcher());
       return realm;
   }

   private Map<String, String> parseFilterChainDefinitions(String definitions) {
       Map<String, String> chains = new HashMap<>();
       if (StringUtils.isBlank(definitions)) {
           return chains;
       }
       String[] definitionArray = definitions.split("\\n");
       for (String definition : definitionArray) {
           String[] tmp = definition.split("=");
           if (tmp.length == 2) {
               chains.put(tmp[0].trim(), tmp[1].trim());
           }
       }
       return chains;
   }

}
```

  1. 接下来就可以开始编写业务逻辑代码了。

示例2:JWT认证

首先,我们来看一下如何使用JWT实现认证。

  1. 首先,在Shiro的Realm中实现认证逻辑,具体代码可参考如下:

```java
public class JwtRealm extends AuthorizingRealm {

   @Override
   public boolean supports(AuthenticationToken token) {
       return token instanceof JwtToken;
   }

   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
       return null;
   }

   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
       JwtToken jwtToken = (JwtToken) token;
       Claims claims = jwtToken.getClaims();
       Date expireDate = claims.getExpiration();
       if (expireDate.before(new Date())) {
           throw new AuthenticationException("Token expired");
       }
       String username = claims.getSubject();

       return new SimpleAuthenticationInfo(username, token.getCredentials(), getName());
   }

}
```

  1. 接下来,编写JWT工具类,具体代码可参考如下:

```java
public class JwtUtil {

   private static final String secret = "123456";

   public static String createToken(String subject, Date expireTime) {
       SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
       Date nowDate = new Date();
       byte[] secretBytes = DatatypeConverter.parseBase64Binary(secret);
       JwtBuilder builder = Jwts.builder().setId(UUID.randomUUID().toString())
               .setIssuedAt(nowDate)
               .setSubject(subject)
               .setExpiration(expireTime)
               .signWith(algorithm, secretBytes);
       return builder.compact();
   }

   public static Claims parseToken(String token) {
       try {
           Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(secret)).parseClaimsJws(token).getBody();
           return claims;
       } catch (JwtException e) {
           return null;
       }
   }

}
```

  1. 最后,在Controller中编写登录接口,具体代码可参考如下:

```java
@RestController
public class AuthController {

   @Value("${jwt.expireTime}")
   private Long expireTime;

   @PostMapping("/login")
   public String login(@RequestParam("username") String username,
                       @RequestParam("password") String password) {

       Subject subject = SecurityUtils.getSubject();
       UsernamePasswordToken token = new UsernamePasswordToken(username, password);
       try {
           subject.login(token);
           String jwtToken = JwtUtil.createToken(username, new Date(System.currentTimeMillis() + expireTime * 1000));
           return jwtToken;
       } catch (AuthenticationException e) {
           return "login error";
       }
   }

}
```

通过以上步骤,就可以实现使用JWT进行认证了。

总结

本文通过示例介绍了如何通过Spring Boot实现Shiro整合JWT的示例代码,其中包括环境搭建、JWT认证等步骤,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot实现Shiro整合JWT的示例代码 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue插件从封装到发布的完整步骤记录

    当想要向其他开发者分享自己开发的 Vue 插件时,把它发布成独立的插件包是一种非常好的方式。下面是 Vue 插件从封装到发布的完整步骤记录: 步骤一:创建插件 创建一个项目文件夹,并在这个文件夹里利用 npm init 命令创建一个包描述文件(package.json)。 npm init 安装 Vue 及编写插件代码:在项目文件夹内,使用 npm inst…

    Vue 2023年5月28日
    00
  • 保姆级Vue3开发教程分享

    保姆级Vue3开发教程分享 Vue3 是最新的 Vue.js 版本,它实现了很多值得注意的新特性,包括 Composition API、Teleport、Suspense 等。本教程将详细讲解 Vue3 的开发流程。 安装 Vue3 安装 Vue3 的方法是使用 npm。打开命令行界面并输入以下命令: npm install vue@next 创建 Vue3…

    Vue 2023年5月28日
    00
  • vue组件实现文字居中对齐的方法

    为了在Vue中实现文字居中对齐,我们可以使用CSS来为Vue组件设置样式。在Vue中设置样式的方法可以通过<style>标签来实现。 以下是两种示例说明: 示例一:使用flex 一种常见的设置文字居中对齐的方法是使用flexbox布局。在Vue组件中,我们可以为其容器添加.center类,通过CSS样式中的display: flex和align-…

    Vue 2023年5月28日
    00
  • vue中axios封装使用的完整教程

    下面我将详细讲解一下“vue中axios封装使用的完整教程”。 一、什么是axios axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 上,这个库可以结合 Vue.js 实现 AJAX 请求。 二、axios的安装和引入 使用 axios 首先我们需要安装它: npm install axios 然后我们在需要使用的…

    Vue 2023年5月28日
    00
  • Vue源码makeMap函数深入分析

    OK,让我来详细讲解“Vue源码makeMap函数深入分析”的完整攻略。 标题 Vue源码makeMap函数深入分析 简介 首先,我们需要知道 makeMap 是什么,它是 Vue 源码中常用的一个函数,主要用于生成一个对象,对象中的 key 都是小写的字符串,同时这些 key 都对应着 true 这个固定的值。makeMap 函数是 Vue 源码中非常重要…

    Vue 2023年5月27日
    00
  • Vue 两个字段联合校验之修改密码功能的实现

    首先我们来讲解一下什么是“Vue 两个字段联合校验”以及它的实现原理。 什么是“Vue 两个字段联合校验”? “Vue 两个字段联合校验”是指在表单中,两个或多个字段之间的值需要相互校验,如密码和确认密码之间的校验,也就是输入的密码和确认密码要一致。如果出现了不一致的情况,我们需要在页面上提示用户错误信息,并阻止表单的提交。 实现原理 实现两个字段联合校验的…

    Vue 2023年5月28日
    00
  • Vue3使用路由及配置vite.alias简化导入写法的过程详解

    下面就来详细讲解一下“Vue3使用路由及配置vite.alias简化导入写法的过程详解”。 一、前置准备 在开始使用路由及配置vite.alias之前,需要先安装Vue3及Vue Router。使用命令行工具安装: npm install vue@next vue-router@4 –save 同时,还需要使用Vite作为打包工具。同样使用命令行工具安装:…

    Vue 2023年5月28日
    00
  • Vue3搭建组件库开发环境的示例详解

    为了搭建Vue3组件库开发环境,我们可以按照以下步骤进行: 安装vue-cli并初始化项目 首先我们需要在本地安装vue-cli,使用npm安装即可: npm install -g @vue/cli 安装完成后,我们可以使用下面的命令初始化一个新的vue项目: vue create my-project 安装必要依赖 在项目根目录下执行以下命令安装必要的依赖…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部