Spring Boot安全机制

使用Spring Boot整合JJWT实现认证登录

1.首先在数据库创建用户信息表t_user,其表结构如下:

2.创建用户信息表脚本及初始化脚本,代码如下:

-- 创建数据表:t_user
DROP TABLE IF EXISTS t_user;
CREATE TABLE IF NOT EXISTS t_user;
(
id INT PRIMARY KEY COMMENT'用户ID(主键)',
name VARCHAR(255) UNIQUE NOT NULL COMMENT,'用户名',
pwd VARCHAR(20) NOT NULL COMMENT,'登录密码'
)
COMMENT='用户信息表';
INSERT INTO t_user(id,name,pwd)
VALUE(1,'zhangsan','123');

3.创建一个名为jwtauthenticcationtest的Spring Boot项目

在pom.xml文件引入JJWT、Mybatis、Knife4j等依赖,代码如下

<!--引入JJWT 依赖--
<dependency>
<groupId>io.jsonwebtoken</qroupId
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--引人MyBatis 依赖--><dependency>
<groupId>org.mybatis.spring.boot</groupid
<artifactId>mybatis-spring-boot-starter</artifactIdx
<version>2.1.3</version>
</dependency>
<!--引人 Lombok 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--引人 Druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId><artifactId>druid</artifactId>
<version>1.1.19</version></dependency>
<!--引入Mysql 依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId></dependency><!--引人 knife4j依赖-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.3</version>
</dependency>

4.在application.properties配置文件中编写数据库连接信息并对MyBatis进行配置,代码如下

