2024-08-29

Spring Boot 提供了多种鉴权方式,以下是四种常见的鉴权方式及其简要说明和示例代码:

  1. HTTP Basic Authentication:

    基于HTTP基本认证的鉴权,通过@EnableWebSecurity注解和http.basic()方法启用。




@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}
  1. Form Login:

    基于表单的登录鉴权,通常用于提供一个登录页面供用户输入凭据。




@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}
  1. OAuth2:

    使用Spring Security的支持,可以很容易地集成OAuth2鉴权。




@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
    // ...
}
  1. JWT:

    使用JSON Web Tokens (JWT)进行鉴权,JWT可以在没有session的情况下提供身份验证。




@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable() // 禁用CSRF保护
            .authorizeRequests()
            .antMatchers("/authenticate").permitAll() // 允许匿名用户访问登录接口
            .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager())); // 添加JWT认证过滤器
    }
}

每种鉴权方式都有其适用场景,开发者可以根据项目需求选择合适的鉴权方式。

2024-08-29



在这篇文章中,我们将介绍一个可以帮助企业无缝迁移至Java平台的Apache Tomcat的迁移工具:Apache Tomcat Migration Tool(ATMT)。
 
ATMT是一个用于将应用程序和配置从Tomcat 6、7或8迁移至Tomcat 9、10的工具。它可以帮助解决兼容性问题,并简化迁移过程。
 
以下是使用ATMT的基本步骤:
 
1. 下载并解压ATMT。
2. 运行`migrationTool.bat`(Windows)或`migrationTool.sh`(Linux/Mac)。
3. 选择源Tomcat版本和目标Tomcat版本。
4. 选择需要迁移的内容,例如应用程序、用户、角色、服务等。
5. 指定源和目标Tomcat的路径。
6. 运行迁移工具。
 
以下是一个简单的命令行示例,展示了如何在Linux环境下运行ATMT:
 
