Spring Boot 安全机制

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";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值