1.什么是JWT
JWT 是一个开发标准,用于在各方之间以JSON对象安全地传输信息,在数据传输过程中还可以完成数据加密、签名等相关处理,读者可以登录其官网查看相关介绍。
使用JWT可实现的两个功能。
(1).授权
授权是使用JWT可实现的常见功能。一旦用户登录,每个后续请求均将包括JWT,而允许用户访问该JWT允许的路由、服务和资源。单点登录是当今使用JWT可以实现一项广泛功能,因为它的开销很小并且可以在不同的域中轻松使用。
(1).信息交换
使用JWT是在各方之间安全地传输信息的好方法,因为可以对JWT进行签名,如用公钥/私钥对,可以确保发件人是所确定的人。此外,由于签名是使用标头和有效负计算的,因此还可以验证信息内容是否遭到篡改。
使用Sping Boot 整合JJWT实现登录认证。
创建用户信息表脚本及初始化脚本,代码如下。
DROP TABLE IF EXISTS t user;CREATE TABLE IF NOT EXISTS t user
id INT PRIMARY KEY COMMENT用户ID(主键),nameVARCHAR(255) UNIQUE NOT NULL COMMENT,用户名'
pwd VARCHAR(20) NOT NULL COMMENT登录密码')COMMENT =用户信息表’;INSERT INTO t user(id,name,pwd)
VALUE(1,'zhangsan','123');
创建一个名为jwtauthenticationtest的 Spring Boot 项目。
在pom.xml文件中引人JJWT、MyBatis、knife4j等依赖,代码如下。
<!--引人 JJWT 依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>ijwt</artifactId><version>0.9.1</version></dependency><!--引人MyBatis 依赖-->
<dependency>
<groupId>org.mybatis,spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version></dependency>
<!--引人 Lombok 依赖--><dependency>
<groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
在application.properties配置文件中编写数据库连接信息并对MyBatis进行配置代码如下。
#应用名称
spring.application.name=jwtauthenticationtest
#应用服务web访问端口
server.port=8989
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/mybatis?
useUnicode=truescharacterEncoding=utf8s
nullCatalogMeansCurrent=truebserverTimezone=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/*.xml
在cnjs.ccitpojo包中创建实体类 User,代码如下。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental,Accessors;
@NoArgsConstructor
GAllArgsConstructor
@Data
@Accessors(chain=true)
public class User {
private String id;
private String name;
private String pwd;
在cn,js.ccit.mapper 包中创建 UserMapper 接口,定义一个 login 方法,代码如下。
@Mapper
@Repository
public interface UserMapperUser login(User user);
在resources/cn/js/ccit/mapper 目录下创建 UserMapper.xml文件,代码如下。
<IDOCTYPE mapperPUBLIC“-//mybatis.org//DTD Mapper 3.0//EN"nhttp://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>
在cnjs.ccit.service 包中创建 UserService 接口及其实现类 UserServicelmpl,代码如下。
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("登录失败“!);
}
}
在cn.js.ccit.utils 包中创建JWTUtils 工具类,代码如下。
import cn.js.ccit.exception,RunException;
import io.jsonwebtoken.*;import lombok.extern,s1f4j.Slf4j;
import java.util.Date;
import java.util.Map;
import java.util,UUID;
051143
160
创建登录页面
为了让用户进行身份验证,我们需要创建一个登录页面。在src/main/resources/templates
目录中,创建一个名为login.html
的HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
</body>
</html>
创建安全控制器
最后,我们需要创建一个安全控制器来处理登录
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SecurityController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/403")
public String accessDenied() {
return "403";
}
}