#应用名称
spring.application.name=jwtauthenticationtest
#应用服务 web 访问端口
server.port=8989
spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=truesserverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123
mybatis.type-aliases-package=cn.js.ccit.pojo
mybatis.mapper-locations=classpath:cn/js/ccit/mapper/*.xmllogging.level.com,baizhi.dao=debug

5.在cn.js.ccit.pojo包中创建实体类User,代码如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@NoArgsConstructor
CAllArgsConstructor
@Data
@Accessors(chain=true)
public class User {
private String id;
private String name;
private String pwd;
}

6.在cn.js.ccit.mapper包中创建UserMapper接口,定义一个login方法,代码如下:

@Mapper
@Repository
public interface UserMapper{
    User login(User user);
}

在res

<!DOCTYPE mapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.js.ccit.mapper.UserMapper"><!-- User login(User user);--><select id="login”parameterType="cn.js.ccit.pojo.User"resultType="cn.js.ccit.pojo.User">
select *from t user where name=#(name and pwd = #{pwd</select>
</mapper>

7.在cn.js.ccit.service包中创建UserService接口及其实现类UserServiceImpl,代码如下:

ources/cn/js/ccit/mapper 目录下创建UserMapper.xml文件,代码如下:

public interface UserService {
User login(User user);//登录
Service
@Transactional
public class UserServiceImpl implements UserService@Autowired
private UserMapper userMapper;
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public User login(User user)
//根据接收的用户名和密码查询数据库
User userDB = userMapper,login(user);if(userDB!=nul1)(
return userDB;
throw new RunException("登录失败!);
}
}

8.在cn.js.ccit.utils包中创建JWTUtils工具类,代码如下:

import cn.js.ccit.exception.RunException;1mport 1o.jsonwebtoken.*
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@Slf4j
public class wTutils lprivate static ffnal String key = "token16546461"//名时使用的密钥
迎生成Token,即Header.PayLoad,Signature
public static String getToken (Map<String, object> clalms) (0/
// WT 的签发时间long nowMiIlis  System.currentTimeM11lis()/
Date nowmnew Date(nowMillis);
// 指定签名的时权使用的签名算法
SignatureAlgorithm signatureAlgotithm - SignatureAlgorithm.HS256;//默认设置7天过期
longexpM1111s=nowMi1l1s+604800000L/
Date expirationDate=new Date(expMillis);
String token = Jwta,builder()//创建JWT Builder
.setClaims(claims)
.setId(uuID.randomUUID().toString())//JWT唯一标识
,setIssuedAt(now)// 签发时间
setExpiration(expirationDate)//过期时间
.signWith(signatureAlgotithm, key)//设置签名使用的算法和密销
.compact ();
return token;
00
·对Token进行解析
0/
Public static Claims parseJwt(String token) throws Exception {String msg=null;Ceyl
Claims claims=Jwts,parser().setAllowedclockSkewSeconds(604800)//允许7天的偏移setSigningKey(key)//设置签名密钥
·paxseClaimsJws(token)getBody();//设置需要解析的JWT
return claims;
)catch(SignatureException se) (
msg-“密钥错误”;
log.error(mag, se)/
throw new RunExCeption (msg);
icatch (MalformedJwtException me)
mug -“密钥算法或者密钥转换错误”;
log.error(msg; me):
throw new RunException (msg);
catch (MisaingClaimException mee) (
msg““密钢缺少校验数据“;
log.error(msg, mce);
throw new RunException(msg);
}catch (ExpiredJwtException mce)msg =“密钥已过期";
log.error(msg,mce);
throw new RunException(msg);}catch (JwtException jwte) {msg =“密钥解析错误”;log.error(msg,jwte);
throw new RunException(msg);
}}}

9.在cn.js.ccit.controller包中创建Controller类,实现用户登录并测试Token解析功能,代码如下:

@Api(tags=“登录”)
RestController
@slf4i
public class UserController {@Autowired
private UserService userService;@ApiOperation(value =“登录接口”)@GetMapping("/user/login")
public Map<String, Object> login(User user) [log.info("用户名: [[J]",user.getName());log.info("密码: [{J]",user.getPwd());Map<String, Object> map = new HashMap<>();tryl
User userDB = userService.login(user);Map<String, Object> payload = new HashMap<>();payload.put("id",userDB.getId());payload.put("name",userDB.getName ());//生成 JWT 的 Token
String token = JWTUtils.getToken(payload);
map.put("state",true);
map.put("msg",“登录成功");
map.put("token",token);//响应 Token) catch (Exception e) {map.put("state",false);
map.put("msg",e.getMessage());
return map;
@ApiOperation(value = “测试接口”@PostMapping("/user/test")public Map<String, Object> test (HttpServletRequest request) throws ExceptionMap<String,Object> map = new HashMap<>();String token = request.getHeader("token");try l
Claims claims = JWTUtils.parseJwt(token);
log.info("用户id:[{J]",claims.get("id"));log.info("用户name: [{)]",claims.get("name"));
map.put("state",true);
"请求成功!");map.put("msg",] catch (RunException e)[
map.put("staterfalse);
map.put("msg",e.getMessage());
//处理自己的业务逻辑
return map;
}
}

10.使用knife4j进行在线测试,在cn.js.ccit.config包中创建SwaggerConfiguration类,完成相关配置,代码如下:

@Configuration
@EnableSwagger2
CEnableknife4j
@Import (BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {
@Bean
public Docket createRestApi() (
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
apis(RequestHandlerSelectors.
basePackage("cn.js.ccit.controller"))
paths(PathSelectors.any())
.build();
private ApiInfo apiInfo()(return new ApiInfoBuilder()title("JWT 登录认证")
description("JWT 登录认证API")
termsOfServiceUrl("http://localhost:8989/").version("1.0").build();
}
}

运行该项目,没有报错

11.在浏览器中访问 http://localhost:8989/doc.html 进行登录测试

输入用户名和密码

可以发现登录成功了,我们在试试reg1的功能

输入士大夫 密码123 tel为打

我们可以发现变成这样了:

深刻的反思

迪克发生六点房间阿里山打开飞机拉萨扩大解放拉萨大家法拉盛的肌肤拉克丝的积分拉萨的飞机奥斯丁金佛i我i饥饿反阿斯顿阿里山扩大就发哦色咖啡机奥斯丁法律上的放假啦空手道解放拉萨大家佛文件阿萨大家法律上飞机欧文金佛阿斯顿就法律上的飞机欧文i挨饿就爱上对方阿萨 

世界的分厘卡圣诞节发奥斯卡大奖flask的肌肤啊power警方让欧普请问房间阿里山的激发了上空的飞机哦i安慰剂法律上看到发是发就爱上了对方就爱上了的飞机阿斯兰的发生了爱丽丝地方阿斯顿阿萨大撒旦发射点发爱上了打赏达拉斯发生死了

阿斯利康的飞机阿里山扩大飞机阿斯利康大家发老师肯定附件阿里山扩大阿斯蒂芬就爱上了的

士大夫就爱上对方就拉萨大家发阿斯利康的飞机拉萨扩大解放了啊开始大幅拉升对方卢卡斯的分厘卡士大夫asd发生的啊拉克丝的积分卢卡斯大家发生的纠纷拉萨扩大解放拉萨扩大解放爱上了对方拉萨的飞机拉萨扩大解放两岸三地flask京东方拉萨大家发拉克丝的风景爱丽丝的开发工具拉萨快递费卢卡斯的法律上看到lkas

Spring Boot安全机制-CSDN博客

阿 发士大夫阿斯蒂芬 

撒旦联发算了看到法律上的风景爱上了对方机阿里山的发是发阿萨


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值