```bash
$ cd migration-tool
$ ./migrationTool.sh

请注意,具体的命令可能会根据ATMT的版本和操作系统有所不同。

ATMT是一个非常有用的工具,它可以帮助开发者和IT专业人员减少在迁移到新平台时的工作量和风险。通过提供一种自动化的方式来识别和解决兼容性问题,ATMT为企业迁移到Jakarta EE提供了强有力的支持。

2024-08-29

在Docker中为Spring Boot应用设置环境变量可以通过几种方式完成。以下是一个示例,展示如何为Spring Boot应用设置普通变量和列表变量作为环境变量。

首先,在application.propertiesapplication.yml中定义占位符:




# application.properties
my.variable=${MY_VARIABLE}
my.list=${MY_LIST:}

接下来,在Dockerfile中使用ENV指令为这些变量赋值:




# Dockerfile
FROM openjdk:11-jre-slim
ADD target/spring-boot-app.jar /app.jar
ENV MY_VARIABLE="someValue"
ENV MY_LIST="item1,item2,item3"
ENTRYPOINT ["java","-jar","/app.jar"]

在这个Dockerfile中,MY_VARIABLE被赋予了一个字符串值someValue,而MY_LIST被赋予了一个以逗号分隔的字符串列表item1,item2,item3

当运行Docker容器时,这些环境变量将被读取并替换到Spring Boot应用的配置中。

要在运行容器时动态设置这些变量,可以使用docker run命令的-e--env选项:




docker run -e MY_VARIABLE="newValue" -e "MY_LIST=itemA,itemB,itemC" my-spring-boot-app

这将覆盖Dockerfile中设置的默认值。

请注意,在Spring Boot中,列表变量应该用逗号分隔,并且在处理时会被自动转换成List类型。

2024-08-29



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
 
@Service
public class MailService {
 
    private final JavaMailSender mailSender;
    private final SimpleMailMessage simpleMailMessage;
 
    @Autowired
    public MailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
        this.simpleMailMessage = new SimpleMailMessage();
        // 设置邮件的基本属性
        simpleMailMessage.setFrom("noreply@yourdomain.com");
        simpleMailMessage.setSubject("Account Activation");
    }
 
    public void sendMail(String email, String activationLink) {
        simpleMailMessage.setTo(email);
        simpleMailMessage.setText("Hi, \n\n"
                + "Please click on the below link to activate your account:\n"
                + activationLink + "\n\n"
                + "Regards, \n"
                + "Your Team");
 
        mailSender.send(simpleMailMessage);
    }
}

这段代码定义了一个MailService类,它使用了Spring Boot提供的spring-boot-starter-mail依赖来发送邮件。在发送邮件时,它设置了邮件的基本属性,如发件人、主题和邮件内容。然后,它提供了一个sendMail方法来发送邮件给用户,其中包含了用户的激活链接。这个类可以被注入到需要发送邮件的服务中,例如用户服务,当创建新用户或需要发送账户激活邮件时使用。

2024-08-29

要在Jenkins中使用Gitee进行Spring Boot项目的流水线部署,你需要执行以下步骤:

  1. 安装必要的插件:

    • Gitee插件
    • Maven插件(如果你使用Maven构建项目)
    • SSH Slaves插件(用于通过SSH连接到远程服务器)
    • Deploy to container Plugin(用于将构建成果部署到容器中)
  2. 配置Gitee仓库:

    • 在Jenkins中配置Gitee仓库的凭据。
  3. 创建或配置一个流水线项目:

    • 在流水线脚本中,配置Gitee的webhook以触发Jenkins构建。
    • 使用Maven或Gradle命令来构建项目。
    • 通过SSH部署构建成果到目标服务器,并启动Spring Boot应用。

以下是一个简单的Jenkins流水线脚本示例:




pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                checkout([$class: 'Git', branch: '*/master', extensions: [], userRemoteConfigs: [[credentialsId: 'your-gitee-credentials-id', url: '你的Gitee仓库URL']]])
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Deploy') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'your-remote-server-config', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '你的启动脚本命令', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '\\n', remoteDirectory: '你的远程部署目录', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
            }
        }
    }
}

确保替换以上脚本中的your-gitee-credentials-id, 你的Gitee仓库URL, your-remote-server-config, 你的启动脚本命令, 你的远程部署目录以及target/*.jar为你的实际配置。

注意:确保你的远程服务器配置在Jenkins中,并且已经设置了正确的SSH凭据。同时,确保你的启动脚本有足够的权限被执行,并且能够正确地启动Spring Boot应用。

2024-08-29



import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.ResourceLoaderAware;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
 
@SpringBootApplication
@ImportResource("classpath:activiti-context.xml")
public class ActivitiDemoApplication implements ResourceLoaderAware {
 
    public static void main(String[] args) {
        SpringApplication.run(ActivitiDemoApplication.class, args);
    }
 
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        // 这里可以获取到资源加载器,用于加载Activiti的配置文件等
    }
}

这段代码展示了如何在Spring Boot 3应用中整合Activiti 8。通过@ImportResource注解引入了Activiti的XML配置文件,并实现了ResourceLoaderAware接口以获取资源加载器,这样可以加载并解析Activiti的配置文件。同时,它提供了一个main方法用于启动Spring Boot应用,以及一个transactionManager方法用于配置事务管理器。

2024-08-29



# 在OpenResty中配置多级缓存
 
http {
    # ...
 
    upstream tomcat_server {
        server 127.0.0.1:8080;
    }
 
    server {
        listen 80;
 
        # 配置本地缓存
        location /local_cache/ {
            # 设置本地缓存存储路径
            proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
 
            # 启用缓存
            proxy_cache my_cache;
 
            # 缓存有效期
            proxy_cache_valid 200 1d;
 
            # 代理设置
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
            # 设置缓存键
            proxy_cache_key $uri$is_args$args;
        }
 
        # 配置Redis缓存
        location /redis_cache/ {
            # 设置Redis连接参数
            set $redis_key $uri$is_args$args;
            redis_pass 127.0.0.1:6379;
 
            # 设置缓存查询失败时的回退处理
            default_type text/plain;
            error_page 404 = @tomcat;
 
            # 从Redis缓存中获取数据
            redis_code 200 "get $redis_key";
 
            # 设置缓存有效期
            redis_code 200 "expire $redis_key 1d";
        }
 
        # 请求未命中Redis缓存时,代理到Tomcat服务器
        location @tomcat {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
            # 将响应数据存储到Redis缓存中
            proxy_store on;
            proxy_store_access user:rw group:rw all:rw;
            proxy_temp_path /data/nginx/temp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_request_body off;
            proxy_pass_request_headers on;
            proxy_connect_timeout 10s;
            proxy_send_timeout 10s;
            proxy_read_timeout 10s;
 
            # 设置数据存储到Redis的键和过期时间
            set $redis_key $uri$is_args$args;
            set_by_lua_block $redis_expire $msec {
                return tonumber(ngx.var.msec) + 86400000;
            }
            lua_shared_dict msec 1m;
            lua_shared_dict redis_commands 1m;
            content_by_lua_block {
                local msec = ngx.shared.msec
                
2024-08-29

要复现这个AJP文件包含漏洞,你需要:

  1. 一个运行有Apache Tomcat的服务器,且该服务器开启了AJP连接器。
  2. 一个具有AJP协议请求构造能力的工具,如curl

以下是使用curl复现该漏洞的步骤:

  1. 确定目标服务器的AJP端口。默认端口通常是8009
  2. 构造一个特制的AJP请求,尝试访问服务器上的敏感文件,如/etc/passwd

以下是一个使用curl的示例命令,该命令尝试读取Tomcat服务器上的/etc/passwd文件:




curl -H "Host: your-vulnerable-host" --ajp 'http://your-vulnerable-host:8009/' -d '
  jk2ajp13_worker2.tomcat8|READ|null|/etc/passwd|
'

请注意,你需要替换your-vulnerable-host为目标服务器的IP或域名,并确保端口8009是开放且AJP服务在运行的。

如果目标服务器受影响,你应该能看到/etc/passwd文件的内容作为响应。

警告:此操作可能违反计算机安全政策和法律法规。在未授权的情况下尝试渗透测试是非法的。请在合法的授权下进行测试,并确保你有足够的权限和知识来安全地执行这些操作。

2024-08-29

LiteFlow是一个轻量级的开源工作流引擎,它用于在分布式系统中组合多个组件(节点)以实现复杂逻辑。以下是一个简单的Spring Boot集成LiteFlow的示例:

  1. 首先,在pom.xml中添加LiteFlow的依赖:



<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>liteflow-spring-boot-starter</artifactId>
    <version>最新版本号</version>
</dependency>
  1. application.propertiesapplication.yml中配置LiteFlow规则路径:



# application.properties
liteflow.rule-source=your_config_path/flow.xml

或者




# application.yml
liteflow:
  rule-source: your_config_path/flow.xml
  1. 创建流程配置文件flow.xml,定义你的业务流程:



<flow>
    <chain name="chain1">
        <then>A组件</then>
        <when>B组件</when>
        <when>C组件</when>
        <then>D组件</then>
    </chain>
</flow>
  1. 创建LiteFlow组件类,实现NodeComponent接口:



@Component("A组件")
public class AComponent extends NodeComponent {
    @Override
    public void process() {
        // 业务逻辑
        log.info("执行A组件");
    }
}
 
// 其他组件类BComponent, CComponent, DComponent类似
  1. 在Spring Boot启动类或者任意配置类中使用LiteFlow:



@SpringBootApplication
public class LiteflowDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(LiteflowDemoApplication.class, args);
        FlowExecutor flowExecutor = SpringContextUtil.getBean(FlowExecutor.class);
        flowExecutor.execute("chain1", "arg"); // 执行名为chain1的链
    }
}

以上代码展示了如何在Spring Boot项目中集成LiteFlow,并定义了一个简单的流程。在实际应用中,你可以根据自己的业务需求定义更复杂的流程,并在组件中实现具体的业务逻辑。

2024-08-29

在Spring Boot和Spring Cloud项目中,applicationbootstrap的配置文件通常用于定义不同环境下的配置。

  • application:主要用于配置应用程序的参数,例如数据库连接信息、服务端口等。它是在Spring ApplicationContext完全启动后加载的。
  • bootstrap:主要用于配置Spring Cloud的配置,例如服务发现、配置中心等。它在application之前加载,并且通常会使用外部配置源(如配置服务器)。

加载顺序如下:

  1. bootstrap:从外部配置源加载,通常在Spring ApplicationContext启动之前。
  2. application:从本地文件或外部配置源加载。

加载过程中,bootstrap属于高优先级配置,会覆盖application中的相同属性。

举例来说,如果你有一个application.propertiesbootstrap.properties,在Spring Boot应用启动时,bootstrap.properties中的配置会先加载,然后是application.properties的配置。

这里是一个简单的例子:

假设你有以下bootstrap.properties配置:




spring.application.name=my-application
spring.cloud.config.uri=http://config-server/

以及以下application.properties配置:




spring.profiles.active=production
server.port=8080

在这个例子中,spring.application.namebootstrap.properties中被定义,会先加载并被应用。spring.profiles.activeapplication.properties中被设置,会覆盖bootstrap中相同属性的值,除非在bootstrap中指定了该属性。

记住,bootstrap配置的使用场景是当你需要在启动过程中就加载一些高优先级的配置时,比如服务发现、安全配置等。而application配置则是针对你的应用程序的具体配置。