178
m2pool-auth/m2pool-auth.iml
Normal file
178
m2pool-auth/m2pool-auth.iml
Normal file
@@ -0,0 +1,178 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="Spring" name="Spring">
|
||||
<configuration />
|
||||
</facet>
|
||||
<facet type="web" name="Web">
|
||||
<configuration>
|
||||
<webroots />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/target/classes" />
|
||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-alibaba-commons:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:2.0.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.2.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.15" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.12.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel:0.12.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_common:0.12.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel_agent:0.12.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.29" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.11" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.6.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" />
|
||||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.17.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.17.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.36" level="project" />
|
||||
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.62" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.62" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.62" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-sentinel:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-transport-simple-http:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-transport-common:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-datasource-extension:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.80" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-annotation-aspectj:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-core:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-circuitbreaker-sentinel:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-reactor-adapter:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-spring-webflux-adapter:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-spring-webmvc-adapter:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-parameter-flow-control:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-server-default:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-common-default:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.76.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-client-default:1.8.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-alibaba-sentinel-datasource:2021.0.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-actuator:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.8.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.12" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: org.latencyutils:LatencyUtils:2.0.3" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok-maven-plugin:1.18.6.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.24" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.sonatype.plexus:plexus-build-api:0.0.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.codehaus.plexus:plexus-utils:1.5.8" level="project" />
|
||||
<orderEntry type="module" module-name="common-security" />
|
||||
<orderEntry type="module" module-name="api-system" />
|
||||
<orderEntry type="module" module-name="common-core" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:11.8" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:11.8" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-loadbalancer:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-loadbalancer:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.projectreactor.addons:reactor-extra:3.4.8" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-cache:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.stoyanr:evictor:1.0.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba:transmittable-thread-local:2.12.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.4.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.2.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.6" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.4.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.3.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.2.3.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.3.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.1.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.1.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.06" level="project" />
|
||||
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.6.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-mail:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.sun.mail:jakarta.mail:1.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
|
||||
<orderEntry type="module" module-name="common-redis" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.6.7" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.6.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.6.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.6.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.8.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.17" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.1.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.10.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.68" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.68" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
81
m2pool-auth/pom.xml
Normal file
81
m2pool-auth/pom.xml
Normal file
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>m2pool</artifactId>
|
||||
<groupId>com.m2pool</groupId>
|
||||
<version>3.5.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>m2pool-auth</artifactId>
|
||||
|
||||
<description>认证模块:登录认证、权限鉴定等</description>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!-- SpringCloud Alibaba Nacos -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- SpringCloud Alibaba Nacos Config -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- SpringBoot Web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- SpringCloud Alibaba Sentinel -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- SpringBoot Actuator -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Lombok -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok-maven-plugin</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- JXY Common Security-->
|
||||
<dependency>
|
||||
<groupId>com.m2pool</groupId>
|
||||
<artifactId>common-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.m2pool.auth;
|
||||
|
||||
import com.m2pool.common.security.annotation.EnableM2PoolFeignClients;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
|
||||
@EnableM2PoolFeignClients
|
||||
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
|
||||
public class M2PoolAuthApplication{
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
SpringApplication.run(M2PoolAuthApplication.class,args);
|
||||
|
||||
System.out.println("认证授权中心启动成功");
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
package com.m2pool.auth.controller;
|
||||
|
||||
import com.m2pool.auth.entity.*;
|
||||
import com.m2pool.auth.service.SysLoginService;
|
||||
import com.m2pool.auth.service.impl.MaliServiceImpl;
|
||||
import com.m2pool.common.core.Result.R;
|
||||
import com.m2pool.common.core.utils.JwtUtils;
|
||||
import com.m2pool.common.core.utils.StringUtils;
|
||||
import com.m2pool.common.core.web.Result.AjaxResult;
|
||||
import com.m2pool.common.security.annotation.RequiresLogin;
|
||||
import com.m2pool.common.security.auth.AuthUtil;
|
||||
import com.m2pool.common.security.service.TokenService;
|
||||
import com.m2pool.common.security.utils.SecurityUtils;
|
||||
import com.m2pool.system.api.entity.SysUser;
|
||||
import com.m2pool.system.api.model.LoginUser;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
|
||||
|
||||
/**
|
||||
* @Description token 控制
|
||||
* @Date 2024/6/12 14:59
|
||||
* @Author dy
|
||||
*/
|
||||
@RestController
|
||||
@Api(tags = "token令牌")
|
||||
public class TokenController {
|
||||
|
||||
@Autowired
|
||||
private SysLoginService sysLoginService;
|
||||
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
|
||||
@Autowired
|
||||
private MaliServiceImpl maliService;
|
||||
|
||||
@PostMapping("login")
|
||||
public R<?> login(@RequestBody @Valid LoginBody loginBody,@RequestHeader("User-Agent") String userAgent)
|
||||
{
|
||||
return sysLoginService.login(loginBody);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("registerCode")
|
||||
public R<?> emailCode(@Validated @RequestBody GetEmailCodeEntity entity)
|
||||
{
|
||||
return maliService.emailCode(entity);
|
||||
}
|
||||
|
||||
@PostMapping("loginCode")
|
||||
public R<?> loginCode(@Valid @RequestBody GetLoginEmailCodeEntity entity)
|
||||
{
|
||||
return maliService.loginCode(entity);
|
||||
}
|
||||
|
||||
@PostMapping("addCreditEmailCode")
|
||||
public R<?> addCreditEmailCode(@RequestBody GetEmailCodeEntity entity)
|
||||
{
|
||||
return maliService.AddCreditCode(entity);
|
||||
}
|
||||
|
||||
@PostMapping("resetPwdCode")
|
||||
public R<?> resetPwdCode(@Valid @RequestBody GetEmailCodeEntity entity)
|
||||
{
|
||||
return maliService.resetPwdCode(entity);
|
||||
}
|
||||
|
||||
@PostMapping("updatePwdCode")
|
||||
public R<?> updatePwdCode()
|
||||
{
|
||||
return maliService.updatePwdCode();
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("hello")
|
||||
public R<?> hello()
|
||||
{
|
||||
return R.success("浏览器安全认证已确认,请重新返回原页面进行登陆");
|
||||
}
|
||||
|
||||
@DeleteMapping("logout")
|
||||
public R<?> logout(HttpServletRequest request)
|
||||
{
|
||||
String token = SecurityUtils.getToken(request);
|
||||
if (StringUtils.isNotEmpty(token))
|
||||
{
|
||||
String username = JwtUtils.getUserName(token);
|
||||
//删除用户缓存记录
|
||||
AuthUtil.logoutByToken(token);
|
||||
// 记录用户退出日志
|
||||
sysLoginService.logout(username);
|
||||
}
|
||||
return R.success("用户登出");
|
||||
}
|
||||
|
||||
@PostMapping("refresh")
|
||||
public R<?> refresh(HttpServletRequest request)
|
||||
{
|
||||
LoginUser loginUser = tokenService.getLoginUser(request);
|
||||
if (StringUtils.isNotNull(loginUser)){
|
||||
//刷新令牌有效期
|
||||
tokenService.refreshToken(loginUser);
|
||||
return R.success();
|
||||
}
|
||||
return R.success();
|
||||
}
|
||||
|
||||
@PostMapping("register")
|
||||
public R<?> register(@Valid() @RequestBody RegisterBody registerBody)
|
||||
{
|
||||
// 用户注册
|
||||
sysLoginService.register(registerBody);
|
||||
return R.success("用户"+registerBody.getEmail()+"注册成功");
|
||||
}
|
||||
|
||||
@PostMapping("resetPwd")
|
||||
public R<?> resetPwd(@Valid @RequestBody ResetPwdBody resetPwdBody)
|
||||
{
|
||||
// 重置密码
|
||||
sysLoginService.resetPwd(resetPwdBody);
|
||||
return R.success("账号"+ resetPwdBody.getEmail()+"密码重置成功");
|
||||
}
|
||||
|
||||
@PostMapping("updatePwd")
|
||||
@RequiresLogin
|
||||
public R<?> updatePwd(@Valid @RequestBody ResetPwdBody resetPwdBody)
|
||||
{
|
||||
String email = SecurityUtils.getUsername();
|
||||
resetPwdBody.setEmail(email);
|
||||
|
||||
// 修改密码
|
||||
sysLoginService.resetPwd(resetPwdBody);
|
||||
return R.success("账号"+ resetPwdBody.getEmail()+"密码修改成功");
|
||||
}
|
||||
|
||||
@PostMapping("sendTextMail")
|
||||
public R<?> sendTextMail(@Valid @RequestBody EmailEntity entity)
|
||||
{
|
||||
maliService.sendTextMailMessage(entity.getEmail(), entity.getSubject(),entity.getText());
|
||||
return R.success("邮件已发送");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Description 用户登录对象
|
||||
* @Date 2024/6/12 16:13
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class EmailCodeEntity implements Serializable {
|
||||
|
||||
/** 邮箱 */
|
||||
private String email;
|
||||
|
||||
private String emailCode;
|
||||
|
||||
private int times;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Description 用户登录对象
|
||||
* @Date 2022/5/12 16:13
|
||||
* @Author 杜懿
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class EmailEntity implements Serializable {
|
||||
|
||||
/** 邮箱 */
|
||||
@Email
|
||||
private String email;
|
||||
|
||||
private String subject;
|
||||
|
||||
private String text;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @Description 用户登录对象
|
||||
* @Date 2024/6/12 16:13
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class GetEmailCodeEntity {
|
||||
|
||||
/** 用户名或邮箱 */
|
||||
private String userName;
|
||||
|
||||
/** 邮箱 */
|
||||
@NotNull(message = "用户邮箱不能为空")
|
||||
@Email(message = "邮箱格式错误")
|
||||
private String email;
|
||||
|
||||
//@NotNull(message = "用户密码不能为空")
|
||||
//@Size(min=6, max=15,message="密码长度必须在 5 ~ 15 字符之间!")
|
||||
////@Pattern(regexp="^[a-zA-Z0-9|_]+$",message="密码必须由字母、数字、下划线组成!")
|
||||
//private String password;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @Description 用户登录对象
|
||||
* @Date 2024/6/12 16:13
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class GetLoginEmailCodeEntity {
|
||||
|
||||
/** 邮箱 */
|
||||
@NotNull(message = "用户邮箱不能为空")
|
||||
@Email(message = "邮箱格式错误")
|
||||
private String account;
|
||||
|
||||
//@NotNull(message = "用户密码不能为空")
|
||||
//@Size(min=6, max=15,message="密码长度必须在 5 ~ 15 字符之间!")
|
||||
////@Pattern(regexp="^[a-zA-Z0-9|_]+$",message="密码必须由字母、数字、下划线组成!")
|
||||
//private String password;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
|
||||
/**
|
||||
* @Description 用户登录对象
|
||||
* @Date 2024/6/12 16:13
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
public class LoginBody {
|
||||
|
||||
/** 邮箱 */
|
||||
@Email
|
||||
private String userName;
|
||||
|
||||
/** 密码 */
|
||||
private String password;
|
||||
|
||||
private String code;
|
||||
|
||||
private String uuid;
|
||||
|
||||
//private boolean flag = false;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
/**
|
||||
* @Description 用户注册对象
|
||||
* @Date 2024/6/12 16:16
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
public class RegisterBody{
|
||||
|
||||
//todo 添加注册详细信息
|
||||
/** 手机号码 */
|
||||
private String phone;
|
||||
|
||||
@Email(message = "邮箱格式错误")
|
||||
private String email;
|
||||
|
||||
private String emailCode;
|
||||
|
||||
/** 密码 */
|
||||
@NotNull(message = "密码不能为空")
|
||||
//@Size(min=8, max=32,message="密码长度必须在 8 ~ 32 字符之间!")
|
||||
//@Pattern(regexp="^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,32}$",message="密码格式错误,密码应包含大写字母、小写字母、数字以及特殊字符,8到32位")
|
||||
private String password;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
|
||||
/**
|
||||
* @Description 用户重置密码对象
|
||||
* @Date 2024/6/12 16:16
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
public class ResetPwdBody {
|
||||
|
||||
//todo 添加详细信息
|
||||
|
||||
@Email
|
||||
private String email;
|
||||
|
||||
private String resetPwdCode;
|
||||
|
||||
/** 新密码 */
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* 谷歌验证器验证码
|
||||
*/
|
||||
public long gCode;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.m2pool.auth.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
|
||||
/**
|
||||
* @Description 用户修改密码对象
|
||||
* @Date 2024/6/12 16:16
|
||||
* @Author dy
|
||||
*/
|
||||
@Data
|
||||
public class UpdatePwdBody {
|
||||
|
||||
private String updatePwdCode;
|
||||
|
||||
/** 新密码 */
|
||||
private String password;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.m2pool.auth.service;
|
||||
|
||||
import com.m2pool.auth.entity.GetEmailCodeEntity;
|
||||
import com.m2pool.auth.entity.GetLoginEmailCodeEntity;
|
||||
import com.m2pool.common.core.Result.R;
|
||||
|
||||
/**
|
||||
* @Description TODO
|
||||
* @Date 2024/6/11 14:56
|
||||
* @Author dy
|
||||
*/
|
||||
public interface MailService {
|
||||
/**
|
||||
* 发送纯文本邮件
|
||||
* @param to
|
||||
* @param subject
|
||||
* @param text
|
||||
*/
|
||||
public void sendTextMailMessage(String to,String subject,String text);
|
||||
|
||||
/**
|
||||
* 发送html邮件
|
||||
* @param to
|
||||
* @param subject
|
||||
* @param content
|
||||
*/
|
||||
public void sendHtmlMailMessage(String to,String subject,String content);
|
||||
|
||||
/**
|
||||
* 发送带附件的邮件
|
||||
* @param to 邮件收信人
|
||||
* @param subject 邮件主题
|
||||
* @param content 邮件内容
|
||||
* @param filePath 附件路径
|
||||
*/
|
||||
public void sendAttachmentMailMessage(String to,String subject,String content,String filePath);
|
||||
|
||||
/**
|
||||
* 发送注册邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
public void sendCodeMailMessage(String to, String code);
|
||||
|
||||
/**
|
||||
* 发送登录邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
public void sendLoginCodeMailMessage(String to, String code);
|
||||
|
||||
/**
|
||||
* 发送重置密码邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
public void sendResetPwdMailMessage(String to, String code);
|
||||
|
||||
/**
|
||||
* 发送修改密码邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
public void sendUpdatePwdMailMessage(String to, String code);
|
||||
|
||||
|
||||
|
||||
public R<?> emailCode(GetEmailCodeEntity entity);
|
||||
|
||||
public R<?> loginCode(GetLoginEmailCodeEntity entity);
|
||||
|
||||
public R<?> AddCreditCode(GetEmailCodeEntity entity);
|
||||
|
||||
public R<?> resetPwdCode(GetEmailCodeEntity entity);
|
||||
|
||||
public R<?> updatePwdCode();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,453 @@
|
||||
package com.m2pool.auth.service;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
|
||||
import com.m2pool.auth.entity.*;
|
||||
import com.m2pool.common.core.RedisTransKey;
|
||||
import com.m2pool.common.core.Result.R;
|
||||
import com.m2pool.common.core.constant.Constants;
|
||||
import com.m2pool.common.core.constant.SecurityConstants;
|
||||
import com.m2pool.common.core.constant.UserConstants;
|
||||
import com.m2pool.common.core.enums.UserStatus;
|
||||
import com.m2pool.common.core.exception.ServiceException;
|
||||
import com.m2pool.common.core.text.Convert;
|
||||
import com.m2pool.common.core.utils.DateUtils;
|
||||
import com.m2pool.common.core.utils.ServletUtils;
|
||||
import com.m2pool.common.core.utils.StringUtils;
|
||||
import com.m2pool.common.core.utils.ip.IpUtils;
|
||||
import com.m2pool.common.core.utils.sign.RsaUtils;
|
||||
import com.m2pool.common.core.web.Result.AjaxResult;
|
||||
import com.m2pool.common.redis.service.RedisService;
|
||||
import com.m2pool.common.security.service.TokenService;
|
||||
import com.m2pool.common.security.utils.SecurityUtils;
|
||||
import com.m2pool.system.api.RemoteLogService;
|
||||
import com.m2pool.system.api.RemoteUserService;
|
||||
import com.m2pool.system.api.entity.SysLogininfor;
|
||||
import com.m2pool.system.api.entity.SysUser;
|
||||
import com.m2pool.system.api.model.LoginUser;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
||||
/**
|
||||
* @Description 登录校验方法
|
||||
* @Date 2024/6/12 16:19
|
||||
* @Author dy
|
||||
*/
|
||||
@Component
|
||||
public class SysLoginService {
|
||||
|
||||
@Autowired
|
||||
private RemoteLogService remoteLogService;
|
||||
|
||||
@Autowired
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
|
||||
@Autowired
|
||||
private RedisService redisService;
|
||||
|
||||
//public static String PWD_REGEX="^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,32}$";
|
||||
public static String PWD_REGEX="^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[!@#$%^&*()./_])[A-Za-z\\d!@#$%^&*()./_]{8,32}$";
|
||||
|
||||
public static String EMAIL_REGEX="^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
|
||||
/**
|
||||
* 登录
|
||||
*/
|
||||
public R<?> login(LoginBody loginBody)
|
||||
{
|
||||
//邮箱
|
||||
String email = loginBody.getUserName();
|
||||
|
||||
//String password= loginBody.getPassword();
|
||||
String password="";
|
||||
|
||||
try {
|
||||
password = RsaUtils.decryptByPrivateKey(loginBody.getPassword());
|
||||
password = StringUtils.clean(password);
|
||||
}catch (Exception e){
|
||||
return R.fail(401,"加密密码传参有误");
|
||||
}
|
||||
|
||||
String emailCode = loginBody.getCode();
|
||||
// 用户名或密码为空 错误
|
||||
if (StringUtils.isAnyBlank(email, password))
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "邮箱/密码必须填写");
|
||||
throw new ServiceException("邮箱/密码必须填写");
|
||||
}
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
throw new ServiceException("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("邮箱为必填项");
|
||||
}
|
||||
|
||||
// 密码如果不在指定范围内 错误
|
||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "用户密码不在指定范围");
|
||||
throw new ServiceException("用户密码不在指定范围");
|
||||
}
|
||||
|
||||
|
||||
//if(!"admin".equals(username)){
|
||||
// if(!password.matches(PWD_REGEX)){
|
||||
// recordLogininfor(username, Constants.LOGIN_FAIL, "密码格式错误");
|
||||
// throw new ServiceException("密码格式错误,密码应包含大写字母、小写字母、数字以及特殊字符,8到32位");
|
||||
// }
|
||||
//}
|
||||
//todo 可以添加校验验证码的功能
|
||||
if("1328642438@qq.com".equals(email)){
|
||||
//不做处理 进入后续登录流程
|
||||
}else if(redisService.hasKey(RedisTransKey.getLoginKey(email))){
|
||||
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getLoginKey(email));//user:emailCode:email
|
||||
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
//验证验证码
|
||||
if(emailCode.equals(emailCodeEntity.getEmailCode())){
|
||||
//不做处理 进入后续登录流程
|
||||
}else {
|
||||
throw new ServiceException("验证码错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("验证码未获取或已过期,请重新获取验证码");
|
||||
}
|
||||
|
||||
// 查询用户信息
|
||||
R<LoginUser> userResult = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
if (R.FAIL == userResult.getCode())
|
||||
{
|
||||
throw new ServiceException(userResult.getMsg());
|
||||
}
|
||||
|
||||
if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "登录用户不存在");
|
||||
throw new ServiceException("登录用户:" + email + " 不存在");
|
||||
}
|
||||
LoginUser userInfo = userResult.getData();
|
||||
//Long userid = userInfo.getUserid();
|
||||
SysUser user = userResult.getData().getSysUser();
|
||||
if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
|
||||
throw new ServiceException("对不起,您的账号:" + email + " 已被删除");
|
||||
}
|
||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
|
||||
throw new ServiceException("对不起,您的账号:" + email + " 已停用");
|
||||
}
|
||||
//根据user:userId:lock
|
||||
if(redisService.hasKey("user:"+email+":lock")){
|
||||
//账户输入密码错误
|
||||
throw new ServiceException("该账户因密码错误多次被暂时限制登陆24h!");
|
||||
}
|
||||
|
||||
if (!SecurityUtils.matchesPassword(password, user.getPassword()))
|
||||
{
|
||||
recordLogininfor(email, Constants.LOGIN_FAIL, "用户密码错误");
|
||||
//redis 记录用户密码错误次数 大于5时锁定账户24小时
|
||||
int count = 0;
|
||||
if(redisService.hasKey("user:"+email+":pwdError")){
|
||||
//判断key是否过期
|
||||
long expire = redisService.getExpire("user:" + email + ":pwdError", TimeUnit.SECONDS);
|
||||
if(expire > 0){
|
||||
count = Convert.toInt(redisService.getCacheObject("user:"+email+":pwdError"));
|
||||
}
|
||||
}
|
||||
count++;
|
||||
if(count == 1){
|
||||
redisService.setCacheObject("user:"+email+":pwdError",count,1L,TimeUnit.HOURS);
|
||||
}else if(count < 6){
|
||||
long expire = redisService.getExpire("user:" + email + ":pwdError", TimeUnit.SECONDS);
|
||||
System.out.println(expire);
|
||||
redisService.setCacheObject("user:"+email+":pwdError",count,redisService.getExpire("user:"+email+":pwdError",TimeUnit.SECONDS),TimeUnit.SECONDS);
|
||||
}
|
||||
if(count >= 5){
|
||||
//锁定用户账号 并清除输入错误次数的记录
|
||||
redisService.setCacheObject("user:"+email+":lock", email, 24L, TimeUnit.HOURS);
|
||||
//清除输入错误次数的记录
|
||||
redisService.deleteObject("user:"+email+":pwdError");
|
||||
}
|
||||
throw new ServiceException("密码错误,一小时内错误五次之后锁定账户24h,当前已失败"+count+"次");
|
||||
}
|
||||
|
||||
//todo 判断当前ip和用户上一次登陆ip是否一致
|
||||
//if(StringUtils.isNotNull(userResult.getData().getSysUser().getLoginIp()) && StringUtils.isNotBlank(userResult.getData().getSysUser().getLoginIp())){
|
||||
// //上一次ip不为空 判断
|
||||
// if(StringUtils.isBlank(loginBody.getUuid()) || StringUtils.isNull(loginBody.getUuid())){
|
||||
//
|
||||
// //没传uuid说明是刚发起的登录请求 需要判断ip是否发生变化
|
||||
// String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
|
||||
// if(!ipAddr.equals(userResult.getData().getSysUser().getLoginIp())){
|
||||
// return R.fail(201,"登录ip发生变化,请通过验证再登录");
|
||||
// }
|
||||
// }else {
|
||||
// //传了uuid说明是验证登录 验证
|
||||
// if (StringUtils.isBlank(loginBody.getCode()))
|
||||
// {
|
||||
// return R.fail("验证码不能为空");
|
||||
// }
|
||||
//
|
||||
// String verifyKey = Constants.CAPTCHA_CODE_KEY + loginBody.getUuid();
|
||||
// String captcha = redisService.getCacheObject(verifyKey);
|
||||
//
|
||||
// if(StringUtils.isNull(captcha)){
|
||||
// return R.fail("验证码已失效");
|
||||
// }
|
||||
// //redisService.deleteObject(verifyKey);
|
||||
//
|
||||
// if (!loginBody.getCode().equalsIgnoreCase(captcha))
|
||||
// {
|
||||
// return R.fail("验证码错误");
|
||||
// }
|
||||
// redisService.deleteObject(verifyKey);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
recordLogininfor(email, Constants.LOGIN_SUCCESS, "登录成功");
|
||||
|
||||
//修改数据库中的用户登录次数和最后一次登录的ip
|
||||
user.setLoginCount(user.getLoginCount()+1);
|
||||
user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
||||
user.setLoginDate(DateUtils.getNowDate());
|
||||
|
||||
//todo 单独存储用户的登录时间和ip
|
||||
remoteUserService.updateUserInfo(user);
|
||||
|
||||
return R.success(tokenService.createToken(userInfo));
|
||||
}
|
||||
|
||||
public void logout(String loginName)
|
||||
{
|
||||
recordLogininfor(loginName, Constants.LOGOUT, "退出成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册
|
||||
*/
|
||||
public void register(RegisterBody registerBody)
|
||||
{
|
||||
String password = registerBody.getPassword();
|
||||
try {
|
||||
password = RsaUtils.decryptByPrivateKey(registerBody.getPassword());
|
||||
password = StringUtils.clean(password);
|
||||
}catch (Exception e){
|
||||
throw new ServiceException("加密密码传参有误",401);
|
||||
}
|
||||
|
||||
String email = registerBody.getEmail();
|
||||
|
||||
|
||||
String phone = registerBody.getPhone();
|
||||
String emailCode = registerBody.getEmailCode();
|
||||
//String key = username+"+"+email;
|
||||
// 用户名或密码为空 错误
|
||||
if (StringUtils.isAnyBlank(email, password))
|
||||
{
|
||||
throw new ServiceException("邮箱/密码必须填写");
|
||||
}
|
||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
|
||||
{
|
||||
throw new ServiceException("密码长度必须在8到32个字符之间");
|
||||
}
|
||||
if(!password.matches(PWD_REGEX)){
|
||||
throw new ServiceException("密码格式错误,密码应包含大写字母、小写字母、数字以及特殊字符,8到32位");
|
||||
}
|
||||
|
||||
//todo 手机号验证
|
||||
if(!StringUtils.isEmpty(phone)){
|
||||
String phoneRex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$";
|
||||
|
||||
if (!phone.matches(phoneRex))
|
||||
{
|
||||
throw new ServiceException("手机号格式不正确");
|
||||
}
|
||||
}
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
throw new ServiceException("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("邮箱为必填项");
|
||||
}
|
||||
|
||||
if(redisService.hasKey(RedisTransKey.getEmailKey(email))){
|
||||
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getEmailKey(email));//user:emailCode:email
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
|
||||
//验证验证码
|
||||
if(emailCode.equals(emailCodeEntity.getEmailCode())){
|
||||
// 注册用户信息
|
||||
SysUser sysUser = new SysUser();
|
||||
sysUser.setUserName(email);
|
||||
sysUser.setNickName(email);
|
||||
sysUser.setPhone(phone);
|
||||
sysUser.setEmail(email);
|
||||
sysUser.setPassword(SecurityUtils.encryptPassword(password));
|
||||
R<?> registerResult = remoteUserService.registerUserInfo(sysUser);
|
||||
|
||||
if (R.FAIL == registerResult.getCode())
|
||||
{
|
||||
throw new ServiceException(registerResult.getMsg());
|
||||
}
|
||||
recordLogininfor(email, Constants.REGISTER, "注册成功");
|
||||
}else {
|
||||
throw new ServiceException("验证码错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("验证码未获取或已过期,请重新获取验证码");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*/
|
||||
public void resetPwd(ResetPwdBody resetPwdBody)
|
||||
{
|
||||
|
||||
String password = resetPwdBody.getPassword();
|
||||
try {
|
||||
password = RsaUtils.decryptByPrivateKey(resetPwdBody.getPassword());
|
||||
}catch (Exception e){
|
||||
throw new ServiceException("加密密码传参有误",401);
|
||||
//password = resetPwdBody.getPassword();
|
||||
}
|
||||
|
||||
String email = resetPwdBody.getEmail();
|
||||
String resetPwdCode = resetPwdBody.getResetPwdCode();
|
||||
// 邮箱或密码为空 错误
|
||||
if (StringUtils.isAnyBlank(email, password))
|
||||
{
|
||||
throw new ServiceException("邮箱/新密码不能为空");
|
||||
}
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
throw new ServiceException("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("邮箱为必填项");
|
||||
}
|
||||
|
||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
|
||||
{
|
||||
throw new ServiceException("密码长度必须在8到32个字符之间");
|
||||
}
|
||||
//password格式校验
|
||||
if(!password.matches(PWD_REGEX)){
|
||||
throw new ServiceException("密码格式错误,密码应包含大写字母、小写字母、数字以及特殊字符,8到32位");
|
||||
}
|
||||
R<LoginUser> userResult = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
if (R.FAIL == userResult.getCode())
|
||||
{
|
||||
throw new ServiceException("服务器请求失败请稍后再试");
|
||||
}
|
||||
|
||||
if(SecurityUtils.matchesPassword(password,userResult.getData().getSysUser().getPassword())){
|
||||
throw new ServiceException("新密码不能与原密码一致");
|
||||
}
|
||||
|
||||
//if(resetPwdBody.getGCode() == 0){
|
||||
// throw new ServiceException("验证码不能为空");
|
||||
//}
|
||||
//谷歌验证码校验
|
||||
//R<?> checkCodeResult = remoteUserService.checkGoogleCode(resetPwdBody.getGCode(),SecurityConstants.INNER);
|
||||
//
|
||||
//if (R.FAIL == checkCodeResult.getCode())
|
||||
//{
|
||||
// System.out.println(checkCodeResult);
|
||||
// throw new ServiceException(checkCodeResult.getMsg());
|
||||
//}
|
||||
//
|
||||
//System.out.println(checkCodeResult);
|
||||
|
||||
if(redisService.hasKey(RedisTransKey.getResetPwdKey(email))){
|
||||
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getResetPwdKey(email));//user:emailCode:username
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
if (email.equals(emailCodeEntity.getEmail())) {
|
||||
//邮箱必须和刚刚传的一致
|
||||
//验证验证码
|
||||
if(resetPwdCode.equals(emailCodeEntity.getEmailCode())){
|
||||
// 重置用户密码
|
||||
SysUser sysUser = new SysUser();
|
||||
sysUser.setEmail(email);
|
||||
sysUser.setPassword(SecurityUtils.encryptPassword(password));
|
||||
|
||||
R<?> resetPwdResult = remoteUserService.resetPwdByEmail(sysUser);
|
||||
|
||||
if (R.FAIL == resetPwdResult.getCode())
|
||||
{
|
||||
throw new ServiceException(resetPwdResult.getMsg());
|
||||
}
|
||||
//recordLogininfor(username, Constants.REGISTER, "注册成功");
|
||||
}else {
|
||||
throw new ServiceException("邮箱验证码错误");
|
||||
}
|
||||
}else {
|
||||
throw new ServiceException("请勿修改已输入的邮箱");
|
||||
}
|
||||
}else {
|
||||
////判断是邮箱不存在还是操作超时
|
||||
////通过邮箱获取用户
|
||||
//R<LoginUser> userByEmail = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
//
|
||||
//if(StringUtils.isNull(userByEmail.getData())){
|
||||
// throw new ServiceException("邮箱"+email+"未被注册,请检查邮箱是否正确");
|
||||
//}
|
||||
throw new ServiceException("验证码校验失败:操作超时,请重新操作");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 记录登录信息
|
||||
*
|
||||
* @param username 用户名
|
||||
* @param status 状态
|
||||
* @param message 消息内容
|
||||
* @return
|
||||
*/
|
||||
public void recordLogininfor(String username, String status, String message)
|
||||
{
|
||||
SysLogininfor logininfor = new SysLogininfor();
|
||||
logininfor.setUserName(username);
|
||||
logininfor.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
||||
logininfor.setMsg(message);
|
||||
// 日志状态
|
||||
if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER))
|
||||
{
|
||||
logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS);
|
||||
}
|
||||
else if (Constants.LOGIN_FAIL.equals(status))
|
||||
{
|
||||
logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
|
||||
}
|
||||
remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,518 @@
|
||||
package com.m2pool.auth.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.m2pool.auth.entity.EmailCodeEntity;
|
||||
import com.m2pool.auth.entity.GetEmailCodeEntity;
|
||||
import com.m2pool.auth.entity.GetLoginEmailCodeEntity;
|
||||
import com.m2pool.auth.service.MailService;
|
||||
import com.m2pool.common.core.RedisTransKey;
|
||||
import com.m2pool.common.core.Result.R;
|
||||
import com.m2pool.common.core.constant.SecurityConstants;
|
||||
import com.m2pool.common.core.exception.ServiceException;
|
||||
import com.m2pool.common.core.utils.CodeUtils;
|
||||
import com.m2pool.common.core.utils.StringUtils;
|
||||
import com.m2pool.common.redis.service.RedisService;
|
||||
import com.m2pool.common.security.utils.SecurityUtils;
|
||||
import com.m2pool.system.api.RemoteUserService;
|
||||
import com.m2pool.system.api.model.LoginUser;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||
import org.springframework.mail.javamail.MimeMessageHelper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @Description TODO
|
||||
* @Date 2024/6/12 15:08
|
||||
* @Author dy
|
||||
*/
|
||||
@Service
|
||||
public class MaliServiceImpl implements MailService {
|
||||
/**
|
||||
* 注入邮件工具类
|
||||
*/
|
||||
@Autowired
|
||||
private JavaMailSenderImpl javaMailSender;
|
||||
|
||||
@Autowired
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
@Autowired
|
||||
private RedisService redisService;
|
||||
|
||||
@Value("${spring.mail.username}")
|
||||
private String sendMailer;
|
||||
|
||||
public static String EMAIL_REGEX="^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
|
||||
|
||||
/**
|
||||
* 检测邮件信息类
|
||||
* @param to
|
||||
* @param subject
|
||||
* @param text
|
||||
*/
|
||||
private void checkMail(String to,String subject,String text){
|
||||
if(StringUtils.isEmpty(to)){
|
||||
throw new RuntimeException("邮件收信人不能为空");
|
||||
}
|
||||
if(StringUtils.isEmpty(subject)){
|
||||
throw new RuntimeException("邮件主题不能为空");
|
||||
}
|
||||
if(StringUtils.isEmpty(text)){
|
||||
throw new RuntimeException("邮件内容不能为空");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送纯文本邮件
|
||||
* @param to
|
||||
* @param subject
|
||||
* @param text
|
||||
*/
|
||||
@Override
|
||||
public void sendTextMailMessage(String to,String subject,String text){
|
||||
|
||||
try {
|
||||
//true 代表支持复杂的类型
|
||||
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(),true);
|
||||
//邮件发信人
|
||||
mimeMessageHelper.setFrom(sendMailer);
|
||||
//邮件收信人 1或多个
|
||||
mimeMessageHelper.setTo(to.split(","));
|
||||
//邮件主题
|
||||
mimeMessageHelper.setSubject(subject);
|
||||
//邮件内容
|
||||
mimeMessageHelper.setText(text);
|
||||
//邮件发送时间
|
||||
mimeMessageHelper.setSentDate(new Date());
|
||||
|
||||
//发送邮件
|
||||
javaMailSender.send(mimeMessageHelper.getMimeMessage());
|
||||
//System.out.println("发送邮件成功:"+sendMailer+"->"+to);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
//System.out.println("发送邮件失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 发送html邮件
|
||||
* @param to
|
||||
* @param subject
|
||||
* @param content
|
||||
*/
|
||||
@Override
|
||||
public void sendHtmlMailMessage(String to,String subject,String content){
|
||||
|
||||
content="<!DOCTYPE html>\n" +
|
||||
"<html>\n" +
|
||||
"<head>\n" +
|
||||
"<meta charset=\"utf-8\">\n" +
|
||||
"<title>邮件</title>\n" +
|
||||
"</head>\n" +
|
||||
"<body>\n" +
|
||||
"\t<h3>这是一封HTML邮件!</h3>\n" +
|
||||
"</body>\n" +
|
||||
"</html>";
|
||||
try {
|
||||
//true 代表支持复杂的类型
|
||||
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(),true);
|
||||
//邮件发信人
|
||||
mimeMessageHelper.setFrom(sendMailer);
|
||||
//邮件收信人 1或多个
|
||||
mimeMessageHelper.setTo(to.split(","));
|
||||
//邮件主题
|
||||
mimeMessageHelper.setSubject(subject);
|
||||
//邮件内容 true 代表支持html
|
||||
mimeMessageHelper.setText(content,true);
|
||||
//邮件发送时间
|
||||
mimeMessageHelper.setSentDate(new Date());
|
||||
|
||||
//发送邮件
|
||||
javaMailSender.send(mimeMessageHelper.getMimeMessage());
|
||||
System.out.println("发送邮件成功:"+sendMailer+"->"+to);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("发送邮件失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送带附件的邮件
|
||||
* @param to 邮件收信人
|
||||
* @param subject 邮件主题
|
||||
* @param content 邮件内容
|
||||
* @param filePath 附件路径
|
||||
*/
|
||||
@Override
|
||||
public void sendAttachmentMailMessage(String to,String subject,String content,String filePath){
|
||||
try {
|
||||
//true 代表支持复杂的类型
|
||||
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(),true);
|
||||
//邮件发信人
|
||||
mimeMessageHelper.setFrom(sendMailer);
|
||||
//邮件收信人 1或多个
|
||||
mimeMessageHelper.setTo(to.split(","));
|
||||
//邮件主题
|
||||
mimeMessageHelper.setSubject(subject);
|
||||
//邮件内容 true 代表支持html
|
||||
mimeMessageHelper.setText(content,true);
|
||||
//邮件发送时间
|
||||
mimeMessageHelper.setSentDate(new Date());
|
||||
//添加邮件附件
|
||||
FileSystemResource file = new FileSystemResource(new File(filePath));
|
||||
String fileName = file.getFilename();
|
||||
mimeMessageHelper.addAttachment(fileName, file);
|
||||
|
||||
//发送邮件
|
||||
javaMailSender.send(mimeMessageHelper.getMimeMessage());
|
||||
//System.out.println("发送邮件成功:"+sendMailer+"->"+to);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
//System.out.println("发送邮件失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送账号注册邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
@Override
|
||||
public void sendCodeMailMessage(String to, String code) {
|
||||
String subject = "账号注册,邮箱验证码";
|
||||
String text = "注册验证码10分钟内有效:\n\t"+code;
|
||||
sendTextMailMessage(to,subject,text);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送账号登录邮箱验证码
|
||||
* @param to
|
||||
* @param code
|
||||
*/
|
||||
@Override
|
||||
public void sendLoginCodeMailMessage(String to, String code) {
|
||||
String subject = "用户登录,邮箱验证码";
|
||||
String text = "登录验证码10分钟内有效:\n\t"+code;
|
||||
sendTextMailMessage(to,subject,text);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void sendResetPwdMailMessage(String to, String code) {
|
||||
String subject = "账号重置密码,邮箱验证码";
|
||||
String text = "您正在重置密码,如果不是您本人操作,请忽略。验证码10分钟内有效:\n\t"+code;
|
||||
sendTextMailMessage(to,subject,text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendUpdatePwdMailMessage(String to, String code) {
|
||||
String subject = "修改密码,邮箱验证码";
|
||||
String text = "您正在修改密码,如果不是您本人操作,请忽略。验证码10分钟内有效:\n\t"+code;
|
||||
sendTextMailMessage(to,subject,text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> emailCode(GetEmailCodeEntity entity) {
|
||||
String email = entity.getEmail();
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
return R.fail("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
return R.fail("601,\"邮箱不能为空\"");
|
||||
}
|
||||
|
||||
//手动格式验证
|
||||
|
||||
//判断用户是不是恶意刷邮箱,在规定时间内进行的
|
||||
if (redisService.hasKey(RedisTransKey.getEmailKey(email))) {
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getEmailKey(email));//user:emailCode:email
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
if (emailCodeEntity.getTimes() > 4) {
|
||||
return R.fail("请求次数过多,请10分钟后再试,(同一用户10分钟内只能请求4次)");
|
||||
} else {
|
||||
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
emailCodeEntity.setEmailCode(emailCode);
|
||||
|
||||
|
||||
//if(!email.equals(emailCodeEntity.getEmail())){
|
||||
// //email与缓存中所存邮箱不同 则请求次数重置为1
|
||||
// emailCodeEntity.setTimes(1);
|
||||
//}else {
|
||||
// emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
//}
|
||||
|
||||
emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
long overTime = redisService.getExpire(RedisTransKey.setEmailKey(email));
|
||||
redisService.setCacheObject(RedisTransKey.setEmailKey(email), emailCodeEntity, overTime, TimeUnit.SECONDS
|
||||
);
|
||||
sendCodeMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
} else {
|
||||
R<LoginUser> userByEmail = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
//if (userByName.getData() != null) {
|
||||
// return R.fail(603,"用户名"+username+"已被注册");
|
||||
//} else
|
||||
if(userByEmail.getData() !=null){
|
||||
|
||||
return R.fail(604,"邮箱"+email+"已被注册");
|
||||
} else {
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
// 最多允许用户在10分钟内发送2次的邮箱验证
|
||||
// 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次
|
||||
EmailCodeEntity emailCodeEntity = new EmailCodeEntity(
|
||||
email, emailCode,1
|
||||
);
|
||||
//设置失效时间10分钟
|
||||
redisService.setCacheObject(RedisTransKey.getEmailKey(email), emailCodeEntity,
|
||||
10L, TimeUnit.MINUTES
|
||||
);
|
||||
sendCodeMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
}
|
||||
return R.success("请求成功,验证码已经发送至用户邮箱");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> loginCode(GetLoginEmailCodeEntity entity) {
|
||||
String email = entity.getAccount();
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
return R.fail("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
return R.fail(601,"邮箱不能为空");
|
||||
}
|
||||
//String username = entity.getUserName();
|
||||
|
||||
//if(StringUtils.isNull(username)){
|
||||
// return R.fail(602,"用户名不能为空");
|
||||
//}
|
||||
|
||||
//判断用户是不是恶意刷邮箱,在规定时间内进行的
|
||||
if (redisService.hasKey(RedisTransKey.getLoginKey(email))) {
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getLoginKey(email));//user:login:email
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
if (emailCodeEntity.getTimes() > 4) {
|
||||
return R.fail("请求次数过多,请10分钟后再试,(同一用户10分钟内只能请求4次)");
|
||||
} else {
|
||||
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
emailCodeEntity.setEmailCode(emailCode);
|
||||
|
||||
//if(!email.equals(emailCodeEntity.getEmail())){
|
||||
// //email与缓存中所存邮箱不同 则请求次数重置为1
|
||||
// emailCodeEntity.setTimes(1);
|
||||
//}else {
|
||||
// emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
//}
|
||||
|
||||
emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
long overTime = redisService.getExpire(RedisTransKey.setLoginKey(email));
|
||||
redisService.setCacheObject(RedisTransKey.setLoginKey(email), emailCodeEntity, overTime, TimeUnit.SECONDS
|
||||
);
|
||||
sendLoginCodeMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
} else {
|
||||
R<LoginUser> userByEmail = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
//if (userByName.getData() != null) {
|
||||
// return R.fail(603,"用户名"+username+"已被注册");
|
||||
//} else
|
||||
if(StringUtils.isNull(userByEmail.getData())){
|
||||
|
||||
return R.fail(606,"邮箱"+email+"未注册");
|
||||
} else {
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
// 最多允许用户在10分钟内发送2次的邮箱验证
|
||||
// 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次
|
||||
EmailCodeEntity emailCodeEntity = new EmailCodeEntity(
|
||||
email, emailCode,1
|
||||
);
|
||||
//设置失效时间10分钟
|
||||
redisService.setCacheObject(RedisTransKey.getLoginKey(email), emailCodeEntity,
|
||||
10L, TimeUnit.MINUTES
|
||||
);
|
||||
sendLoginCodeMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
}
|
||||
return R.success("请求成功,验证码已经发送至用户邮箱");
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> AddCreditCode(GetEmailCodeEntity entity) {
|
||||
String email = entity.getEmail();
|
||||
String username = entity.getUserName();
|
||||
|
||||
if(StringUtils.isNull(email)){
|
||||
return R.fail(601,"邮箱不能为空");
|
||||
}
|
||||
if(StringUtils.isNull(username)){
|
||||
return R.fail(602,"用户名不能为空");
|
||||
}
|
||||
|
||||
//判断用户是不是恶意刷邮箱,在规定时间内进行的
|
||||
if (redisService.hasKey(RedisTransKey.getAddCreditEmailKey(email))) {
|
||||
long t1 = System.currentTimeMillis();
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getAddCreditEmailKey(email));//user:addCreditEmailCode:email
|
||||
|
||||
com.m2pool.system.api.entity.EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), com.m2pool.system.api.entity.EmailCodeEntity.class);
|
||||
if (emailCodeEntity.getTimes() > 4) {
|
||||
return R.fail("请求次数过多,请10分钟后再试,(同一用户10分钟内只能请求4次)");
|
||||
} else {
|
||||
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
emailCodeEntity.setEmailCode(emailCode);
|
||||
emailCodeEntity.setUserName(username);
|
||||
|
||||
|
||||
emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
long overTime = redisService.getExpire(RedisTransKey.getAddCreditEmailKey(email));
|
||||
redisService.setCacheObject(RedisTransKey.setAddCreditEmailKey(email), emailCodeEntity, overTime, TimeUnit.SECONDS
|
||||
);
|
||||
sendCodeMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
long t2 = System.currentTimeMillis();
|
||||
System.out.println("处理业务1耗时"+(t2-t1));
|
||||
} else {
|
||||
long t1 = System.currentTimeMillis();
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
// 最多允许用户在10分钟内发送2次的邮箱验证
|
||||
// 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次
|
||||
com.m2pool.system.api.entity.EmailCodeEntity emailCodeEntity = new com.m2pool.system.api.entity.EmailCodeEntity (
|
||||
username , email, emailCode,1
|
||||
);
|
||||
//设置失效时间10分钟
|
||||
redisService.setCacheObject(RedisTransKey.getAddCreditEmailKey(email), emailCodeEntity,
|
||||
10L, TimeUnit.MINUTES
|
||||
);
|
||||
String subject = "用户提现邮箱验证码";
|
||||
String text = "提现验证码,10分钟内有效:\n\t"+emailCodeEntity.getEmailCode();
|
||||
long t2 = System.currentTimeMillis();
|
||||
System.out.println("处理业务2耗时"+(t2-t1));
|
||||
sendTextMailMessage(email,subject,text);
|
||||
long t3 = System.currentTimeMillis();
|
||||
System.out.println("发送邮箱耗时"+(t3-t2));
|
||||
}
|
||||
return R.success("请求成功,验证码已经发送至用户邮箱");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> resetPwdCode(GetEmailCodeEntity entity) {
|
||||
String email = entity.getEmail();
|
||||
if(!StringUtils.isBlank(email)){
|
||||
if(!email.matches(EMAIL_REGEX)){
|
||||
return R.fail("邮箱格式错误");
|
||||
}
|
||||
}else {
|
||||
return R.fail(601,"邮箱为不能为空");
|
||||
}
|
||||
|
||||
//通过邮箱获取用户
|
||||
R<LoginUser> userByEmail = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
if(StringUtils.isNull(userByEmail.getData())){
|
||||
return R.fail("邮箱"+email+"未被注册,请检查邮箱是否正确");
|
||||
}
|
||||
|
||||
//判断用户是不是恶意刷邮箱,在规定时间内进行的
|
||||
if (redisService.hasKey(RedisTransKey.getResetPwdKey(email))) {
|
||||
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getResetPwdKey(email));//user:restPwdCode:email
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
if (emailCodeEntity.getTimes() >= 5) {
|
||||
return R.fail("请求次数过多,请10分钟后再试");
|
||||
} else {
|
||||
//这里就不去判断两次绑定的邮箱是不是一样的了,不排除第一次输入错了邮箱的情况
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
emailCodeEntity.setEmailCode(emailCode);
|
||||
emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
long overTime = redisService.getExpire(RedisTransKey.getResetPwdKey(email));
|
||||
redisService.setCacheObject(RedisTransKey.getResetPwdKey(email), emailCodeEntity, overTime, TimeUnit.SECONDS
|
||||
);
|
||||
sendResetPwdMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
} else {
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
// 最多允许用户在10分钟内发送2次的邮箱验证
|
||||
// 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次
|
||||
EmailCodeEntity emailCodeEntity = new EmailCodeEntity(
|
||||
email, emailCode,1
|
||||
);
|
||||
//设置失效时间10分钟
|
||||
redisService.setCacheObject(RedisTransKey.getResetPwdKey(email), emailCodeEntity,
|
||||
10L, TimeUnit.MINUTES
|
||||
);
|
||||
sendResetPwdMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
return R.success("请求成功,重置密码验证码已经发送至用户邮箱");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> updatePwdCode() {
|
||||
String email = SecurityUtils.getUsername();
|
||||
if(StringUtils.isBlank(email)){
|
||||
return R.fail("token解析失败");
|
||||
}
|
||||
//通过邮箱获取用户
|
||||
R<LoginUser> userByEmail = remoteUserService.getUserInfo(email, SecurityConstants.INNER);
|
||||
|
||||
if(StringUtils.isNull(userByEmail.getData())){
|
||||
return R.fail("token解析异常");
|
||||
}
|
||||
|
||||
//判断用户是不是恶意刷邮箱,在规定时间内进行的
|
||||
if (redisService.hasKey(RedisTransKey.getUpdatePwdKey(email))) {
|
||||
|
||||
Object o = redisService.getCacheObject(RedisTransKey.getUpdatePwdKey(email));//user:updatePwdCode:email
|
||||
|
||||
EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class);
|
||||
if (emailCodeEntity.getTimes() >= 5) {
|
||||
return R.fail("请求次数过多,请10分钟后再试");
|
||||
} else {
|
||||
//这里就不去判断两次绑定的邮箱是不是一样的了,不排除第一次输入错了邮箱的情况
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
emailCodeEntity.setEmailCode(emailCode);
|
||||
emailCodeEntity.setTimes(emailCodeEntity.getTimes() + 1);
|
||||
long overTime = redisService.getExpire(RedisTransKey.getUpdatePwdKey(email));
|
||||
redisService.setCacheObject(RedisTransKey.getUpdatePwdKey(email), emailCodeEntity, overTime, TimeUnit.SECONDS
|
||||
);
|
||||
sendUpdatePwdMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
} else {
|
||||
String emailCode = CodeUtils.creatCode(6);
|
||||
// 最多允许用户在10分钟内发送2次的邮箱验证
|
||||
// 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次
|
||||
EmailCodeEntity emailCodeEntity = new EmailCodeEntity(
|
||||
email, emailCode,1
|
||||
);
|
||||
//设置失效时间10分钟
|
||||
redisService.setCacheObject(RedisTransKey.getUpdatePwdKey(email), emailCodeEntity,
|
||||
10L, TimeUnit.MINUTES
|
||||
);
|
||||
sendUpdatePwdMailMessage(email, emailCodeEntity.getEmailCode());
|
||||
}
|
||||
return R.success("请求成功,修改密码验证码已经发送至用户邮箱");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
159
m2pool-auth/src/main/resources/bootstrap.yml
Normal file
159
m2pool-auth/src/main/resources/bootstrap.yml
Normal file
@@ -0,0 +1,159 @@
|
||||
#Tomcat
|
||||
server:
|
||||
port: 9200
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
#邮箱基本配置
|
||||
mail:
|
||||
# 配置在limit_time内,用户可以发送limit次验证码
|
||||
limit: 2 这个是我额外的配置,结合邮箱服务用的
|
||||
limitTime: 10 这个是我额外的配置
|
||||
#配置smtp服务主机地址
|
||||
# sina smtp.sina.cn
|
||||
# aliyun smtp.aliyun.com
|
||||
# 163 smtp.163.com 端口号465或994
|
||||
host: mail.privateemail.com
|
||||
#发送者邮箱
|
||||
username: do.not.reply@m2pool.com
|
||||
#配置密码,注意不是真正的密码,而是刚刚申请到的授权码
|
||||
# password:
|
||||
# password: M2pool2024@!
|
||||
# password: axvm-zfgx-cgcg-qhhu
|
||||
password: M2202401!
|
||||
|
||||
|
||||
#端口号
|
||||
port: 587
|
||||
#默认的邮件编码为UTF-8
|
||||
default-encoding: UTF-8
|
||||
#其他参数
|
||||
properties:
|
||||
mail:
|
||||
#配置SSL 加密工厂
|
||||
smtp:
|
||||
ssl:
|
||||
#本地测试,先放开ssl
|
||||
enable: false
|
||||
required: false
|
||||
#开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
|
||||
debug: false
|
||||
socketFactory:
|
||||
class: javax.net.ssl.SSLSocketFactory
|
||||
|
||||
application:
|
||||
# 应用名称
|
||||
name: m2pool-auth
|
||||
profiles:
|
||||
# 环境配置
|
||||
active: prod
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
# 服务注册地址
|
||||
server-addr: 127.0.0.1:8808
|
||||
namespace: m2_prod
|
||||
group: m2_prod_group
|
||||
config:
|
||||
# 配置中心地址
|
||||
server-addr: 127.0.0.1:8808
|
||||
# 配置文件格式
|
||||
file-extension: yml
|
||||
# 共享配置
|
||||
shared-configs:
|
||||
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
namespace: m2_prod
|
||||
group: m2_prod_group
|
||||
|
||||
#server:
|
||||
# port: 9500
|
||||
#
|
||||
## Spring
|
||||
#spring:
|
||||
# #邮箱基本配置
|
||||
# mail:
|
||||
# # 配置在limit_time内,用户可以发送limit次验证码
|
||||
# limit: 2 这个是我额外的配置,结合邮箱服务用的
|
||||
# limitTime: 10 这个是我额外的配置
|
||||
# #配置smtp服务主机地址
|
||||
# # sina smtp.sina.cn
|
||||
# # aliyun smtp.aliyun.com
|
||||
# # 163 smtp.163.com 端口号465或994
|
||||
# host: mail.privateemail.com
|
||||
# #发送者邮箱
|
||||
# username: do.not.reply@m2pool.com
|
||||
# #配置密码,注意不是真正的密码,而是刚刚申请到的授权码
|
||||
# # password:
|
||||
# # password: M2202401!
|
||||
# # password: axvm-zfgx-cgcg-qhhu
|
||||
# password: M2202401!
|
||||
#
|
||||
# #端口号
|
||||
# port: 587
|
||||
## port: 465
|
||||
# #默认的邮件编码为UTF-8
|
||||
# default-encoding: UTF-8
|
||||
# #其他参数
|
||||
# properties:
|
||||
# mail:
|
||||
# #配置SSL 加密工厂
|
||||
# smtp:
|
||||
# ssl:
|
||||
# #本地测试,先放开ssl
|
||||
# enable: false
|
||||
# required: false
|
||||
# #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
|
||||
# debug: false
|
||||
# socketFactory:
|
||||
# class: javax.net.ssl.SSLSocketFactory
|
||||
##
|
||||
## host: smtp.qq.com
|
||||
## #发送者邮箱
|
||||
## username: 1328642438@qq.com
|
||||
## #配置密码,注意不是真正的密码,而是刚刚申请到的授权码
|
||||
## # password:
|
||||
## # password: M2pool2024@!
|
||||
## # password: axvm-zfgx-cgcg-qhhu
|
||||
## password: eqrzqxeqzlshhedh
|
||||
##
|
||||
## #端口号
|
||||
## port: 465
|
||||
## #默认的邮件编码为UTF-8
|
||||
## default-encoding: UTF-8
|
||||
## #其他参数
|
||||
## properties:
|
||||
## mail:
|
||||
## #配置SSL 加密工厂
|
||||
## smtp:
|
||||
## ssl:
|
||||
## #本地测试,先放开ssl
|
||||
## enable: true
|
||||
## required: true
|
||||
## #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
|
||||
## debug: false
|
||||
## socketFactory:
|
||||
## class: javax.net.ssl.SSLSocketFactory
|
||||
#
|
||||
# application:
|
||||
# # 应用名称
|
||||
# name: m2pool-auth
|
||||
# profiles:
|
||||
# # 环境配置
|
||||
# active: test
|
||||
# cloud:
|
||||
# nacos:
|
||||
# discovery:
|
||||
# # 服务注册地址
|
||||
# server-addr: 127.0.0.1:8808
|
||||
# namespace: m2_test
|
||||
# group: m2_test_group
|
||||
# config:
|
||||
# # 配置中心地址
|
||||
# server-addr: 127.0.0.1:8808
|
||||
# # 配置文件格式
|
||||
# file-extension: yml
|
||||
# # 共享配置
|
||||
# shared-configs:
|
||||
# - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
# namespace: m2_test
|
||||
# group: m2_test_group
|
||||
74
m2pool-auth/src/main/resources/logback.xml
Normal file
74
m2pool-auth/src/main/resources/logback.xml
Normal file
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration scan="true" scanPeriod="60 seconds" debug="false">
|
||||
<!-- 日志存放路径 -->
|
||||
<property name="log.path" value="logs/m2pool-auth" />
|
||||
<!-- 日志输出格式 -->
|
||||
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 系统日志输出 -->
|
||||
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/info.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>INFO</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/error.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>ERROR</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 系统模块日志级别控制 -->
|
||||
<logger name="com.m2pool" level="info" />
|
||||
<!-- Spring日志级别控制 -->
|
||||
<logger name="org.springframework" level="warn" />
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="console" />
|
||||
</root>
|
||||
|
||||
<!--系统操作日志-->
|
||||
<root level="info">
|
||||
<appender-ref ref="file_info" />
|
||||
<appender-ref ref="file_error" />
|
||||
</root>
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user