IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Springboot+jwt+springsecurity在实际开发中的使用 -> 正文阅读

[Java知识库]Springboot+jwt+springsecurity在实际开发中的使用

springboot项目使用springsecurity+jwt实现用户校验

SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,控制反转,依赖注入和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。(注:此篇为自学springsecurity时的demo,特此记录下来方便日后使用)

业务流程

前端 后端 用户名+密码 验证用户为真,生成jwt令牌 return jwt令牌 携带jwt令牌,访问后台资源 前端 后端

文件目录结构

在这里插入图片描述

所需的maven

1. jjwt

<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.9.1</version>
</dependency>

2.springsecurity

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

核心代码

1.JwtUtil(实现生成jwt和解析jwt)

package com.hnzrbt.controller.utils;

public class JwtUtil {
//    设置有效期
    public static final Long JWT_TTL = 7*24*60*60*1000L;
//    密钥自定义
    public static final String JWT_KEY = "xxxxxx";

    public static String getUUID(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
//    生成JWT
    public static String createJwt(String s){
        JwtBuilder builder = getJwtBuilder(s, null, getUUID());// 设置过期时间
        return builder.compact();
    }
//    ttlMillis token超时时间
    public static String createJwt(String s , Long ttlMillis){
        JwtBuilder builder = getJwtBuilder(s, ttlMillis, getUUID());
        return builder.compact();
    }
    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("xxxxxx")     // 签发者自定义
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);
    }
    public static String createJWT(String id, String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
        return builder.compact();
    }
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }

    /**
     * 解析
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

2.SecurityConfig

@Configuration
public class SecurityConfig {
    @Autowired
    JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
//    密码加密
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
//    放行接口
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity)throws Exception{
        httpSecurity
//                关闭csrf
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
//                对于登录接口允许匿名访问
                .antMatchers("/companycms/login").anonymous()
//                除所有的请求全部需要鉴权认证
                .anyRequest().authenticated();
        httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
        return httpSecurity.build();
    }
    @Autowired
    private AuthenticationConfiguration authenticationConfiguration;
    @Bean
    public AuthenticationManager authenticationManager() throws Exception{
        AuthenticationManager authenticationManager = authenticationConfiguration.getAuthenticationManager();
        return authenticationManager;
    }
}

3.LoginController


@RestController
@RequestMapping("/companycms")
public class LoginController {
    @Autowired
    private LoginService loginService;

    @PostMapping("login")
    public R login(@RequestBody User user){
        return loginService.login(user);
    }
    @PostMapping("logout")
    public R logout(){
        return loginService.logout();
    }
}

4.Dao和DaoImpl


@Mapper
public interface UserDao extends BaseMapper<User> {
}
@Data
public class User {

    private Integer id;
    private String ucont;
    private String upwd;
}

5.LoginService

public interface LoginService {
    public R login(User user);

    public R logout();
}

6. LoginServiceImpl

package com.hnzrbt.service.impl;

@Service
public class LoginServiceImpl implements LoginService {
    @Autowired
    AuthenticationManager authenticationManager;
    @Autowired
    RedisCache redisCache;
    @Override
    public R login(User user) {
//      auth方法进行校验
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(user.getUcont(),user.getUpwd());
        Authentication authentication = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
//      校验失败
        if (Objects.isNull(authentication)){
            throw  new RuntimeException("用户名或密码错误!");
        }
//      生成jwt给前端
        LoginUser loginUser = (LoginUser)(authentication.getPrincipal());
        String id = loginUser.getUser().getId().toString();
        String jwt = JwtUtil.createJwt(id);
        Map<String,String> map = new HashMap();
        map.put("token",jwt);
//        将数据传入redis中
        redisCache.setCacheObject("login"+id,loginUser);
        return new R(true,map);
    }

    @Override
    public R logout() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        Integer id = loginUser.getUser().getId();
        redisCache.deleteObject("login"+id);
        return new R(true);
    }
}

7.UserDetailServiceImpl

@Service
public class UserDetailServiceImpl implements UserDetailsService {
    @Autowired
    UserDao userDao;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUcont,username);//查询条件
        User user = userDao.selectOne(lambdaQueryWrapper);
        if (Objects.isNull(user)){
            throw new RuntimeException("用户不存在");
        }
        return new LoginUser(user);
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:42:44  更:2022-09-24 20:45:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:18:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码