ruoyi springboot 开发笔记

本文介绍了一种绕过传统密码验证的方法,通过直接比较数据库中的明文密码来实现登录验证,并调整了相关配置以确保系统的安全性。此外,还介绍了如何在应用中禁用Swagger,以减少潜在的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、跳过密码校验

实现原理是从库中查询出密码,直接用库中密码跳过加密进行密码比较。

重写DaoAuthenticationProvider.java密码校验方法

package com.zscq.framework.provider;

import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;


public class LoginAuthenticationProvider extends DaoAuthenticationProvider {
    public LoginAuthenticationProvider(UserDetailsService userDetailsService) {
        super();
        // 这个地方一定要对userDetailsService赋值,不然userDetailsService是null (这个坑有点深)
        setUserDetailsService(userDetailsService);
    }

    @SuppressWarnings("deprecation")
    protected void additionalAuthenticationChecks(UserDetails userDetails,
                                                  UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        if (authentication.getCredentials() == null) {
            this.logger.debug("Failed to authenticate since no credentials provided");
            throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
        } else {
            String presentedPassword = authentication.getCredentials().toString();
            if(presentedPassword.equals(userDetails.getPassword())){
                return;
            }
            if (!PasswordEncoderFactories.createDelegatingPasswordEncoder().matches(presentedPassword, userDetails.getPassword())) {
                this.logger.debug("Failed to authenticate since password does not match stored value");
                throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
            }
        }
    }
}
SecurityConfig.java 中增加

SysPasswordService.java中增加

 SysLoginService.java中

之前的login方法也需要调整,否则会有问题

2、禁用swagger

application.yml中

3、java 执行c语言代码

<!--        java调用执行c语言-->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.14.0</version>
        </dependency>
// 定义一个接口,继承自 Library
public interface ExampleLibrary extends Library {
    // 不使用的地方可以声明为 null
    ExampleLibrary INSTANCE = null;
    int sim_main(Integer params);
}


// 动态获取共享库路径
// 加载共享库
ExampleLibrary exampleLibrary = (ExampleLibrary)Native.load(basePath, ExampleLibrary.class);
// 调用 C 函数
exampleLibrary.sim_main(numberofTimes);
// 卸载dll
Class myNative = Class.forName("com.sun.jna.Native");
Method method = myNative.getDeclaredMethod("dispose", new Class[]{});
method.setAccessible(true);
method.invoke(myNative, new Object[]{});

4、java 判断list中对象是否形成环

public static boolean hasCycle(List<TProjectNode> nodes) {
        Set<String> visited = new HashSet<>();

        for (TProjectNode node : nodes) {
            String currentNodeId = node.getNodeId();
            // 处理当前节点的 nextNodeId
            String nextNodeId = node.getNextNodeId();

            if (visited.contains(currentNodeId)) {
                return true; // 如果已经访问过当前节点,说明有环
            }

            visited.add(currentNodeId);
            // 检查 nextNodeId 是否存在于 nodes 中
            if (nextNodeId != null) {
                boolean foundNextNode = false;
                for (TProjectNode nextNode : nodes) {
                    if (nextNode.getNodeId().equals(nextNodeId)) {
                        foundNextNode = true;
                        break;
                    }
                }
                // 如果 nextNodeId 不在列表中,跳出循环
                if (!foundNextNode) {
                    break;
                }
            }
        }
        return false; // 如果没有重复访问,说明无环
    }

    public static void main(String[] args) {
        TProjectNode tProjectNode1 = new TProjectNode();
        tProjectNode1.setNodeId("1");
        tProjectNode1.setNextNodeId("2");
        TProjectNode tProjectNode2 = new TProjectNode();
        tProjectNode2.setNodeId("2");
        tProjectNode2.setNextNodeId("3");
        TProjectNode tProjectNode3 = new TProjectNode();
        tProjectNode3.setNodeId("3");
        tProjectNode3.setNextNodeId("1");
        TProjectNode tProjectNode4 = new TProjectNode();
        tProjectNode4.setNodeId("4");
        tProjectNode4.setNextNodeId("5");


        // 示例数据:
        List<TProjectNode> projectNodes = new ArrayList<>();
        projectNodes.add(tProjectNode3);
        projectNodes.add(tProjectNode2);
        projectNodes.add(tProjectNode1);
        projectNodes.add(tProjectNode4);

        System.out.println("是否有环: " + hasCycle(projectNodes));
    }

### RuoYi Spring Boot 3 集成 Swagger 时遇到的 YAMLException 解决方案 在处理 RuoYi 项目中 Spring Boot 3 和 Swagger 的集成过程中,如果遇到了 `YAMLException` 错误,这通常是因为配置文件中的某些部分不符合 YAML 文件的标准语法。为了有效解决问题并成功集成 Swagger,在项目的 pom.xml 中应确保引入了正确的依赖项[^3]。 对于具体的错误修复措施如下: #### 修改 application.yml 或者 application.properties 文件 当使用 YAML 格式的配置文件时,任何多余的空格或缩进不当都可能导致解析失败。因此建议仔细检查 `application.yml` 文件内的 swagger 相关配置条目是否有格式上的问题。例如,确认所有的冒号后面都有一个空格,并且保持一致性的缩进级别。 另外一种方法是切换到 properties 格式来规避潜在的 yaml 解析器兼容性难题;即把所有关于 swagger-ui 的设定迁移到 `.properties` 文件里去定义,像这样: ```properties # application.properties springfox.documentation.swagger.v2.path=/v2/api-docs ``` #### 更新 springdoc-openapi 依赖版本 考虑到当前使用的可能是较旧版的 openapi 库,而这些库可能并不完全支持最新的 Spring Boot 版本特性,所以更新至最新稳定发布的 springdoc-openapi 是必要的操作之一。可以在 Maven POM 文件内添加/替换为下面这段代码片段以获取最新版本的支持[^1]: ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.14</version><!-- 查找最新版本 --> </dependency> ``` #### 调整启动类注解方式 有时改变应用程序入口处所应用的特定于 Swagger 的注释也能够帮助消除一些异常情况的发生。尝试移除原有与 Swagger UI 显示有关联的一切自定义 Bean 定义或是组件扫描路径限制等复杂逻辑,仅保留最基本的 @EnableWebMvc 及其他业务所需的基础框架注释即可[^2]. 通过上述调整应该可以有效地解决由于 Yaml Exception 所引发的一系列问题,并顺利实现 RuoYi Vue Admin Template 下基于 Spring Boot 3 平台之上对 API 文档工具——Swagger 的正常加载显示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cesium vue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值