Commit 27a12e09c27f5936e87afae45a7f0b0338676b02
Exists in
master
Merge remote-tracking branch 'origin/master'
# Conflicts: # cloud/getaway/src/main/resources/application.yml
Showing
47 changed files
with
880 additions
and
2143 deletions
Show diff stats
cloud/autho/pom.xml
@@ -13,63 +13,142 @@ | @@ -13,63 +13,142 @@ | ||
13 | <name>autho</name> | 13 | <name>autho</name> |
14 | <description>Demo project for Spring Boot</description> | 14 | <description>Demo project for Spring Boot</description> |
15 | 15 | ||
16 | - <properties> | ||
17 | - <java.version>1.8</java.version> | ||
18 | - <spring-cloud.version>Greenwich.SR2</spring-cloud.version> | ||
19 | - </properties> | ||
20 | - | ||
21 | <dependencies> | 16 | <dependencies> |
22 | <dependency> | 17 | <dependency> |
23 | <groupId>com.sincere</groupId> | 18 | <groupId>com.sincere</groupId> |
24 | <artifactId>common</artifactId> | 19 | <artifactId>common</artifactId> |
25 | - <version>0.0.1-SNAPSHOT</version> | 20 | + <version>1.0.0</version> |
26 | </dependency> | 21 | </dependency> |
27 | <dependency> | 22 | <dependency> |
28 | - <groupId>org.springframework.cloud</groupId> | ||
29 | - <artifactId>spring-cloud-starter-oauth2</artifactId> | 23 | + <groupId>org.springframework.boot</groupId> |
24 | + <artifactId>spring-boot-starter-test</artifactId> | ||
25 | + <scope>test</scope> | ||
30 | </dependency> | 26 | </dependency> |
31 | - | ||
32 | <dependency> | 27 | <dependency> |
33 | <groupId>org.springframework.cloud</groupId> | 28 | <groupId>org.springframework.cloud</groupId> |
34 | - <artifactId>spring-cloud-starter-security</artifactId> | ||
35 | - <version>2.1.3.RELEASE</version> | 29 | + <artifactId>spring-cloud-starter-feign</artifactId> |
30 | + <version>1.3.6.RELEASE</version> | ||
36 | </dependency> | 31 | </dependency> |
37 | <dependency> | 32 | <dependency> |
38 | <groupId>org.springframework.cloud</groupId> | 33 | <groupId>org.springframework.cloud</groupId> |
39 | - <artifactId>spring-cloud-starter-openfeign</artifactId> | 34 | + <artifactId>spring-cloud-openfeign-core</artifactId> |
35 | + <version>2.1.2.RELEASE</version> | ||
40 | </dependency> | 36 | </dependency> |
41 | - | ||
42 | <dependency> | 37 | <dependency> |
43 | - <groupId>org.springframework.boot</groupId> | ||
44 | - <artifactId>spring-boot-starter-data-redis</artifactId> | 38 | + <groupId>org.apache.commons</groupId> |
39 | + <artifactId>commons-lang3</artifactId> | ||
40 | + <version>3.3.2</version> | ||
45 | </dependency> | 41 | </dependency> |
46 | <dependency> | 42 | <dependency> |
47 | - <groupId>io.grpc</groupId> | ||
48 | - <artifactId>grpc-core</artifactId> | ||
49 | - <version>1.18.0</version> | 43 | + <groupId>org.mybatis.spring.boot</groupId> |
44 | + <artifactId>mybatis-spring-boot-starter</artifactId> | ||
45 | + <version>1.3.0</version> | ||
50 | </dependency> | 46 | </dependency> |
51 | - | ||
52 | <dependency> | 47 | <dependency> |
53 | - <groupId>io.springfox</groupId> | ||
54 | - <artifactId>springfox-swagger2</artifactId> | ||
55 | - <version>2.9.2</version> | 48 | + <groupId>com.microsoft.sqlserver</groupId> |
49 | + <artifactId>mssql-jdbc</artifactId> | ||
50 | + <version>6.4.0.jre8</version> | ||
56 | </dependency> | 51 | </dependency> |
57 | - | ||
58 | <dependency> | 52 | <dependency> |
59 | - <groupId>io.springfox</groupId> | ||
60 | - <artifactId>springfox-swagger-ui</artifactId> | ||
61 | - <version>2.9.2</version> | 53 | + <groupId>org.springframework.boot</groupId> |
54 | + <artifactId>spring-boot-starter-web</artifactId> | ||
62 | </dependency> | 55 | </dependency> |
63 | - | ||
64 | </dependencies> | 56 | </dependencies> |
65 | 57 | ||
58 | + <dependencyManagement> | ||
59 | + <dependencies> | ||
60 | + <dependency> | ||
61 | + <groupId>org.springframework.cloud</groupId> | ||
62 | + <artifactId>spring-cloud-dependencies</artifactId> | ||
63 | + <version>${spring-cloud.version}</version> | ||
64 | + <type>pom</type> | ||
65 | + <scope>import</scope> | ||
66 | + </dependency> | ||
67 | + </dependencies> | ||
68 | + </dependencyManagement> | ||
69 | + | ||
66 | <build> | 70 | <build> |
71 | + <!--打包文件名--> | ||
72 | + <finalName>quartz_server</finalName> | ||
73 | + <!--打包方式--> | ||
67 | <plugins> | 74 | <plugins> |
75 | + <!-- 设置编译版本 --> | ||
76 | + <plugin> | ||
77 | + <groupId>org.apache.maven.plugins</groupId> | ||
78 | + <artifactId>maven-compiler-plugin</artifactId> | ||
79 | + <version>3.1</version> | ||
80 | + <configuration> | ||
81 | + <source>1.8</source> | ||
82 | + <target>1.8</target> | ||
83 | + <encoding>UTF-8</encoding> | ||
84 | + </configuration> | ||
85 | + </plugin> | ||
86 | + <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> | ||
87 | + <!-- 本地启动需要注释--> | ||
88 | + <plugin> | ||
89 | + <groupId>org.apache.maven.plugins</groupId> | ||
90 | + <artifactId>maven-jar-plugin</artifactId> | ||
91 | + <configuration> | ||
92 | + <archive> | ||
93 | + <manifest> | ||
94 | + <mainClass>com.sincere.userSearch.UserApplication</mainClass> | ||
95 | + <addClasspath>true</addClasspath> | ||
96 | + <classpathPrefix>lib/</classpathPrefix> | ||
97 | + </manifest> | ||
98 | + <manifestEntries> | ||
99 | + <Class-Path>./config/</Class-Path> | ||
100 | + </manifestEntries> | ||
101 | + </archive> | ||
102 | + <excludes> | ||
103 | + <exclude>config/**</exclude> | ||
104 | + </excludes> | ||
105 | + <classesDirectory></classesDirectory> | ||
106 | + </configuration> | ||
107 | + </plugin> | ||
108 | + <!-- 拷贝依赖的jar包到lib目录 --> | ||
68 | <plugin> | 109 | <plugin> |
69 | - <groupId>org.springframework.boot</groupId> | ||
70 | - <artifactId>spring-boot-maven-plugin</artifactId> | 110 | + <groupId>org.apache.maven.plugins</groupId> |
111 | + <artifactId>maven-dependency-plugin</artifactId> | ||
112 | + <executions> | ||
113 | + <execution> | ||
114 | + <id>copy</id> | ||
115 | + <phase>package</phase> | ||
116 | + <goals> | ||
117 | + <goal>copy-dependencies</goal> | ||
118 | + </goals> | ||
119 | + <configuration> | ||
120 | + <outputDirectory> | ||
121 | + ${project.build.directory}/lib | ||
122 | + </outputDirectory> | ||
123 | + </configuration> | ||
124 | + </execution> | ||
125 | + </executions> | ||
126 | + </plugin> | ||
127 | + <!-- 解决资源文件的编码问题 --> | ||
128 | + <plugin> | ||
129 | + <groupId>org.apache.maven.plugins</groupId> | ||
130 | + <artifactId>maven-resources-plugin</artifactId> | ||
131 | + <version>2.5</version> | ||
132 | + <configuration> | ||
133 | + <encoding>UTF-8</encoding> | ||
134 | + </configuration> | ||
135 | + </plugin> | ||
136 | + <!-- 打包source文件为jar文件 --> | ||
137 | + <plugin> | ||
138 | + <artifactId>maven-source-plugin</artifactId> | ||
139 | + <version>2.2</version> | ||
140 | + <configuration> | ||
141 | + <attach>true</attach> | ||
142 | + </configuration> | ||
143 | + <executions> | ||
144 | + <execution> | ||
145 | + <phase>compile</phase> | ||
146 | + <goals> | ||
147 | + <goal>jar</goal> | ||
148 | + </goals> | ||
149 | + </execution> | ||
150 | + </executions> | ||
71 | </plugin> | 151 | </plugin> |
72 | </plugins> | 152 | </plugins> |
73 | </build> | 153 | </build> |
74 | - | ||
75 | </project> | 154 | </project> |
cloud/autho/src/main/java/com/sincere/autho/AuthoApplication.java
1 | package com.sincere.autho; | 1 | package com.sincere.autho; |
2 | 2 | ||
3 | +import org.mybatis.spring.annotation.MapperScan; | ||
3 | import org.springframework.boot.SpringApplication; | 4 | import org.springframework.boot.SpringApplication; |
4 | import org.springframework.boot.autoconfigure.SpringBootApplication; | 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; |
5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; | 6 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; |
6 | 7 | ||
7 | @EnableDiscoveryClient | 8 | @EnableDiscoveryClient |
8 | @SpringBootApplication | 9 | @SpringBootApplication |
10 | +@MapperScan("com.sincere.autho.mapper") | ||
9 | public class AuthoApplication { | 11 | public class AuthoApplication { |
10 | 12 | ||
11 | public static void main(String[] args) { | 13 | public static void main(String[] args) { |
cloud/autho/src/main/java/com/sincere/autho/Swagger2.java
0 → 100644
@@ -0,0 +1,52 @@ | @@ -0,0 +1,52 @@ | ||
1 | +package com.sincere.autho; | ||
2 | + | ||
3 | +import io.swagger.annotations.ApiOperation; | ||
4 | +import org.springframework.context.annotation.Bean; | ||
5 | +import org.springframework.context.annotation.Configuration; | ||
6 | +import springfox.documentation.builders.ApiInfoBuilder; | ||
7 | +import springfox.documentation.builders.ParameterBuilder; | ||
8 | +import springfox.documentation.builders.PathSelectors; | ||
9 | +import springfox.documentation.builders.RequestHandlerSelectors; | ||
10 | +import springfox.documentation.schema.ModelRef; | ||
11 | +import springfox.documentation.service.ApiInfo; | ||
12 | +import springfox.documentation.service.Parameter; | ||
13 | +import springfox.documentation.spi.DocumentationType; | ||
14 | +import springfox.documentation.spring.web.plugins.Docket; | ||
15 | +import springfox.documentation.swagger2.annotations.EnableSwagger2; | ||
16 | + | ||
17 | +import java.util.ArrayList; | ||
18 | +import java.util.List; | ||
19 | + | ||
20 | +@EnableSwagger2 | ||
21 | +@Configuration //让Spring来加载该类配置 | ||
22 | +public class Swagger2 { | ||
23 | + | ||
24 | + @Bean | ||
25 | + public Docket createRestApi() { | ||
26 | + ParameterBuilder ticketPar = new ParameterBuilder(); | ||
27 | + List<Parameter> pars = new ArrayList<Parameter>(); | ||
28 | + ticketPar.name("X-Authorization").description("user token") | ||
29 | + .modelRef(new ModelRef("string")).parameterType("header") | ||
30 | + .required(false).build(); //header中的ticket参数非必填,传空也可以 | ||
31 | + pars.add(ticketPar.build()); | ||
32 | + | ||
33 | + | ||
34 | + return new Docket(DocumentationType.SWAGGER_2) | ||
35 | + .apiInfo(apiInfo()) | ||
36 | + .enableUrlTemplating(true) | ||
37 | + .select() | ||
38 | + // 扫描所有有注解的api,用这种方式更灵活 | ||
39 | + .apis(RequestHandlerSelectors.basePackage("com.sincere.autho.control")) | ||
40 | + .paths(PathSelectors.any()) | ||
41 | + .build().globalOperationParameters(pars); | ||
42 | + | ||
43 | + } | ||
44 | + private ApiInfo apiInfo() { | ||
45 | + return new ApiInfoBuilder() | ||
46 | + .title("Spring Boot中使用Swagger2构建RESTful APIs") | ||
47 | + .description("接口文档") | ||
48 | + .termsOfServiceUrl("") | ||
49 | + .version("1.0") | ||
50 | + .build(); | ||
51 | + } | ||
52 | +} |
cloud/autho/src/main/java/com/sincere/autho/annotation/EnableLogging.java
@@ -1,22 +0,0 @@ | @@ -1,22 +0,0 @@ | ||
1 | -package com.sincere.autho.annotation; | ||
2 | - | ||
3 | -import com.sincere.autho.autoconfigure.LoggingConfigurationSelector; | ||
4 | -import org.springframework.context.annotation.Import; | ||
5 | - | ||
6 | -import java.lang.annotation.*; | ||
7 | - | ||
8 | - | ||
9 | -/** | ||
10 | - * 启动日志框架支持 | ||
11 | - * @author owen | ||
12 | - * @create 2017年7月2日 | ||
13 | - */ | ||
14 | - | ||
15 | -@Target(ElementType.TYPE) | ||
16 | -@Retention(RetentionPolicy.RUNTIME) | ||
17 | -@Documented | ||
18 | -//自动装配starter | ||
19 | -@Import(LoggingConfigurationSelector.class) | ||
20 | -public @interface EnableLogging{ | ||
21 | -// String name() ; | ||
22 | -} | ||
23 | \ No newline at end of file | 0 | \ No newline at end of file |
cloud/autho/src/main/java/com/sincere/autho/annotation/datasource/DataSource.java
@@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
1 | -package com.sincere.autho.annotation.datasource; | ||
2 | - | ||
3 | -import java.lang.annotation.*; | ||
4 | - | ||
5 | - | ||
6 | -/** | ||
7 | - * 数据源选择 | ||
8 | - * @author owen | ||
9 | - * @create 2017年7月2日 | ||
10 | - */ | ||
11 | -@Target({ElementType.METHOD, ElementType.TYPE}) | ||
12 | -@Retention(RetentionPolicy.RUNTIME) | ||
13 | -@Documented | ||
14 | -public @interface DataSource { | ||
15 | - String name(); | ||
16 | -} | ||
17 | \ No newline at end of file | 0 | \ No newline at end of file |
cloud/autho/src/main/java/com/sincere/autho/annotation/log/LogAnnotation.java
@@ -1,26 +0,0 @@ | @@ -1,26 +0,0 @@ | ||
1 | -package com.sincere.autho.annotation.log; | ||
2 | - | ||
3 | -import java.lang.annotation.*; | ||
4 | - | ||
5 | -/** | ||
6 | - * 日志注解 | ||
7 | - * @author owen | ||
8 | - * @create 2017年7月2日 | ||
9 | - */ | ||
10 | -@Target({ElementType.METHOD, ElementType.TYPE}) | ||
11 | -@Retention(RetentionPolicy.RUNTIME) | ||
12 | -@Documented | ||
13 | -public @interface LogAnnotation { | ||
14 | - | ||
15 | - /** | ||
16 | - * 模块 | ||
17 | - * @return | ||
18 | - */ | ||
19 | - String module(); | ||
20 | - | ||
21 | - /** | ||
22 | - * 记录执行参数 | ||
23 | - * @return | ||
24 | - */ | ||
25 | - boolean recordRequestParam() default true; | ||
26 | -} |
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/LoggingConfigurationSelector.java
@@ -1,23 +0,0 @@ | @@ -1,23 +0,0 @@ | ||
1 | -package com.sincere.autho.autoconfigure; | ||
2 | - | ||
3 | -import org.springframework.context.annotation.ImportSelector; | ||
4 | -import org.springframework.core.type.AnnotationMetadata; | ||
5 | - | ||
6 | -/** | ||
7 | - * @author owen | ||
8 | - * @create 2017年7月2日 | ||
9 | - * 装配bean | ||
10 | - */ | ||
11 | -public class LoggingConfigurationSelector implements ImportSelector { | ||
12 | - | ||
13 | - @Override | ||
14 | - public String[] selectImports(AnnotationMetadata importingClassMetadata) { | ||
15 | - // TODO Auto-generated method stub | ||
16 | -// importingClassMetadata.getAllAnnotationAttributes(EnableEcho.class.getName()); | ||
17 | - return new String[] { | ||
18 | - "com.sincere.autho.autoconfigure.datasource.DataSourceAspect", | ||
19 | - "com.sincere.autho.autoconfigure.log.LogAnnotationAspect" | ||
20 | - }; | ||
21 | - } | ||
22 | - | ||
23 | -} |
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/datasource/DataSourceAspect.java
@@ -1,42 +0,0 @@ | @@ -1,42 +0,0 @@ | ||
1 | -package com.sincere.autho.autoconfigure.datasource; | ||
2 | - | ||
3 | -import com.sincere.autho.annotation.datasource.DataSource; | ||
4 | -import com.sincere.common.config.DataSourceHolder; | ||
5 | -import com.sincere.common.config.DataSourceKey; | ||
6 | -import org.aspectj.lang.JoinPoint; | ||
7 | -import org.aspectj.lang.annotation.After; | ||
8 | -import org.aspectj.lang.annotation.Aspect; | ||
9 | -import org.aspectj.lang.annotation.Before; | ||
10 | -import org.slf4j.Logger; | ||
11 | -import org.slf4j.LoggerFactory; | ||
12 | -import org.springframework.core.annotation.Order; | ||
13 | - | ||
14 | -/** | ||
15 | - * 切换数据源Advice | ||
16 | - */ | ||
17 | -@Aspect | ||
18 | -@Order(-1) // 保证该AOP在@Transactional之前执行 | ||
19 | -public class DataSourceAspect { | ||
20 | - | ||
21 | - private static final Logger logger = LoggerFactory.getLogger(DataSourceAspect.class); | ||
22 | - | ||
23 | - @Before("@annotation(ds)") | ||
24 | - public void changeDataSource(JoinPoint point, DataSource ds) throws Throwable { | ||
25 | - String dsId = ds.name(); | ||
26 | - try { | ||
27 | - DataSourceKey dataSourceKey = DataSourceKey.valueOf(dsId); | ||
28 | - DataSourceHolder.setDataSourceKey(dataSourceKey); | ||
29 | - } catch (Exception e) { | ||
30 | - logger.error("数据源[{}]不存在,使用默认数据源 > {}", ds.name(), point.getSignature()); | ||
31 | - } | ||
32 | - | ||
33 | - | ||
34 | - } | ||
35 | - | ||
36 | - @After("@annotation(ds)") | ||
37 | - public void restoreDataSource(JoinPoint point, DataSource ds) { | ||
38 | - logger.debug("Revert DataSource : {transIdo} > {}", ds.name(), point.getSignature()); | ||
39 | - DataSourceHolder.clearDataSourceKey(); | ||
40 | - } | ||
41 | - | ||
42 | -} | ||
43 | \ No newline at end of file | 0 | \ No newline at end of file |
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/log/LogAnnotationAspect.java
@@ -1,133 +0,0 @@ | @@ -1,133 +0,0 @@ | ||
1 | -package com.sincere.autho.autoconfigure.log; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSON; | ||
4 | -import com.alibaba.fastjson.JSONObject; | ||
5 | -import com.sincere.autho.annotation.log.LogAnnotation; | ||
6 | -import com.sincere.autho.log.service.LogService; | ||
7 | -import com.sincere.autho.log.service.impl.LogServiceImpl; | ||
8 | -import com.sincere.autho.utils.SysUserUtil; | ||
9 | -import com.sincere.common.model.log.SysLog; | ||
10 | -import com.sincere.common.model.system.LoginAppUser; | ||
11 | -import com.sincere.common.util.SpringUtils; | ||
12 | -import org.aspectj.lang.ProceedingJoinPoint; | ||
13 | -import org.aspectj.lang.annotation.Around; | ||
14 | -import org.aspectj.lang.annotation.Aspect; | ||
15 | -import org.aspectj.lang.reflect.MethodSignature; | ||
16 | -import org.slf4j.Logger; | ||
17 | -import org.slf4j.LoggerFactory; | ||
18 | -import org.springframework.core.annotation.Order; | ||
19 | - | ||
20 | -import javax.servlet.http.HttpServletRequest; | ||
21 | -import javax.servlet.http.HttpServletResponse; | ||
22 | -import java.util.ArrayList; | ||
23 | -import java.util.Date; | ||
24 | -import java.util.List; | ||
25 | -import java.util.concurrent.CompletableFuture; | ||
26 | -import java.util.concurrent.ThreadLocalRandom; | ||
27 | - | ||
28 | -/** | ||
29 | - * 保存日志 | ||
30 | - * | ||
31 | - * @author owen | ||
32 | - * @create 2017年7月2日 | ||
33 | - */ | ||
34 | -@Aspect | ||
35 | -@Order(-1) // 保证该AOP在@Transactional之前执行 | ||
36 | -public class LogAnnotationAspect { | ||
37 | - | ||
38 | - private static final Logger logger = LoggerFactory.getLogger(LogAnnotationAspect.class); | ||
39 | - | ||
40 | - @Around("@annotation(ds)") | ||
41 | - public Object logSave(ProceedingJoinPoint joinPoint, LogAnnotation ds) throws Throwable { | ||
42 | - | ||
43 | - // 请求流水号 | ||
44 | - String transid = getRandom(); | ||
45 | - // 记录开始时间 | ||
46 | - long start = System.currentTimeMillis(); | ||
47 | - // 获取方法参数 | ||
48 | - String url = null; | ||
49 | - String httpMethod = null; | ||
50 | - Object result = null; | ||
51 | - List<Object> httpReqArgs = new ArrayList<Object>(); | ||
52 | - SysLog log = new SysLog(); | ||
53 | - log.setCreateTime(new Date()); | ||
54 | - LoginAppUser loginAppUser = SysUserUtil.getLoginAppUser(); | ||
55 | - if (loginAppUser != null) { | ||
56 | - log.setUsername(loginAppUser.getUsername()); | ||
57 | - } | ||
58 | - | ||
59 | - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); | ||
60 | - | ||
61 | - LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class); | ||
62 | - log.setModule(logAnnotation.module() + ":" + methodSignature.getDeclaringTypeName() + "/" | ||
63 | - + methodSignature.getName()); | ||
64 | - | ||
65 | - Object[] args = joinPoint.getArgs();// 参数值 | ||
66 | - url = methodSignature.getDeclaringTypeName() + "/"+ methodSignature.getName(); | ||
67 | - for (Object object : args) { | ||
68 | - if (object instanceof HttpServletRequest) { | ||
69 | - HttpServletRequest request = (HttpServletRequest) object; | ||
70 | - url = request.getRequestURI(); | ||
71 | - httpMethod = request.getMethod(); | ||
72 | - } else if (object instanceof HttpServletResponse) { | ||
73 | - } else { | ||
74 | - | ||
75 | - httpReqArgs.add(object); | ||
76 | - } | ||
77 | - } | ||
78 | - | ||
79 | - try { | ||
80 | - String params = JSONObject.toJSONString(httpReqArgs); | ||
81 | - log.setParams(params); | ||
82 | - // 打印请求参数参数 | ||
83 | - logger.info("开始请求,transid={}, url={} , httpMethod={}, reqData={} ", transid, url, httpMethod, params); | ||
84 | - } catch (Exception e) { | ||
85 | - logger.error("记录参数失败:{}", e.getMessage()); | ||
86 | - } | ||
87 | - | ||
88 | - try { | ||
89 | - // 调用原来的方法 | ||
90 | - result = joinPoint.proceed(); | ||
91 | - log.setFlag(Boolean.TRUE); | ||
92 | - } catch (Exception e) { | ||
93 | - log.setFlag(Boolean.FALSE); | ||
94 | - log.setRemark(e.getMessage()); | ||
95 | - | ||
96 | - throw e; | ||
97 | - } finally { | ||
98 | - | ||
99 | - CompletableFuture.runAsync(() -> { | ||
100 | - try { | ||
101 | - if (logAnnotation.recordRequestParam()) { | ||
102 | - LogService logService = SpringUtils.getBean(LogServiceImpl.class); | ||
103 | - logService.save(log); | ||
104 | - } | ||
105 | - } catch (Exception e) { | ||
106 | - logger.error("记录参数失败:{}", e.getMessage()); | ||
107 | - } | ||
108 | - | ||
109 | - }); | ||
110 | - // 获取回执报文及耗时 | ||
111 | - logger.info("请求完成, transid={}, 耗时={}, resp={}:", transid, (System.currentTimeMillis() - start), | ||
112 | - result == null ? null : JSON.toJSONString(result)); | ||
113 | - | ||
114 | - } | ||
115 | - return result; | ||
116 | - } | ||
117 | - | ||
118 | - /** | ||
119 | - * 生成日志随机数 | ||
120 | - * | ||
121 | - * @return | ||
122 | - */ | ||
123 | - public String getRandom() { | ||
124 | - int i = 0; | ||
125 | - StringBuilder st = new StringBuilder(); | ||
126 | - while (i < 5) { | ||
127 | - i++; | ||
128 | - st.append(ThreadLocalRandom.current().nextInt(10)); | ||
129 | - } | ||
130 | - return st.toString() + System.currentTimeMillis(); | ||
131 | - } | ||
132 | - | ||
133 | -} | ||
134 | \ No newline at end of file | 0 | \ No newline at end of file |
cloud/autho/src/main/java/com/sincere/autho/config/OAuth2ServerConfig.java
@@ -1,260 +0,0 @@ | @@ -1,260 +0,0 @@ | ||
1 | - | ||
2 | -package com.sincere.autho.config; | ||
3 | - | ||
4 | -import com.sincere.autho.service.RedisAuthorizationCodeServices; | ||
5 | -import com.sincere.autho.service.RedisClientDetailsService; | ||
6 | -import com.sincere.autho.token.RedisTemplateTokenStore; | ||
7 | -import com.sincere.common.props.PermitUrlProperties; | ||
8 | -import org.springframework.beans.factory.annotation.Autowired; | ||
9 | -import org.springframework.boot.autoconfigure.AutoConfigureAfter; | ||
10 | -import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
11 | -import org.springframework.context.annotation.Bean; | ||
12 | -import org.springframework.context.annotation.Configuration; | ||
13 | -import org.springframework.data.redis.core.RedisTemplate; | ||
14 | -import org.springframework.security.authentication.AuthenticationManager; | ||
15 | -import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||
16 | -import org.springframework.security.config.annotation.web.builders.WebSecurity; | ||
17 | -import org.springframework.security.core.userdetails.UserDetailsService; | ||
18 | -import org.springframework.security.oauth2.common.OAuth2AccessToken; | ||
19 | -import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; | ||
20 | -import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; | ||
21 | -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; | ||
22 | -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; | ||
23 | -import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; | ||
24 | -import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; | ||
25 | -import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; | ||
26 | -import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices; | ||
27 | -import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator; | ||
28 | -import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; | ||
29 | -import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; | ||
30 | -import org.springframework.security.web.util.matcher.RequestMatcher; | ||
31 | -import org.springframework.stereotype.Component; | ||
32 | -import org.springframework.util.AntPathMatcher; | ||
33 | - | ||
34 | -import javax.annotation.Resource; | ||
35 | -import javax.servlet.http.HttpServletRequest; | ||
36 | -import javax.sql.DataSource; | ||
37 | - | ||
38 | -/** | ||
39 | - * @author owen 624191343@qq.com | ||
40 | - * @version 创建时间:2017年11月12日 上午22:57:51 | ||
41 | - */ | ||
42 | -@Configuration | ||
43 | -public class OAuth2ServerConfig { | ||
44 | - | ||
45 | - @Resource | ||
46 | - private DataSource dataSource; | ||
47 | - @Resource | ||
48 | - private RedisTemplate<String, Object> redisTemplate; | ||
49 | - | ||
50 | - /** | ||
51 | - * 声明 ClientDetails实现 | ||
52 | - */ | ||
53 | - @Bean | ||
54 | - public RedisClientDetailsService redisClientDetailsService() { | ||
55 | - RedisClientDetailsService clientDetailsService = new RedisClientDetailsService(dataSource); | ||
56 | - clientDetailsService.setRedisTemplate(redisTemplate); | ||
57 | - return clientDetailsService; | ||
58 | - } | ||
59 | - | ||
60 | - | ||
61 | - @Bean | ||
62 | - public RandomValueAuthorizationCodeServices authorizationCodeServices() { | ||
63 | - RedisAuthorizationCodeServices redisAuthorizationCodeServices = new RedisAuthorizationCodeServices(); | ||
64 | - redisAuthorizationCodeServices.setRedisTemplate(redisTemplate); | ||
65 | - return redisAuthorizationCodeServices; | ||
66 | - } | ||
67 | - | ||
68 | - /** | ||
69 | - * @author owen 624191343@qq.com | ||
70 | - * @version 创建时间:2017年11月12日 上午22:57:51 默认token存储在内存中 | ||
71 | - * DefaultTokenServices默认处理 | ||
72 | - */ | ||
73 | - @Component | ||
74 | - @Configuration | ||
75 | - @EnableAuthorizationServer | ||
76 | - @AutoConfigureAfter(AuthorizationServerEndpointsConfigurer.class) | ||
77 | - public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { | ||
78 | - /** | ||
79 | - * 注入authenticationManager 来支持 password grant type | ||
80 | - */ | ||
81 | - @Autowired | ||
82 | - private AuthenticationManager authenticationManager; | ||
83 | - | ||
84 | - @Autowired | ||
85 | - private UserDetailsService userDetailsService; | ||
86 | - | ||
87 | - @Autowired(required = false) | ||
88 | - private RedisTemplateTokenStore redisTokenStore; | ||
89 | - | ||
90 | - @Autowired(required = false) | ||
91 | - private JwtTokenStore jwtTokenStore; | ||
92 | - @Autowired(required = false) | ||
93 | - private JwtAccessTokenConverter jwtAccessTokenConverter; | ||
94 | - | ||
95 | - @Autowired | ||
96 | - private WebResponseExceptionTranslator webResponseExceptionTranslator; | ||
97 | - | ||
98 | - @Autowired | ||
99 | - private RedisClientDetailsService redisClientDetailsService; | ||
100 | - | ||
101 | - @Autowired(required = false) | ||
102 | - private RandomValueAuthorizationCodeServices authorizationCodeServices; | ||
103 | - | ||
104 | - /** | ||
105 | - * 配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory | ||
106 | - */ | ||
107 | - public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { | ||
108 | - | ||
109 | - if (jwtTokenStore != null) { | ||
110 | - endpoints.tokenStore(jwtTokenStore).authenticationManager(authenticationManager) | ||
111 | - // 支持 | ||
112 | - .userDetailsService(userDetailsService); | ||
113 | - // password | ||
114 | - // grant | ||
115 | - // type; | ||
116 | - } else if (redisTokenStore != null) { | ||
117 | - endpoints.tokenStore(redisTokenStore).authenticationManager(authenticationManager) | ||
118 | - // 支持 | ||
119 | - .userDetailsService(userDetailsService); | ||
120 | - // password | ||
121 | - // grant | ||
122 | - // type; | ||
123 | - } | ||
124 | - | ||
125 | - if (jwtAccessTokenConverter != null) { | ||
126 | - endpoints.accessTokenConverter(jwtAccessTokenConverter); | ||
127 | - } | ||
128 | - | ||
129 | - endpoints.authorizationCodeServices(authorizationCodeServices); | ||
130 | - | ||
131 | - endpoints.exceptionTranslator(webResponseExceptionTranslator); | ||
132 | - | ||
133 | - } | ||
134 | - | ||
135 | - /** | ||
136 | - * 配置应用名称 应用id | ||
137 | - * 配置OAuth2的客户端相关信息 | ||
138 | - */ | ||
139 | - @Override | ||
140 | - public void configure(ClientDetailsServiceConfigurer clients) throws Exception { | ||
141 | - | ||
142 | - // if(clientDetailsService!=null){ | ||
143 | - // clients.withClientDetails(clientDetailsService); | ||
144 | - // }else{ | ||
145 | - // clients.inMemory().withClient("neusoft1").secret("neusoft1") | ||
146 | - // .authorizedGrantTypes("authorization_code", "password", | ||
147 | - // "refresh_token").scopes("all") | ||
148 | - // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200) | ||
149 | - // .refreshTokenValiditySeconds(50000) | ||
150 | - // .and().withClient("neusoft2").secret("neusoft2") | ||
151 | - // .authorizedGrantTypes("authorization_code", "password", | ||
152 | - // "refresh_token").scopes("all") | ||
153 | - // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200) | ||
154 | - // .refreshTokenValiditySeconds(50000) | ||
155 | - // ; | ||
156 | - // } | ||
157 | - clients.withClientDetails(redisClientDetailsService); | ||
158 | - redisClientDetailsService.loadAllClientToCache(); | ||
159 | - } | ||
160 | - | ||
161 | - /** | ||
162 | - * 对应于配置AuthorizationServer安全认证的相关信息,创建ClientCredentialsTokenEndpointFilter核心过滤器 | ||
163 | - */ | ||
164 | - @Override | ||
165 | - public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { | ||
166 | - // url:/oauth/token_key,exposes | ||
167 | - security.tokenKeyAccess("permitAll()") | ||
168 | - /// public key for token | ||
169 | - /// verification if using | ||
170 | - /// JWT tokens | ||
171 | - // url:/oauth/check_token | ||
172 | - .checkTokenAccess("isAuthenticated()") | ||
173 | - // allow check token | ||
174 | - .allowFormAuthenticationForClients(); | ||
175 | - | ||
176 | - // security.allowFormAuthenticationForClients(); | ||
177 | - //// security.tokenKeyAccess("permitAll()"); | ||
178 | - // security.tokenKeyAccess("isAuthenticated()"); | ||
179 | - } | ||
180 | - | ||
181 | - } | ||
182 | - | ||
183 | - /** | ||
184 | - * 资源服务 | ||
185 | - */ | ||
186 | - @Configuration | ||
187 | - @EnableResourceServer | ||
188 | - @EnableConfigurationProperties(PermitUrlProperties.class) | ||
189 | - public class ResourceServerConfig extends ResourceServerConfigurerAdapter { | ||
190 | - | ||
191 | - @Autowired | ||
192 | - private PermitUrlProperties permitUrlProperties; | ||
193 | - | ||
194 | - public void configure(WebSecurity web) throws Exception { | ||
195 | - web.ignoring().antMatchers("/health"); | ||
196 | - web.ignoring().antMatchers("/oauth/user/token"); | ||
197 | - web.ignoring().antMatchers("/oauth/client/token"); | ||
198 | - } | ||
199 | - | ||
200 | - @Override | ||
201 | - public void configure(HttpSecurity http) throws Exception { | ||
202 | - http.requestMatcher( | ||
203 | - /** | ||
204 | - * 判断来源请求是否包含oauth2授权信息 | ||
205 | - */ | ||
206 | - new RequestMatcher() { | ||
207 | - private AntPathMatcher antPathMatcher = new AntPathMatcher(); | ||
208 | - | ||
209 | - @Override | ||
210 | - public boolean matches(HttpServletRequest request) { | ||
211 | - // 请求参数中包含access_token参数 | ||
212 | - if (request.getParameter(OAuth2AccessToken.ACCESS_TOKEN) != null) { | ||
213 | - return true; | ||
214 | - } | ||
215 | - | ||
216 | - // 头部的Authorization值以Bearer开头 | ||
217 | - String auth = request.getHeader("Authorization"); | ||
218 | - if (auth != null) { | ||
219 | - if (auth.startsWith(OAuth2AccessToken.BEARER_TYPE)) { | ||
220 | - return true; | ||
221 | - } | ||
222 | - } | ||
223 | - if (antPathMatcher.match(request.getRequestURI(), "/oauth/userinfo")) { | ||
224 | - return true; | ||
225 | - } | ||
226 | - if (antPathMatcher.match(request.getRequestURI(), "/oauth/remove/token")) { | ||
227 | - return true; | ||
228 | - } | ||
229 | - if (antPathMatcher.match(request.getRequestURI(), "/oauth/get/token")) { | ||
230 | - return true; | ||
231 | - } | ||
232 | - if (antPathMatcher.match(request.getRequestURI(), "/oauth/refresh/token")) { | ||
233 | - return true; | ||
234 | - } | ||
235 | - | ||
236 | - if (antPathMatcher.match(request.getRequestURI(), "/oauth/token/list")) { | ||
237 | - return true; | ||
238 | - } | ||
239 | - | ||
240 | - if (antPathMatcher.match("/clients/**", request.getRequestURI())) { | ||
241 | - return true; | ||
242 | - } | ||
243 | - | ||
244 | - if (antPathMatcher.match("/services/**", request.getRequestURI())) { | ||
245 | - return true; | ||
246 | - } | ||
247 | - if (antPathMatcher.match("/redis/**", request.getRequestURI())) { | ||
248 | - return true; | ||
249 | - } | ||
250 | - return false; | ||
251 | - } | ||
252 | - } | ||
253 | - | ||
254 | - ).authorizeRequests().antMatchers(permitUrlProperties.getIgnored()).permitAll().anyRequest() | ||
255 | - .authenticated(); | ||
256 | - } | ||
257 | - | ||
258 | - } | ||
259 | - | ||
260 | -} |
cloud/autho/src/main/java/com/sincere/autho/config/SecurityConfig.java
@@ -1,129 +0,0 @@ | @@ -1,129 +0,0 @@ | ||
1 | -package com.sincere.autho.config; | ||
2 | - | ||
3 | -import com.sincere.autho.handler.OauthLogoutHandler; | ||
4 | -import com.sincere.common.props.PermitUrlProperties; | ||
5 | -import org.springframework.beans.factory.annotation.Autowired; | ||
6 | -import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
7 | -import org.springframework.context.annotation.Bean; | ||
8 | -import org.springframework.context.annotation.Configuration; | ||
9 | -import org.springframework.security.authentication.AuthenticationManager; | ||
10 | -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; | ||
11 | -import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||
12 | -import org.springframework.security.config.annotation.web.builders.WebSecurity; | ||
13 | -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; | ||
14 | -import org.springframework.security.config.http.SessionCreationPolicy; | ||
15 | -import org.springframework.security.core.userdetails.UserDetailsService; | ||
16 | -import org.springframework.security.crypto.password.PasswordEncoder; | ||
17 | -import org.springframework.security.web.AuthenticationEntryPoint; | ||
18 | -import org.springframework.security.web.authentication.AuthenticationFailureHandler; | ||
19 | -import org.springframework.security.web.authentication.AuthenticationSuccessHandler; | ||
20 | -import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler; | ||
21 | - | ||
22 | -/** | ||
23 | - * spring security配置 | ||
24 | - * 在WebSecurityConfigurerAdapter不拦截oauth要开放的资源 | ||
25 | - */ | ||
26 | -@Configuration | ||
27 | -//@EnableWebSecurity | ||
28 | -//@EnableGlobalMethodSecurity(prePostEnabled = true) | ||
29 | -@EnableConfigurationProperties(PermitUrlProperties.class) | ||
30 | -public class SecurityConfig extends WebSecurityConfigurerAdapter { | ||
31 | - | ||
32 | - @Autowired | ||
33 | - private AuthenticationSuccessHandler authenticationSuccessHandler; | ||
34 | - @Autowired | ||
35 | - private AuthenticationFailureHandler authenticationFailureHandler; | ||
36 | - // @Autowired | ||
37 | - // private LogoutSuccessHandler logoutSuccessHandler; | ||
38 | - @Autowired(required = false) | ||
39 | - private AuthenticationEntryPoint authenticationEntryPoint; | ||
40 | - @Autowired | ||
41 | - private UserDetailsService userDetailsService; | ||
42 | - | ||
43 | - @Autowired | ||
44 | - private PasswordEncoder passwordEncoder; | ||
45 | - | ||
46 | - @Autowired | ||
47 | - private OauthLogoutHandler oauthLogoutHandler; | ||
48 | - @Autowired | ||
49 | - private PermitUrlProperties permitUrlProperties ; | ||
50 | - | ||
51 | - @Autowired | ||
52 | - private ValidateCodeSecurityConfig validateCodeSecurityConfig ; | ||
53 | - | ||
54 | - @Override | ||
55 | - public void configure(WebSecurity web) throws Exception { | ||
56 | - web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", | ||
57 | - "/swagger-ui.html", "/webjars/**", "/doc.html", "/login.html"); | ||
58 | - web.ignoring().antMatchers("/js/**"); | ||
59 | - web.ignoring().antMatchers("/css/**"); | ||
60 | - web.ignoring().antMatchers("/health"); | ||
61 | - // 忽略登录界面 | ||
62 | - web.ignoring().antMatchers("/login.html"); | ||
63 | - web.ignoring().antMatchers("/index.html"); | ||
64 | - web.ignoring().antMatchers("/oauth/user/token"); | ||
65 | - web.ignoring().antMatchers("/oauth/client/token"); | ||
66 | - web.ignoring().antMatchers("/validata/code/**"); | ||
67 | - web.ignoring().antMatchers(permitUrlProperties.getIgnored()); | ||
68 | - | ||
69 | - } | ||
70 | - /** | ||
71 | - * 认证管理 | ||
72 | - * | ||
73 | - * @return 认证管理对象 | ||
74 | - * @throws Exception | ||
75 | - * 认证异常信息 | ||
76 | - */ | ||
77 | - @Override | ||
78 | - @Bean | ||
79 | - public AuthenticationManager authenticationManagerBean() throws Exception { | ||
80 | - return super.authenticationManagerBean(); | ||
81 | - } | ||
82 | - | ||
83 | - @Override | ||
84 | - protected void configure(HttpSecurity http) throws Exception { | ||
85 | - http.csrf().disable(); | ||
86 | - | ||
87 | - http.authorizeRequests() | ||
88 | - .anyRequest().authenticated(); | ||
89 | - http.formLogin().loginPage("/login.html").loginProcessingUrl("/user/login") | ||
90 | - .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler); | ||
91 | - | ||
92 | - // 基于密码 等模式可以无session,不支持授权码模式 | ||
93 | - if (authenticationEntryPoint != null) { | ||
94 | - http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint); | ||
95 | - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); | ||
96 | - | ||
97 | - } else { | ||
98 | - // 授权码模式单独处理,需要session的支持,此模式可以支持所有oauth2的认证 | ||
99 | - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); | ||
100 | - } | ||
101 | - | ||
102 | - http.logout().logoutSuccessUrl("/login.html") | ||
103 | - .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()) | ||
104 | - .addLogoutHandler(oauthLogoutHandler).clearAuthentication(true); | ||
105 | - | ||
106 | - //增加验证码处理 | ||
107 | - http.apply(validateCodeSecurityConfig) ; | ||
108 | - // http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); | ||
109 | - // 解决不允许显示在iframe的问题 | ||
110 | - http.headers().frameOptions().disable(); | ||
111 | - http.headers().cacheControl(); | ||
112 | - | ||
113 | - } | ||
114 | - | ||
115 | - /** | ||
116 | - * 全局用户信息 | ||
117 | - * | ||
118 | - * @param auth | ||
119 | - * 认证管理 | ||
120 | - * @throws Exception | ||
121 | - * 用户认证异常信息 | ||
122 | - */ | ||
123 | - @Autowired | ||
124 | - public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception { | ||
125 | - auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); | ||
126 | - } | ||
127 | - | ||
128 | - | ||
129 | -} |
cloud/autho/src/main/java/com/sincere/autho/config/ValidateCodeSecurityConfig.java
@@ -1,29 +0,0 @@ | @@ -1,29 +0,0 @@ | ||
1 | -/** | ||
2 | - * | ||
3 | - */ | ||
4 | -package com.sincere.autho.config; | ||
5 | - | ||
6 | -import org.springframework.security.config.annotation.SecurityConfigurerAdapter; | ||
7 | -import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||
8 | -import org.springframework.security.web.DefaultSecurityFilterChain; | ||
9 | -import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; | ||
10 | -import org.springframework.stereotype.Component; | ||
11 | - | ||
12 | -import javax.annotation.Resource; | ||
13 | -import javax.servlet.Filter; | ||
14 | - | ||
15 | -/** | ||
16 | - * 校验码相关安全配置 | ||
17 | - * | ||
18 | - * @author zlt | ||
19 | - */ | ||
20 | -@Component("validateCodeSecurityConfig") | ||
21 | -public class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { | ||
22 | - @Resource | ||
23 | - private Filter validateCodeFilter; | ||
24 | - | ||
25 | - @Override | ||
26 | - public void configure(HttpSecurity http) { | ||
27 | - http.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class); | ||
28 | - } | ||
29 | -} |
cloud/autho/src/main/java/com/sincere/autho/control/LoginController.java
0 → 100644
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +package com.sincere.autho.control; | ||
2 | + | ||
3 | +import com.sincere.autho.dto.BaseDto; | ||
4 | +import com.sincere.autho.dto.req.LoginReqDto; | ||
5 | +import com.sincere.autho.service.LoginService; | ||
6 | +import com.sincere.common.util.TokenUtils; | ||
7 | +import io.swagger.annotations.Api; | ||
8 | +import org.apache.commons.lang3.StringUtils; | ||
9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
10 | +import org.springframework.web.bind.annotation.RequestBody; | ||
11 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
12 | +import org.springframework.web.bind.annotation.RequestMethod; | ||
13 | +import org.springframework.web.bind.annotation.RestController; | ||
14 | + | ||
15 | +@RestController | ||
16 | +public class LoginController { | ||
17 | + | ||
18 | + @Autowired | ||
19 | + LoginService loginService ; | ||
20 | + | ||
21 | + | ||
22 | + @RequestMapping(value = "/login" , method = RequestMethod.POST) | ||
23 | + public BaseDto<String> login(@RequestBody LoginReqDto loginReqDto){ | ||
24 | + BaseDto<String> result = new BaseDto<>() ; | ||
25 | + String userId = loginService.login(loginReqDto); | ||
26 | + if(StringUtils.isNotBlank(userId)){ | ||
27 | + result.setMessage("登录成功"); | ||
28 | + result.setData(TokenUtils.buildToken(userId)); | ||
29 | + }else { | ||
30 | + result.setStatus(false); | ||
31 | + result.setMessage("账号密码错误"); | ||
32 | + } | ||
33 | + return result ; | ||
34 | + } | ||
35 | +} |
cloud/autho/src/main/java/com/sincere/autho/control/OAuth2Controller.java
@@ -1,482 +0,0 @@ | @@ -1,482 +0,0 @@ | ||
1 | -package com.sincere.autho.control; | ||
2 | - | ||
3 | -import com.fasterxml.jackson.core.JsonProcessingException; | ||
4 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
5 | -import com.sincere.autho.annotation.log.LogAnnotation; | ||
6 | -import com.sincere.autho.service.RedisClientDetailsService; | ||
7 | -import com.sincere.autho.utils.SpringUtil; | ||
8 | -import com.sincere.common.commons.PageResult; | ||
9 | -import com.sincere.common.model.system.LoginAppUser; | ||
10 | -import com.sincere.common.model.system.SysPermission; | ||
11 | -import io.swagger.annotations.Api; | ||
12 | -import io.swagger.annotations.ApiOperation; | ||
13 | -import io.swagger.annotations.ApiParam; | ||
14 | -import org.apache.commons.collections.MapUtils; | ||
15 | -import org.slf4j.Logger; | ||
16 | -import org.slf4j.LoggerFactory; | ||
17 | -import org.springframework.beans.factory.annotation.Autowired; | ||
18 | -import org.springframework.dao.DataAccessException; | ||
19 | -import org.springframework.data.redis.connection.RedisConnection; | ||
20 | -import org.springframework.data.redis.core.Cursor; | ||
21 | -import org.springframework.data.redis.core.RedisCallback; | ||
22 | -import org.springframework.data.redis.core.RedisTemplate; | ||
23 | -import org.springframework.data.redis.core.ScanOptions; | ||
24 | -import org.springframework.http.HttpStatus; | ||
25 | -import org.springframework.security.authentication.AuthenticationManager; | ||
26 | -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | ||
27 | -import org.springframework.security.core.Authentication; | ||
28 | -import org.springframework.security.core.context.SecurityContextHolder; | ||
29 | -import org.springframework.security.crypto.password.PasswordEncoder; | ||
30 | -import org.springframework.security.oauth2.common.OAuth2AccessToken; | ||
31 | -import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException; | ||
32 | -import org.springframework.security.oauth2.provider.*; | ||
33 | -import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; | ||
34 | -import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenGranter; | ||
35 | -import org.springframework.security.oauth2.provider.refresh.RefreshTokenGranter; | ||
36 | -import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory; | ||
37 | -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; | ||
38 | -import org.springframework.security.oauth2.provider.token.TokenStore; | ||
39 | -import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; | ||
40 | -import org.springframework.web.bind.annotation.PostMapping; | ||
41 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
42 | -import org.springframework.web.bind.annotation.RequestParam; | ||
43 | -import org.springframework.web.bind.annotation.RestController; | ||
44 | - | ||
45 | -import javax.annotation.Resource; | ||
46 | -import javax.servlet.http.HttpServletRequest; | ||
47 | -import javax.servlet.http.HttpServletResponse; | ||
48 | -import java.io.IOException; | ||
49 | -import java.util.*; | ||
50 | - | ||
51 | -/** | ||
52 | - * @author 作者 owen E-mail: 624191343@qq.com | ||
53 | - * @version 创建时间:2018年4月28日 下午2:18:54 类说明 | ||
54 | - */ | ||
55 | - | ||
56 | -@Api(tags = "OAuth2相关操作") | ||
57 | -@RestController | ||
58 | -public class OAuth2Controller { | ||
59 | - | ||
60 | - private static final Logger logger = LoggerFactory.getLogger(OAuth2Controller.class); | ||
61 | - @Resource | ||
62 | - private ObjectMapper objectMapper; // springmvc启动时自动装配json处理类 | ||
63 | - @Autowired | ||
64 | - private PasswordEncoder passwordEncoder; | ||
65 | - | ||
66 | - @Autowired | ||
67 | - private TokenStore tokenStore; | ||
68 | - | ||
69 | - @Autowired | ||
70 | - private RedisTemplate<String, Object> redisTemplate; | ||
71 | - | ||
72 | - @ApiOperation(value = "用户名密码获取token") | ||
73 | - @PostMapping("/oauth/user/token") | ||
74 | - public void getUserTokenInfo( | ||
75 | - @ApiParam(required = true, name = "username", value = "账号") @RequestParam(value = "username") String username, | ||
76 | - @ApiParam(required = true, name = "password", value = "密码") @RequestParam(value = "password") String password, | ||
77 | - HttpServletRequest request, HttpServletResponse response) { | ||
78 | - String clientId = request.getHeader("client_id"); | ||
79 | - String clientSecret = request.getHeader("client_secret"); | ||
80 | - | ||
81 | - try { | ||
82 | - | ||
83 | - if (clientId == null || "".equals(clientId)) { | ||
84 | - throw new UnapprovedClientAuthenticationException("请求头中无client_id信息"); | ||
85 | - } | ||
86 | - | ||
87 | - if (clientSecret == null || "".equals(clientSecret)) { | ||
88 | - throw new UnapprovedClientAuthenticationException("请求头中无client_secret信息"); | ||
89 | - } | ||
90 | - | ||
91 | - RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class); | ||
92 | - | ||
93 | - ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); | ||
94 | - | ||
95 | - if (clientDetails == null) { | ||
96 | - throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在"); | ||
97 | - } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) { | ||
98 | - throw new UnapprovedClientAuthenticationException("clientSecret不匹配"); | ||
99 | - } | ||
100 | - | ||
101 | - TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(), | ||
102 | - "customer"); | ||
103 | - | ||
104 | - OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); | ||
105 | - | ||
106 | - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); | ||
107 | - | ||
108 | - AuthenticationManager authenticationManager = SpringUtil.getBean(AuthenticationManager.class); | ||
109 | - | ||
110 | - Authentication authentication = authenticationManager.authenticate(token); | ||
111 | - SecurityContextHolder.getContext().setAuthentication(authentication); | ||
112 | - | ||
113 | - OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); | ||
114 | - | ||
115 | - AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil | ||
116 | - .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class); | ||
117 | - | ||
118 | - OAuth2AccessToken oAuth2AccessToken = authorizationServerTokenServices | ||
119 | - .createAccessToken(oAuth2Authentication); | ||
120 | - | ||
121 | - oAuth2Authentication.setAuthenticated(true); | ||
122 | - | ||
123 | - response.setContentType("application/json;charset=UTF-8"); | ||
124 | - response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken)); | ||
125 | - response.getWriter().flush(); | ||
126 | - response.getWriter().close(); | ||
127 | - | ||
128 | - } catch (Exception e) { | ||
129 | - | ||
130 | - response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||
131 | - | ||
132 | - response.setContentType("application/json;charset=UTF-8"); | ||
133 | - | ||
134 | - Map<String, String> rsp = new HashMap<>(); | ||
135 | - rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + ""); | ||
136 | - rsp.put("rsp_msg", e.getMessage()); | ||
137 | - | ||
138 | - try { | ||
139 | - response.getWriter().write(objectMapper.writeValueAsString(rsp)); | ||
140 | - response.getWriter().flush(); | ||
141 | - response.getWriter().close(); | ||
142 | - } catch (JsonProcessingException e1) { | ||
143 | - // TODO Auto-generated catch block | ||
144 | - e1.printStackTrace(); | ||
145 | - } catch (IOException e1) { | ||
146 | - // TODO Auto-generated catch block | ||
147 | - e1.printStackTrace(); | ||
148 | - } | ||
149 | - | ||
150 | - } | ||
151 | - } | ||
152 | - | ||
153 | - | ||
154 | - @ApiOperation(value = "clientId获取token") | ||
155 | - @PostMapping("/oauth/client/token") | ||
156 | - @LogAnnotation(module = "autho", recordRequestParam = false) | ||
157 | - public void getClientTokenInfo(HttpServletRequest request, HttpServletResponse response) { | ||
158 | - | ||
159 | - String clientId = request.getHeader("client_id"); | ||
160 | - String clientSecret = request.getHeader("client_secret"); | ||
161 | - try { | ||
162 | - | ||
163 | - if (clientId == null || "".equals(clientId)) { | ||
164 | - throw new UnapprovedClientAuthenticationException("请求参数中无clientId信息"); | ||
165 | - } | ||
166 | - | ||
167 | - if (clientSecret == null || "".equals(clientSecret)) { | ||
168 | - throw new UnapprovedClientAuthenticationException("请求参数中无clientSecret信息"); | ||
169 | - } | ||
170 | - | ||
171 | - RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class); | ||
172 | - | ||
173 | - ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); | ||
174 | - | ||
175 | - if (clientDetails == null) { | ||
176 | - throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在"); | ||
177 | - } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) { | ||
178 | - throw new UnapprovedClientAuthenticationException("clientSecret不匹配"); | ||
179 | - } | ||
180 | - | ||
181 | - Map<String, String> map = new HashMap<>(); | ||
182 | - map.put("client_secret", clientSecret); | ||
183 | - map.put("client_id", clientId); | ||
184 | - map.put("grant_type", "client_credentials"); | ||
185 | - TokenRequest tokenRequest = new TokenRequest(map, clientId, clientDetails.getScope(), "client_credentials"); | ||
186 | - | ||
187 | - OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); | ||
188 | - | ||
189 | - AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil | ||
190 | - .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class); | ||
191 | - OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService); | ||
192 | - ClientCredentialsTokenGranter clientCredentialsTokenGranter = new ClientCredentialsTokenGranter( | ||
193 | - authorizationServerTokenServices, clientDetailsService, requestFactory); | ||
194 | - | ||
195 | - clientCredentialsTokenGranter.setAllowRefresh(true); | ||
196 | - OAuth2AccessToken oAuth2AccessToken = clientCredentialsTokenGranter.grant("client_credentials", | ||
197 | - tokenRequest); | ||
198 | - | ||
199 | - response.setContentType("application/json;charset=UTF-8"); | ||
200 | - response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken)); | ||
201 | - response.getWriter().flush(); | ||
202 | - response.getWriter().close(); | ||
203 | - | ||
204 | - } catch (Exception e) { | ||
205 | - | ||
206 | - response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||
207 | - response.setContentType("application/json;charset=UTF-8"); | ||
208 | - Map<String, String> rsp = new HashMap<>(); | ||
209 | - rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + ""); | ||
210 | - rsp.put("rsp_msg", e.getMessage()); | ||
211 | - | ||
212 | - try { | ||
213 | - response.getWriter().write(objectMapper.writeValueAsString(rsp)); | ||
214 | - response.getWriter().flush(); | ||
215 | - response.getWriter().close(); | ||
216 | - } catch (JsonProcessingException e1) { | ||
217 | - // TODO Auto-generated catch block | ||
218 | - e1.printStackTrace(); | ||
219 | - } catch (IOException e1) { | ||
220 | - // TODO Auto-generated catch block | ||
221 | - e1.printStackTrace(); | ||
222 | - } | ||
223 | - | ||
224 | - } | ||
225 | - } | ||
226 | - | ||
227 | - @ApiOperation(value = "access_token刷新token") | ||
228 | - @PostMapping(value = "/oauth/refresh/token", params = "access_token") | ||
229 | - public void refreshTokenInfo(String access_token, HttpServletRequest request, HttpServletResponse response) { | ||
230 | - | ||
231 | - // 拿到当前用户信息 | ||
232 | - try { | ||
233 | - Authentication user = SecurityContextHolder.getContext().getAuthentication(); | ||
234 | - | ||
235 | - if (user != null) { | ||
236 | - if (user instanceof OAuth2Authentication) { | ||
237 | - Authentication athentication = (Authentication) user; | ||
238 | - OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails(); | ||
239 | - } | ||
240 | - | ||
241 | - } | ||
242 | - OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token); | ||
243 | - OAuth2Authentication auth = (OAuth2Authentication) user; | ||
244 | - RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class); | ||
245 | - | ||
246 | - ClientDetails clientDetails = clientDetailsService | ||
247 | - .loadClientByClientId(auth.getOAuth2Request().getClientId()); | ||
248 | - | ||
249 | - AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil | ||
250 | - .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class); | ||
251 | - OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService); | ||
252 | - | ||
253 | - RefreshTokenGranter refreshTokenGranter = new RefreshTokenGranter(authorizationServerTokenServices, | ||
254 | - clientDetailsService, requestFactory); | ||
255 | - | ||
256 | - Map<String, String> map = new HashMap<>(); | ||
257 | - map.put("grant_type", "refresh_token"); | ||
258 | - map.put("refresh_token", accessToken.getRefreshToken().getValue()); | ||
259 | - TokenRequest tokenRequest = new TokenRequest(map, auth.getOAuth2Request().getClientId(), | ||
260 | - auth.getOAuth2Request().getScope(), "refresh_token"); | ||
261 | - | ||
262 | - OAuth2AccessToken oAuth2AccessToken = refreshTokenGranter.grant("refresh_token", tokenRequest); | ||
263 | - | ||
264 | - tokenStore.removeAccessToken(accessToken); | ||
265 | - | ||
266 | - response.setContentType("application/json;charset=UTF-8"); | ||
267 | - response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken)); | ||
268 | - response.getWriter().flush(); | ||
269 | - response.getWriter().close(); | ||
270 | - } catch (Exception e) { | ||
271 | - response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||
272 | - response.setContentType("application/json;charset=UTF-8"); | ||
273 | - Map<String, String> rsp = new HashMap<>(); | ||
274 | - rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + ""); | ||
275 | - rsp.put("rsp_msg", e.getMessage()); | ||
276 | - | ||
277 | - try { | ||
278 | - response.getWriter().write(objectMapper.writeValueAsString(rsp)); | ||
279 | - response.getWriter().flush(); | ||
280 | - response.getWriter().close(); | ||
281 | - } catch (JsonProcessingException e1) { | ||
282 | - // TODO Auto-generated catch block | ||
283 | - e1.printStackTrace(); | ||
284 | - } catch (IOException e1) { | ||
285 | - // TODO Auto-generated catch block | ||
286 | - e1.printStackTrace(); | ||
287 | - } | ||
288 | - } | ||
289 | - | ||
290 | - } | ||
291 | - | ||
292 | - /** | ||
293 | - * 移除access_token和refresh_token | ||
294 | - * | ||
295 | - * @param access_token | ||
296 | - */ | ||
297 | - @ApiOperation(value = "移除token") | ||
298 | - @PostMapping(value = "/oauth/remove/token", params = "access_token") | ||
299 | - public void removeToken(String access_token) { | ||
300 | - | ||
301 | - // 拿到当前用户信息 | ||
302 | - Authentication user = SecurityContextHolder.getContext().getAuthentication(); | ||
303 | - | ||
304 | - if (user != null) { | ||
305 | - if (user instanceof OAuth2Authentication) { | ||
306 | - Authentication athentication = (Authentication) user; | ||
307 | - OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails(); | ||
308 | - } | ||
309 | - | ||
310 | - } | ||
311 | - OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token); | ||
312 | - if (accessToken != null) { | ||
313 | - // 移除access_token | ||
314 | - tokenStore.removeAccessToken(accessToken); | ||
315 | - | ||
316 | - // 移除refresh_token | ||
317 | - if (accessToken.getRefreshToken() != null) { | ||
318 | - tokenStore.removeRefreshToken(accessToken.getRefreshToken()); | ||
319 | - } | ||
320 | - | ||
321 | - } | ||
322 | - } | ||
323 | - | ||
324 | - @ApiOperation(value = "获取token信息") | ||
325 | - @PostMapping(value = "/oauth/get/token", params = "access_token") | ||
326 | - public OAuth2AccessToken getTokenInfo(String access_token) { | ||
327 | - | ||
328 | - // 拿到当前用户信息 | ||
329 | - Authentication user = SecurityContextHolder.getContext().getAuthentication(); | ||
330 | - | ||
331 | - if (user != null) { | ||
332 | - if (user instanceof OAuth2Authentication) { | ||
333 | - Authentication athentication = (Authentication) user; | ||
334 | - OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails(); | ||
335 | - } | ||
336 | - | ||
337 | - } | ||
338 | - OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token); | ||
339 | - | ||
340 | - return accessToken; | ||
341 | - | ||
342 | - } | ||
343 | - | ||
344 | - /** | ||
345 | - * 当前登陆用户信息 | ||
346 | - * security获取当前登录用户的方法是SecurityContextHolder.getContext().getAuthentication() | ||
347 | - * 这里的实现类是org.springframework.security.oauth2.provider.OAuth2Authentication | ||
348 | - * | ||
349 | - * @return | ||
350 | - */ | ||
351 | - @ApiOperation(value = "当前登陆用户信息") | ||
352 | - @RequestMapping(value = { "/oauth/userinfo" }, produces = "application/json") // 获取用户信息。/auth/user | ||
353 | - public Map<String, Object> getCurrentUserDetail() { | ||
354 | - Map<String, Object> userInfo = new HashMap<>(); | ||
355 | - userInfo.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal()); | ||
356 | - logger.debug("认证详细信息:" + SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString()); | ||
357 | - | ||
358 | - List<SysPermission> permissions = new ArrayList<>(); | ||
359 | - | ||
360 | - new ArrayList(SecurityContextHolder.getContext().getAuthentication().getAuthorities()).forEach(o -> { | ||
361 | - SysPermission sysPermission = new SysPermission(); | ||
362 | - sysPermission.setPermission(o.toString()); | ||
363 | - permissions.add(sysPermission); | ||
364 | - }); | ||
365 | - // userInfo.put("authorities", | ||
366 | - // AuthorityUtils.authorityListToSet(SecurityContextHolder.getContext().getAuthentication().getAuthorities()) | ||
367 | - // ); | ||
368 | - userInfo.put("permissions", permissions); | ||
369 | - | ||
370 | - userInfo.put("resp_code", "200"); | ||
371 | - | ||
372 | - logger.info("返回信息:{}", userInfo); | ||
373 | - | ||
374 | - return userInfo; | ||
375 | - } | ||
376 | - | ||
377 | - @ApiOperation(value = "token列表") | ||
378 | - @PostMapping("/oauth/token/list") | ||
379 | - public PageResult<HashMap<String, String>> getUserTokenInfo(@RequestParam Map<String, Object> params) | ||
380 | - throws Exception { | ||
381 | - List<HashMap<String, String>> list = new ArrayList<>(); | ||
382 | - | ||
383 | - Set<String> keys = redisTemplate.keys("access:" + "*") ; | ||
384 | -// Object key1 = keys.toArray()[0]; | ||
385 | -// Object token1 = redisTemplate.opsForValue().get(key1); | ||
386 | - //根据分页参数获取对应数据 | ||
387 | - // List<String> pages = findKeysForPage("access:" + "*", MapUtils.getInteger(params, "page"),MapUtils.getInteger(params, "limit")); | ||
388 | - | ||
389 | - for (Object key: keys.toArray()) { | ||
390 | -// String key = page; | ||
391 | -// String accessToken = StringUtils.substringAfter(key, "access:"); | ||
392 | -// OAuth2AccessToken token = tokenStore.readAccessToken(accessToken); | ||
393 | - OAuth2AccessToken token = (OAuth2AccessToken)redisTemplate.opsForValue().get(key); | ||
394 | - HashMap<String, String> map = new HashMap<String, String>(); | ||
395 | - | ||
396 | - try { | ||
397 | - map.put("token_type", token.getTokenType()); | ||
398 | - map.put("token_value", token.getValue()); | ||
399 | - map.put("expires_in", token.getExpiresIn()+""); | ||
400 | - } catch (Exception e) { | ||
401 | - | ||
402 | - } | ||
403 | - | ||
404 | - | ||
405 | - OAuth2Authentication oAuth2Auth = tokenStore.readAuthentication(token); | ||
406 | - Authentication authentication = oAuth2Auth.getUserAuthentication(); | ||
407 | - | ||
408 | - map.put("client_id", oAuth2Auth.getOAuth2Request().getClientId()); | ||
409 | - map.put("grant_type", oAuth2Auth.getOAuth2Request().getGrantType()); | ||
410 | - | ||
411 | - if (authentication instanceof UsernamePasswordAuthenticationToken) { | ||
412 | - UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication; | ||
413 | - | ||
414 | - if(authenticationToken.getPrincipal() instanceof LoginAppUser ){ | ||
415 | - LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal(); | ||
416 | - map.put("user_id", user.getId()+""); | ||
417 | - map.put("user_name", user.getUsername()+""); | ||
418 | - map.put("user_head_imgurl", user.getHeadImgUrl()+""); | ||
419 | - } | ||
420 | - | ||
421 | - | ||
422 | - }else if (authentication instanceof PreAuthenticatedAuthenticationToken){ | ||
423 | - //刷新token方式 | ||
424 | - PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication; | ||
425 | - if(authenticationToken.getPrincipal() instanceof LoginAppUser ){ | ||
426 | - LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal(); | ||
427 | - map.put("user_id", user.getId()+""); | ||
428 | - map.put("user_name", user.getUsername()+""); | ||
429 | - map.put("user_head_imgurl", user.getHeadImgUrl()+""); | ||
430 | - } | ||
431 | - | ||
432 | - } | ||
433 | - list.add(map); | ||
434 | - | ||
435 | - } | ||
436 | - | ||
437 | - | ||
438 | - | ||
439 | - return PageResult.<HashMap<String, String>>builder().data(list).code(0).count((long) keys.size()).build(); | ||
440 | - | ||
441 | - } | ||
442 | - | ||
443 | - public List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) { | ||
444 | - | ||
445 | - Set<String> execute = redisTemplate.execute(new RedisCallback<Set<String>>() { | ||
446 | - | ||
447 | - @Override | ||
448 | - public Set<String> doInRedis(RedisConnection connection) throws DataAccessException { | ||
449 | - | ||
450 | - Set<String> binaryKeys = new HashSet<>(); | ||
451 | - | ||
452 | - Cursor<byte[]> cursor = connection | ||
453 | - .scan(new ScanOptions.ScanOptionsBuilder().match(patternKey).count(1000).build()); | ||
454 | - int tmpIndex = 0; | ||
455 | - int startIndex = (pageNum - 1) * pageSize; | ||
456 | - int end = pageNum * pageSize; | ||
457 | - while (cursor.hasNext()) { | ||
458 | - if (tmpIndex >= startIndex && tmpIndex < end) { | ||
459 | - binaryKeys.add(new String(cursor.next())); | ||
460 | - tmpIndex++; | ||
461 | - continue; | ||
462 | - } | ||
463 | - | ||
464 | - // 获取到满足条件的数据后,就可以退出了 | ||
465 | - if (tmpIndex >= end) { | ||
466 | - break; | ||
467 | - } | ||
468 | - | ||
469 | - tmpIndex++; | ||
470 | - cursor.next(); | ||
471 | - } | ||
472 | - connection.close(); | ||
473 | - return binaryKeys; | ||
474 | - } | ||
475 | - }); | ||
476 | - | ||
477 | - List<String> result = new ArrayList<String>(pageSize); | ||
478 | - result.addAll(execute); | ||
479 | - return result; | ||
480 | - } | ||
481 | - | ||
482 | -} |
cloud/autho/src/main/java/com/sincere/autho/control/UserController.java
@@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
1 | -package com.sincere.autho.control; | ||
2 | - | ||
3 | -import org.springframework.web.bind.annotation.GetMapping; | ||
4 | -import org.springframework.web.bind.annotation.RestController; | ||
5 | - | ||
6 | -import java.security.Principal; | ||
7 | - | ||
8 | -@RestController | ||
9 | -public class UserController { | ||
10 | - | ||
11 | - @GetMapping("/user") | ||
12 | - public Principal user(Principal user){ | ||
13 | - return user; | ||
14 | - } | ||
15 | - | ||
16 | -} |
cloud/autho/src/main/java/com/sincere/autho/dto/BaseDto.java
0 → 100644
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +package com.sincere.autho.dto; | ||
2 | + | ||
3 | +public class BaseDto<T> { | ||
4 | + | ||
5 | + private String message ; | ||
6 | + private boolean status ; | ||
7 | + private T data ; | ||
8 | + | ||
9 | + public String getMessage() { | ||
10 | + return message; | ||
11 | + } | ||
12 | + | ||
13 | + public void setMessage(String message) { | ||
14 | + this.message = message; | ||
15 | + } | ||
16 | + | ||
17 | + public boolean isStatus() { | ||
18 | + return status; | ||
19 | + } | ||
20 | + | ||
21 | + public void setStatus(boolean status) { | ||
22 | + this.status = status; | ||
23 | + } | ||
24 | + | ||
25 | + public T getData() { | ||
26 | + return data; | ||
27 | + } | ||
28 | + | ||
29 | + public void setData(T data) { | ||
30 | + this.data = data; | ||
31 | + } | ||
32 | + | ||
33 | + public BaseDto() { | ||
34 | + this.status = true ; | ||
35 | + } | ||
36 | +} |
cloud/autho/src/main/java/com/sincere/autho/dto/req/LoginReqDto.java
0 → 100644
@@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
1 | +package com.sincere.autho.dto.req; | ||
2 | + | ||
3 | +public class LoginReqDto { | ||
4 | + | ||
5 | + private String account ; | ||
6 | + private String password ; | ||
7 | + private int userType ; // 2:学生;3:家长;其他都是老师 | ||
8 | + | ||
9 | + public String getAccount() { | ||
10 | + return account; | ||
11 | + } | ||
12 | + | ||
13 | + public void setAccount(String account) { | ||
14 | + this.account = account; | ||
15 | + } | ||
16 | + | ||
17 | + public String getPassword() { | ||
18 | + return password; | ||
19 | + } | ||
20 | + | ||
21 | + public void setPassword(String password) { | ||
22 | + this.password = password; | ||
23 | + } | ||
24 | + | ||
25 | + public int getUserType() { | ||
26 | + return userType; | ||
27 | + } | ||
28 | + | ||
29 | + public void setUserType(int userType) { | ||
30 | + this.userType = userType; | ||
31 | + } | ||
32 | +} |
cloud/autho/src/main/java/com/sincere/autho/handler/ExceptionHandlerAdvice.java
@@ -1,63 +0,0 @@ | @@ -1,63 +0,0 @@ | ||
1 | -package com.sincere.autho.handler; | ||
2 | - | ||
3 | -import io.grpc.StatusRuntimeException; | ||
4 | -import org.springframework.http.HttpStatus; | ||
5 | -import org.springframework.security.access.AccessDeniedException; | ||
6 | -import org.springframework.web.bind.annotation.ExceptionHandler; | ||
7 | -import org.springframework.web.bind.annotation.ResponseStatus; | ||
8 | -import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
9 | - | ||
10 | -import java.util.HashMap; | ||
11 | -import java.util.Map; | ||
12 | - | ||
13 | - | ||
14 | -/** | ||
15 | - * @author 作者 owen E-mail: 624191343@qq.com | ||
16 | - * @version 创建时间:2017年11月12日 上午22:57:51 | ||
17 | - * 异常通用处理 | ||
18 | -*/ | ||
19 | -@RestControllerAdvice | ||
20 | -public class ExceptionHandlerAdvice { | ||
21 | - | ||
22 | - /** | ||
23 | - * IllegalArgumentException异常处理返回json | ||
24 | - * 状态码:400 | ||
25 | - * @param exception | ||
26 | - * @return | ||
27 | - */ | ||
28 | - @ExceptionHandler({ IllegalArgumentException.class }) | ||
29 | - @ResponseStatus(HttpStatus.BAD_REQUEST) | ||
30 | - public Map<String, Object> badRequestException(IllegalArgumentException exception) { | ||
31 | - Map<String, Object> data = new HashMap<>(); | ||
32 | - data.put("resp_code", HttpStatus.BAD_REQUEST.value()); | ||
33 | - data.put("resp_msg", exception.getMessage()); | ||
34 | - | ||
35 | - return data; | ||
36 | - } | ||
37 | - /** | ||
38 | - * AccessDeniedException异常处理返回json | ||
39 | - * 状态码:403 | ||
40 | - * @param exception | ||
41 | - * @return | ||
42 | - */ | ||
43 | - @ExceptionHandler({ AccessDeniedException.class }) | ||
44 | - @ResponseStatus(HttpStatus.FORBIDDEN) | ||
45 | - public Map<String, Object> badMethodExpressException(AccessDeniedException exception) { | ||
46 | - Map<String, Object> data = new HashMap<>(); | ||
47 | - data.put("resp_code", HttpStatus.FORBIDDEN.value()); | ||
48 | - data.put("resp_msg", exception.getMessage()); | ||
49 | - | ||
50 | - return data; | ||
51 | - } | ||
52 | - @ExceptionHandler({ StatusRuntimeException.class }) | ||
53 | - @ResponseStatus(HttpStatus.BAD_REQUEST) | ||
54 | - public Map<String, Object> badRequestException(StatusRuntimeException exception) { | ||
55 | - Map<String, Object> data = new HashMap<>(); | ||
56 | - data.put("resp_code", HttpStatus.INTERNAL_SERVER_ERROR.value()); | ||
57 | - data.put("resp_msg", exception.getMessage()); | ||
58 | - | ||
59 | - return data; | ||
60 | - } | ||
61 | - | ||
62 | - | ||
63 | -} |
cloud/autho/src/main/java/com/sincere/autho/handler/OauthLogoutHandler.java
@@ -1,90 +0,0 @@ | @@ -1,90 +0,0 @@ | ||
1 | -package com.sincere.autho.handler; | ||
2 | - | ||
3 | -import org.slf4j.Logger; | ||
4 | -import org.slf4j.LoggerFactory; | ||
5 | -import org.springframework.beans.factory.annotation.Autowired; | ||
6 | -import org.springframework.security.core.Authentication; | ||
7 | -import org.springframework.security.oauth2.common.OAuth2AccessToken; | ||
8 | -import org.springframework.security.oauth2.common.OAuth2RefreshToken; | ||
9 | -import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; | ||
10 | -import org.springframework.security.oauth2.provider.token.TokenStore; | ||
11 | -import org.springframework.security.web.authentication.logout.LogoutHandler; | ||
12 | -import org.springframework.util.Assert; | ||
13 | - | ||
14 | -import javax.servlet.http.HttpServletRequest; | ||
15 | -import javax.servlet.http.HttpServletResponse; | ||
16 | -import java.util.Enumeration; | ||
17 | - | ||
18 | -/** | ||
19 | - * @author keets | ||
20 | - * @date 2017/10/17 | ||
21 | - */ | ||
22 | -public class OauthLogoutHandler implements LogoutHandler { | ||
23 | - | ||
24 | - private static final Logger logger = LoggerFactory.getLogger(OauthLogoutHandler.class); | ||
25 | - | ||
26 | - @Autowired | ||
27 | - private TokenStore tokenStore; | ||
28 | - | ||
29 | - @Override | ||
30 | - public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { | ||
31 | - Assert.notNull(tokenStore, "tokenStore must be set"); | ||
32 | - String token = extractToken(request); | ||
33 | - if(token!=null || !"".equals(token)){ | ||
34 | - OAuth2AccessToken existingAccessToken = tokenStore.readAccessToken(token); | ||
35 | - OAuth2RefreshToken refreshToken; | ||
36 | - if (existingAccessToken != null) { | ||
37 | - if (existingAccessToken.getRefreshToken() != null) { | ||
38 | - logger.info("remove refreshToken!", existingAccessToken.getRefreshToken()); | ||
39 | - refreshToken = existingAccessToken.getRefreshToken(); | ||
40 | - tokenStore.removeRefreshToken(refreshToken); | ||
41 | - } | ||
42 | - logger.info("remove existingAccessToken!", existingAccessToken); | ||
43 | - tokenStore.removeAccessToken(existingAccessToken); | ||
44 | - } | ||
45 | - return; | ||
46 | - } | ||
47 | - | ||
48 | - } | ||
49 | - | ||
50 | - protected String extractToken(HttpServletRequest request) { | ||
51 | - // first check the header... | ||
52 | - String token = extractHeaderToken(request); | ||
53 | - | ||
54 | - // bearer type allows a request parameter as well | ||
55 | - if (token == null) { | ||
56 | - logger.debug("Token not found in headers. Trying request parameters."); | ||
57 | - token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN); | ||
58 | - if (token == null) { | ||
59 | - logger.debug("Token not found in request parameters. Not an OAuth2 request."); | ||
60 | - } else { | ||
61 | - request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE, OAuth2AccessToken.BEARER_TYPE); | ||
62 | - } | ||
63 | - } | ||
64 | - | ||
65 | - return token; | ||
66 | - } | ||
67 | - | ||
68 | - protected String extractHeaderToken(HttpServletRequest request) { | ||
69 | - Enumeration<String> headers = request.getHeaders("Authorization"); | ||
70 | - while (headers.hasMoreElements()) { // typically there is only one (most | ||
71 | - // servers enforce that) | ||
72 | - String value = headers.nextElement(); | ||
73 | - if ((value.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) { | ||
74 | - String authHeaderValue = value.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim(); | ||
75 | - // Add this here for the auth details later. Would be better to | ||
76 | - // change the signature of this method. | ||
77 | - request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE, | ||
78 | - value.substring(0, OAuth2AccessToken.BEARER_TYPE.length()).trim()); | ||
79 | - int commaIndex = authHeaderValue.indexOf(','); | ||
80 | - if (commaIndex > 0) { | ||
81 | - authHeaderValue = authHeaderValue.substring(0, commaIndex); | ||
82 | - } | ||
83 | - return authHeaderValue; | ||
84 | - } | ||
85 | - } | ||
86 | - | ||
87 | - return null; | ||
88 | - } | ||
89 | - | ||
90 | -} |
cloud/autho/src/main/java/com/sincere/autho/log/dao/LogDao.java
@@ -1,13 +0,0 @@ | @@ -1,13 +0,0 @@ | ||
1 | -package com.sincere.autho.log.dao; | ||
2 | - | ||
3 | -import com.sincere.common.model.log.SysLog; | ||
4 | -import org.apache.ibatis.annotations.Insert; | ||
5 | -import org.apache.ibatis.annotations.Mapper; | ||
6 | - | ||
7 | -@Mapper | ||
8 | -public interface LogDao { | ||
9 | - | ||
10 | - @Insert("insert into sys_log(username, module, params, remark, flag, createTime) values(#{username}, #{module}, #{params}, #{remark}, #{flag}, #{createTime})") | ||
11 | - int save(SysLog log); | ||
12 | - | ||
13 | -} |
cloud/autho/src/main/java/com/sincere/autho/log/service/LogService.java
cloud/autho/src/main/java/com/sincere/autho/log/service/impl/LogServiceImpl.java
@@ -1,34 +0,0 @@ | @@ -1,34 +0,0 @@ | ||
1 | -package com.sincere.autho.log.service.impl; | ||
2 | - | ||
3 | -import com.sincere.autho.annotation.datasource.DataSource; | ||
4 | -import com.sincere.autho.log.dao.LogDao; | ||
5 | -import com.sincere.autho.log.service.LogService; | ||
6 | -import com.sincere.common.model.log.SysLog; | ||
7 | -import org.springframework.beans.factory.annotation.Autowired; | ||
8 | -import org.springframework.scheduling.annotation.Async; | ||
9 | -import org.springframework.stereotype.Service; | ||
10 | - | ||
11 | -import java.util.Date; | ||
12 | - | ||
13 | -@Service | ||
14 | -public class LogServiceImpl implements LogService { | ||
15 | - | ||
16 | - @Autowired | ||
17 | - private LogDao logDao; | ||
18 | - | ||
19 | - @Async | ||
20 | - @Override | ||
21 | - @DataSource(name="log") | ||
22 | - public void save(SysLog log) { | ||
23 | - if (log.getCreateTime() == null) { | ||
24 | - log.setCreateTime(new Date()); | ||
25 | - } | ||
26 | - if (log.getFlag() == null) { | ||
27 | - log.setFlag(Boolean.TRUE); | ||
28 | - } | ||
29 | - | ||
30 | - logDao.save(log); | ||
31 | - } | ||
32 | - | ||
33 | - | ||
34 | -} |
cloud/autho/src/main/java/com/sincere/autho/mapper/UserMapper.java
0 → 100644
cloud/autho/src/main/java/com/sincere/autho/service/LoginService.java
0 → 100644
cloud/autho/src/main/java/com/sincere/autho/service/RedisAuthorizationCodeServices.java
@@ -1,58 +0,0 @@ | @@ -1,58 +0,0 @@ | ||
1 | -package com.sincere.autho.service; | ||
2 | - | ||
3 | -import org.springframework.data.redis.core.RedisTemplate; | ||
4 | -import org.springframework.security.oauth2.provider.OAuth2Authentication; | ||
5 | -import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices; | ||
6 | - | ||
7 | -import java.util.concurrent.TimeUnit; | ||
8 | - | ||
9 | -/** | ||
10 | - * JdbcAuthorizationCodeServices替换 | ||
11 | - */ | ||
12 | -public class RedisAuthorizationCodeServices extends RandomValueAuthorizationCodeServices { | ||
13 | - | ||
14 | - private RedisTemplate<String,Object> redisTemplate ; | ||
15 | - | ||
16 | - | ||
17 | - public RedisTemplate<String, Object> getRedisTemplate() { | ||
18 | - return redisTemplate; | ||
19 | - } | ||
20 | - | ||
21 | - public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { | ||
22 | - this.redisTemplate = redisTemplate; | ||
23 | - } | ||
24 | - | ||
25 | - /** | ||
26 | - * 替换JdbcAuthorizationCodeServices的存储策略 | ||
27 | - * 将存储code到redis,并设置过期时间,10分钟<br> | ||
28 | - */ | ||
29 | - @Override | ||
30 | - protected void store(String code, OAuth2Authentication authentication) { | ||
31 | - | ||
32 | - redisTemplate.opsForValue().set(redisKey(code), authentication, 10, TimeUnit.MINUTES); | ||
33 | - | ||
34 | - | ||
35 | - } | ||
36 | - | ||
37 | - @Override | ||
38 | - protected OAuth2Authentication remove(final String code) { | ||
39 | - | ||
40 | - String codeKey =redisKey(code) ; | ||
41 | - | ||
42 | - OAuth2Authentication token = (OAuth2Authentication) redisTemplate.opsForValue().get(codeKey) ; | ||
43 | - | ||
44 | - this.redisTemplate.delete(codeKey); | ||
45 | - | ||
46 | - return token; | ||
47 | - } | ||
48 | - | ||
49 | - /** | ||
50 | - * redis中 code key的前缀 | ||
51 | - * | ||
52 | - * @param code | ||
53 | - * @return | ||
54 | - */ | ||
55 | - private String redisKey(String code) { | ||
56 | - return "oauth:code:" + code; | ||
57 | - } | ||
58 | -} |
cloud/autho/src/main/java/com/sincere/autho/service/RedisClientDetailsService.java
@@ -1,153 +0,0 @@ | @@ -1,153 +0,0 @@ | ||
1 | -package com.sincere.autho.service; | ||
2 | - | ||
3 | -import com.alibaba.fastjson.JSONObject; | ||
4 | -import org.apache.commons.lang.StringUtils; | ||
5 | -import org.slf4j.Logger; | ||
6 | -import org.slf4j.LoggerFactory; | ||
7 | -import org.springframework.data.redis.core.RedisTemplate; | ||
8 | -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; | ||
9 | -import org.springframework.security.oauth2.provider.ClientDetails; | ||
10 | -import org.springframework.security.oauth2.provider.NoSuchClientException; | ||
11 | -import org.springframework.security.oauth2.provider.client.BaseClientDetails; | ||
12 | -import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; | ||
13 | -import org.springframework.util.CollectionUtils; | ||
14 | - | ||
15 | -import javax.sql.DataSource; | ||
16 | -import java.util.List; | ||
17 | - | ||
18 | - | ||
19 | -/** | ||
20 | - * @author owen 624191343@qq.com | ||
21 | - * @version 创建时间:2017年11月12日 上午22:57:51 | ||
22 | - * 类说明 | ||
23 | - * 将oauth_client_details表数据缓存到redis,这里做个缓存优化 | ||
24 | - * layui模块中有对oauth_client_details的crud, 注意同步redis的数据 | ||
25 | - * 注意对oauth_client_details清楚redis db部分数据的清空 | ||
26 | - */ | ||
27 | - | ||
28 | -public class RedisClientDetailsService extends JdbcClientDetailsService { | ||
29 | - | ||
30 | - | ||
31 | - // 扩展 默认的 ClientDetailsService, 增加逻辑删除判断( status = 1) | ||
32 | - private static final String SELECT_CLIENT_DETAILS_SQL = "select client_id, client_secret, resource_ids, scope, authorized_grant_types, " + | ||
33 | - "web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove " + | ||
34 | - "from oauth_client_details where client_id = ? and `status` = 1 "; | ||
35 | - | ||
36 | - | ||
37 | - private static final String SELECT_FIND_STATEMENT = "select client_id, client_secret,resource_ids, scope, " | ||
38 | - + "authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, " | ||
39 | - + "refresh_token_validity, additional_information, autoapprove from oauth_client_details where `status` = 1 order by client_id " ; | ||
40 | - | ||
41 | - /** | ||
42 | - * 缓存client的redis key,这里是hash结构存储 | ||
43 | - */ | ||
44 | - private static final String CACHE_CLIENT_KEY = "oauth_client_details"; | ||
45 | - | ||
46 | - private Logger logger = LoggerFactory.getLogger(RedisClientDetailsService.class) ; | ||
47 | - | ||
48 | - private RedisTemplate<String,Object> redisTemplate ; | ||
49 | - | ||
50 | - public RedisTemplate<String, Object> getRedisTemplate() { | ||
51 | - return redisTemplate; | ||
52 | - } | ||
53 | - | ||
54 | - public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { | ||
55 | - this.redisTemplate = redisTemplate; | ||
56 | - } | ||
57 | - | ||
58 | - public RedisClientDetailsService(DataSource dataSource) { | ||
59 | - super(dataSource); | ||
60 | - setSelectClientDetailsSql(SELECT_CLIENT_DETAILS_SQL) ; | ||
61 | - setFindClientDetailsSql(SELECT_FIND_STATEMENT) ; | ||
62 | - } | ||
63 | - | ||
64 | - | ||
65 | - | ||
66 | - @Override | ||
67 | - public ClientDetails loadClientByClientId(String clientId) throws InvalidClientException { | ||
68 | - ClientDetails clientDetails = null; | ||
69 | - | ||
70 | - // 先从redis获取 | ||
71 | - String value = (String) redisTemplate.boundHashOps(CACHE_CLIENT_KEY).get(clientId); | ||
72 | - if (StringUtils.isBlank(value)) { | ||
73 | - clientDetails = cacheAndGetClient(clientId); | ||
74 | - } else { | ||
75 | - clientDetails = JSONObject.parseObject(value, BaseClientDetails.class); | ||
76 | - } | ||
77 | - | ||
78 | - return clientDetails; | ||
79 | - } | ||
80 | - | ||
81 | - /** | ||
82 | - * 缓存client并返回client | ||
83 | - * | ||
84 | - * @param clientId | ||
85 | - * @return | ||
86 | - */ | ||
87 | - private ClientDetails cacheAndGetClient(String clientId) { | ||
88 | - // 从数据库读取 | ||
89 | - ClientDetails clientDetails = null ; | ||
90 | - try { | ||
91 | - clientDetails = super.loadClientByClientId(clientId); | ||
92 | - if (clientDetails != null) { | ||
93 | - // 写入redis缓存 | ||
94 | - redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(clientId, JSONObject.toJSONString(clientDetails)); | ||
95 | - logger.info("缓存clientId:{},{}", clientId, clientDetails); | ||
96 | - } | ||
97 | - }catch (NoSuchClientException e){ | ||
98 | - logger.info("clientId:{},{}", clientId, clientId ); | ||
99 | - }catch (InvalidClientException e) { | ||
100 | - // TODO Auto-generated catch block | ||
101 | - e.printStackTrace(); | ||
102 | - } | ||
103 | - | ||
104 | - return clientDetails; | ||
105 | - } | ||
106 | - | ||
107 | - @Override | ||
108 | - public void updateClientDetails(ClientDetails clientDetails) throws NoSuchClientException { | ||
109 | - super.updateClientDetails(clientDetails); | ||
110 | - cacheAndGetClient(clientDetails.getClientId()); | ||
111 | - } | ||
112 | - | ||
113 | - @Override | ||
114 | - public void updateClientSecret(String clientId, String secret) throws NoSuchClientException { | ||
115 | - super.updateClientSecret(clientId, secret); | ||
116 | - cacheAndGetClient(clientId); | ||
117 | - } | ||
118 | - | ||
119 | - @Override | ||
120 | - public void removeClientDetails(String clientId) throws NoSuchClientException { | ||
121 | - super.removeClientDetails(clientId); | ||
122 | - removeRedisCache(clientId); | ||
123 | - } | ||
124 | - | ||
125 | - /** | ||
126 | - * 删除redis缓存 | ||
127 | - * | ||
128 | - * @param clientId | ||
129 | - */ | ||
130 | - private void removeRedisCache(String clientId) { | ||
131 | - redisTemplate.boundHashOps(CACHE_CLIENT_KEY).delete(clientId); | ||
132 | - } | ||
133 | - | ||
134 | - /** | ||
135 | - * 将oauth_client_details全表刷入redis | ||
136 | - */ | ||
137 | - public void loadAllClientToCache() { | ||
138 | - if (redisTemplate.hasKey(CACHE_CLIENT_KEY)) { | ||
139 | - return; | ||
140 | - } | ||
141 | - logger.info("将oauth_client_details全表刷入redis"); | ||
142 | - | ||
143 | - List<ClientDetails> list = super.listClientDetails(); | ||
144 | - if (CollectionUtils.isEmpty(list)) { | ||
145 | - logger.error("oauth_client_details表数据为空,请检查"); | ||
146 | - return; | ||
147 | - } | ||
148 | - | ||
149 | - list.parallelStream().forEach(client -> { | ||
150 | - redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(client.getClientId(), JSONObject.toJSONString(client)); | ||
151 | - }); | ||
152 | - } | ||
153 | -} |
cloud/autho/src/main/java/com/sincere/autho/service/impl/LoginServiceImpl.java
0 → 100644
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +package com.sincere.autho.service.impl; | ||
2 | + | ||
3 | +import com.sincere.autho.dto.req.LoginReqDto; | ||
4 | +import com.sincere.autho.mapper.UserMapper; | ||
5 | +import com.sincere.autho.service.LoginService; | ||
6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
7 | +import org.springframework.stereotype.Service; | ||
8 | + | ||
9 | +@Service | ||
10 | +public class LoginServiceImpl implements LoginService { | ||
11 | + | ||
12 | + @Autowired | ||
13 | + UserMapper userMapper ; | ||
14 | + | ||
15 | + @Override | ||
16 | + public String login(LoginReqDto loginReqDto) { | ||
17 | + String userId = "" ; | ||
18 | + if(loginReqDto.getUserType() == 2){ | ||
19 | + userId = userMapper.loginStudent(loginReqDto); | ||
20 | + }else { | ||
21 | + userId = userMapper.loginTeacher(loginReqDto); | ||
22 | + } | ||
23 | + return userId; | ||
24 | + } | ||
25 | +} |
cloud/autho/src/main/java/com/sincere/autho/token/RedisTemplateTokenStore.java
@@ -1,331 +0,0 @@ | @@ -1,331 +0,0 @@ | ||
1 | -package com.sincere.autho.token; | ||
2 | - | ||
3 | -import com.sincere.common.model.system.LoginAppUser; | ||
4 | -import org.springframework.data.redis.core.RedisTemplate; | ||
5 | -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | ||
6 | -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; | ||
7 | -import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; | ||
8 | -import org.springframework.security.oauth2.common.OAuth2AccessToken; | ||
9 | -import org.springframework.security.oauth2.common.OAuth2RefreshToken; | ||
10 | -import org.springframework.security.oauth2.provider.OAuth2Authentication; | ||
11 | -import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator; | ||
12 | -import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator; | ||
13 | -import org.springframework.security.oauth2.provider.token.TokenStore; | ||
14 | - | ||
15 | -import java.time.Instant; | ||
16 | -import java.time.LocalDateTime; | ||
17 | -import java.time.ZoneId; | ||
18 | -import java.util.*; | ||
19 | -import java.util.concurrent.TimeUnit; | ||
20 | - | ||
21 | -/** | ||
22 | - * @version redis集群存储token | ||
23 | - */ | ||
24 | - | ||
25 | -public class RedisTemplateTokenStore implements TokenStore { | ||
26 | - | ||
27 | - private static final String ACCESS = "access:"; | ||
28 | - private static final String AUTH_TO_ACCESS = "auth_to_access:"; | ||
29 | - private static final String AUTH = "auth:"; | ||
30 | - private static final String REFRESH_AUTH = "refresh_auth:"; | ||
31 | - private static final String ACCESS_TO_REFRESH = "access_to_refresh:"; | ||
32 | - private static final String REFRESH = "refresh:"; | ||
33 | - private static final String REFRESH_TO_ACCESS = "refresh_to_access:"; | ||
34 | - private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:"; | ||
35 | - private static final String UNAME_TO_ACCESS = "uname_to_access:"; | ||
36 | - private static final String TOKEN = "token:"; | ||
37 | - | ||
38 | - private RedisTemplate<String, Object> redisTemplate; | ||
39 | - | ||
40 | - public RedisTemplate<String, Object> getRedisTemplate() { | ||
41 | - return redisTemplate; | ||
42 | - } | ||
43 | - | ||
44 | - public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { | ||
45 | - this.redisTemplate = redisTemplate; | ||
46 | - } | ||
47 | - | ||
48 | - private AuthenticationKeyGenerator authenticationKeyGenerator = new DefaultAuthenticationKeyGenerator(); | ||
49 | - | ||
50 | - public void setAuthenticationKeyGenerator(AuthenticationKeyGenerator authenticationKeyGenerator) { | ||
51 | - this.authenticationKeyGenerator = authenticationKeyGenerator; | ||
52 | - } | ||
53 | - | ||
54 | - public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) { | ||
55 | - String key = authenticationKeyGenerator.extractKey(authentication); | ||
56 | - OAuth2AccessToken accessToken = (OAuth2AccessToken) redisTemplate.opsForValue().get(AUTH_TO_ACCESS + key); | ||
57 | - if (accessToken != null | ||
58 | - && !key.equals(authenticationKeyGenerator.extractKey(readAuthentication(accessToken.getValue())))) { | ||
59 | - // Keep the stores consistent (maybe the same user is represented by | ||
60 | - // this authentication but the details | ||
61 | - // have changed) | ||
62 | - storeAccessToken(accessToken, authentication); | ||
63 | - } | ||
64 | - return accessToken; | ||
65 | - } | ||
66 | - | ||
67 | - public OAuth2Authentication readAuthentication(OAuth2AccessToken token) { | ||
68 | - return readAuthentication(token.getValue()); | ||
69 | - } | ||
70 | - | ||
71 | - public OAuth2Authentication readAuthentication(String token) { | ||
72 | - return (OAuth2Authentication) this.redisTemplate.opsForValue().get(AUTH + token); | ||
73 | - } | ||
74 | - | ||
75 | - public OAuth2Authentication readAuthenticationForRefreshToken(OAuth2RefreshToken token) { | ||
76 | - return readAuthenticationForRefreshToken(token.getValue()); | ||
77 | - } | ||
78 | - | ||
79 | - public OAuth2Authentication readAuthenticationForRefreshToken(String token) { | ||
80 | - return (OAuth2Authentication) this.redisTemplate.opsForValue().get(REFRESH_AUTH + token); | ||
81 | - } | ||
82 | - | ||
83 | - public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) { | ||
84 | - | ||
85 | - OAuth2AccessToken existingAccessToken = this.getAccessToken(authentication); | ||
86 | - | ||
87 | - this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token); | ||
88 | - this.redisTemplate.opsForValue().set(AUTH + token.getValue(), authentication); | ||
89 | - this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication), | ||
90 | - token); | ||
91 | - | ||
92 | - Map<String, Object> params = new HashMap<>(); | ||
93 | - | ||
94 | - params.put("clientId", authentication.getOAuth2Request().getClientId()); | ||
95 | - | ||
96 | - if (authentication.getUserAuthentication() instanceof UsernamePasswordAuthenticationToken) { | ||
97 | - UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication | ||
98 | - .getUserAuthentication(); | ||
99 | - LoginAppUser appUser = (LoginAppUser) authenticationToken.getPrincipal(); | ||
100 | - params.put("username", appUser.getUsername()); | ||
101 | - params.put("authorities", appUser.getAuthorities()); | ||
102 | - } | ||
103 | - | ||
104 | - if (!params.isEmpty()) { | ||
105 | - this.redisTemplate.opsForValue().set(TOKEN + token.getValue(), params); | ||
106 | - } | ||
107 | - | ||
108 | - if (!authentication.isClientOnly()) { | ||
109 | - if (existingAccessToken != null) { | ||
110 | - if (!existingAccessToken.isExpired()) { | ||
111 | - int seconds = token.getExpiresIn(); | ||
112 | - redisTemplate.expire(UNAME_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds, | ||
113 | - TimeUnit.SECONDS); | ||
114 | - } else { | ||
115 | - redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token); | ||
116 | - } | ||
117 | - } else { | ||
118 | - redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token); | ||
119 | - } | ||
120 | - | ||
121 | - } | ||
122 | - | ||
123 | - if (existingAccessToken != null) { | ||
124 | - if (!existingAccessToken.isExpired()) { | ||
125 | - int seconds = token.getExpiresIn(); | ||
126 | - redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds, | ||
127 | - TimeUnit.SECONDS); | ||
128 | - | ||
129 | - } else { | ||
130 | - redisTemplate.opsForList() | ||
131 | - .rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), token); | ||
132 | - } | ||
133 | - } else { | ||
134 | - redisTemplate.opsForList().rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), | ||
135 | - token); | ||
136 | - } | ||
137 | - | ||
138 | - if (token.getExpiration() != null) { | ||
139 | - | ||
140 | - int seconds = token.getExpiresIn(); | ||
141 | - redisTemplate.expire(ACCESS + token.getValue(), seconds, TimeUnit.SECONDS); | ||
142 | - redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS); | ||
143 | - redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS); | ||
144 | - redisTemplate.expire(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication), seconds, | ||
145 | - TimeUnit.SECONDS); | ||
146 | - redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds, | ||
147 | - TimeUnit.SECONDS); | ||
148 | - redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(authentication), seconds, TimeUnit.SECONDS); | ||
149 | - } | ||
150 | - | ||
151 | - OAuth2RefreshToken refreshToken = token.getRefreshToken(); | ||
152 | - | ||
153 | - if (token.getRefreshToken() != null && token.getRefreshToken().getValue() != null) { | ||
154 | - this.redisTemplate.opsForValue().set(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(), | ||
155 | - token.getValue()); | ||
156 | - this.redisTemplate.opsForValue().set(ACCESS_TO_REFRESH + token.getValue(), | ||
157 | - token.getRefreshToken().getValue()); | ||
158 | - | ||
159 | - if (refreshToken instanceof ExpiringOAuth2RefreshToken) { | ||
160 | - ExpiringOAuth2RefreshToken expiringRefreshToken = (ExpiringOAuth2RefreshToken) refreshToken; | ||
161 | - Date expiration = expiringRefreshToken.getExpiration(); | ||
162 | - if (expiration != null) { | ||
163 | - int seconds = Long.valueOf((expiration.getTime() - System.currentTimeMillis()) / 1000L).intValue(); | ||
164 | - | ||
165 | - redisTemplate.expire(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(), seconds, | ||
166 | - TimeUnit.SECONDS); | ||
167 | - redisTemplate.expire(ACCESS_TO_REFRESH + token.getValue(), seconds, TimeUnit.SECONDS); | ||
168 | - | ||
169 | - } | ||
170 | - } | ||
171 | - | ||
172 | - } | ||
173 | - } | ||
174 | - | ||
175 | - private String getApprovalKey(OAuth2Authentication authentication) { | ||
176 | - String userName = authentication.getUserAuthentication() == null ? "" | ||
177 | - : authentication.getUserAuthentication().getName(); | ||
178 | - return getApprovalKey(authentication.getOAuth2Request().getClientId(), userName); | ||
179 | - } | ||
180 | - | ||
181 | - private String getApprovalKey(String clientId, String userName) { | ||
182 | - return clientId + (userName == null ? "" : ":" + userName); | ||
183 | - } | ||
184 | - | ||
185 | - public void removeAccessToken(OAuth2AccessToken accessToken) { | ||
186 | - removeAccessToken(accessToken.getValue()); | ||
187 | - } | ||
188 | - | ||
189 | - public OAuth2AccessToken readAccessToken(String tokenValue) { | ||
190 | - | ||
191 | - OAuth2Authentication oauth2Authentication = (OAuth2Authentication) this.redisTemplate.opsForValue() | ||
192 | - .get(AUTH + tokenValue); | ||
193 | - OAuth2AccessToken oauth2AccessToken = (OAuth2AccessToken) this.redisTemplate.opsForValue() | ||
194 | - .get(ACCESS + tokenValue); | ||
195 | - if (oauth2Authentication != null) { | ||
196 | - String auth_to_access = authenticationKeyGenerator.extractKey(oauth2Authentication); | ||
197 | - if (oauth2AccessToken != null) { | ||
198 | - if (oauth2AccessToken.getExpiresIn() < 180) { | ||
199 | - | ||
200 | - if (oauth2AccessToken instanceof DefaultOAuth2AccessToken) { | ||
201 | - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) oauth2AccessToken; | ||
202 | -// Calendar cal = Calendar.getInstance(); | ||
203 | -// cal.add(Calendar.DATE, 30); | ||
204 | -// Date date = cal.getTime(); | ||
205 | - /** | ||
206 | - * 自动续费 30分钟 | ||
207 | - */ | ||
208 | - LocalDateTime t1 = LocalDateTime.now().plusMinutes(30); | ||
209 | - ZoneId zone = ZoneId.systemDefault(); | ||
210 | - Instant instant = t1.atZone(zone).toInstant(); | ||
211 | - Date date = Date.from(instant); | ||
212 | - | ||
213 | - token.setExpiration(date); | ||
214 | - | ||
215 | - int seconds = token.getExpiresIn(); | ||
216 | - | ||
217 | - this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + auth_to_access, token, seconds, | ||
218 | - TimeUnit.SECONDS); | ||
219 | - this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token, seconds, | ||
220 | - TimeUnit.SECONDS); | ||
221 | - | ||
222 | - redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS); | ||
223 | - redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS); | ||
224 | - | ||
225 | - redisTemplate.expire( | ||
226 | - CLIENT_ID_TO_ACCESS + oauth2Authentication.getOAuth2Request().getClientId(), seconds, | ||
227 | - TimeUnit.SECONDS); | ||
228 | - redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(oauth2Authentication), seconds, | ||
229 | - TimeUnit.SECONDS); | ||
230 | - | ||
231 | - } | ||
232 | - | ||
233 | - } | ||
234 | - } | ||
235 | - } | ||
236 | - | ||
237 | - return oauth2AccessToken; | ||
238 | - } | ||
239 | - | ||
240 | - public void removeAccessToken(String tokenValue) { | ||
241 | - OAuth2AccessToken removed = (OAuth2AccessToken) redisTemplate.opsForValue().get(ACCESS + tokenValue); | ||
242 | - // Don't remove the refresh token - it's up to the caller to do that | ||
243 | - OAuth2Authentication authentication = (OAuth2Authentication) this.redisTemplate.opsForValue() | ||
244 | - .get(AUTH + tokenValue); | ||
245 | - | ||
246 | - this.redisTemplate.delete(AUTH + tokenValue); | ||
247 | - redisTemplate.delete(ACCESS + tokenValue); | ||
248 | - redisTemplate.delete(TOKEN + tokenValue); | ||
249 | - this.redisTemplate.delete(ACCESS_TO_REFRESH + tokenValue); | ||
250 | - | ||
251 | - if (authentication != null) { | ||
252 | - this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication)); | ||
253 | - | ||
254 | - String clientId = authentication.getOAuth2Request().getClientId(); | ||
255 | - | ||
256 | - // redisTemplate.opsForList().rightPush("UNAME_TO_ACCESS:"+getApprovalKey(authentication), | ||
257 | - // token) ; | ||
258 | - redisTemplate.opsForList().leftPop(UNAME_TO_ACCESS + getApprovalKey(clientId, authentication.getName())); | ||
259 | - | ||
260 | - redisTemplate.opsForList().leftPop(CLIENT_ID_TO_ACCESS + clientId); | ||
261 | - | ||
262 | - this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication)); | ||
263 | - } | ||
264 | - } | ||
265 | - | ||
266 | - public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) { | ||
267 | - this.redisTemplate.opsForValue().set(REFRESH + refreshToken.getValue(), refreshToken); | ||
268 | - this.redisTemplate.opsForValue().set(REFRESH_AUTH + refreshToken.getValue(), authentication); | ||
269 | - } | ||
270 | - | ||
271 | - public OAuth2RefreshToken readRefreshToken(String tokenValue) { | ||
272 | - return (OAuth2RefreshToken) this.redisTemplate.opsForValue().get(REFRESH + tokenValue); | ||
273 | - } | ||
274 | - | ||
275 | - public void removeRefreshToken(OAuth2RefreshToken refreshToken) { | ||
276 | - removeRefreshToken(refreshToken.getValue()); | ||
277 | - } | ||
278 | - | ||
279 | - public void removeRefreshToken(String tokenValue) { | ||
280 | - this.redisTemplate.delete(REFRESH + tokenValue); | ||
281 | - this.redisTemplate.delete(REFRESH_AUTH + tokenValue); | ||
282 | - this.redisTemplate.delete(REFRESH_TO_ACCESS + tokenValue); | ||
283 | - } | ||
284 | - | ||
285 | - public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken refreshToken) { | ||
286 | - removeAccessTokenUsingRefreshToken(refreshToken.getValue()); | ||
287 | - } | ||
288 | - | ||
289 | - private void removeAccessTokenUsingRefreshToken(String refreshToken) { | ||
290 | - | ||
291 | - String token = (String) this.redisTemplate.opsForValue().get(REFRESH_TO_ACCESS + refreshToken); | ||
292 | - | ||
293 | - if (token != null) { | ||
294 | - redisTemplate.delete(REFRESH_TO_ACCESS + refreshToken); | ||
295 | - } | ||
296 | - } | ||
297 | - | ||
298 | - public Collection<OAuth2AccessToken> findTokensByClientIdAndUserName(String clientId, String userName) { | ||
299 | - List<Object> result = redisTemplate.opsForList().range(UNAME_TO_ACCESS + getApprovalKey(clientId, userName), 0, | ||
300 | - -1); | ||
301 | - | ||
302 | - if (result == null || result.size() == 0) { | ||
303 | - return Collections.<OAuth2AccessToken>emptySet(); | ||
304 | - } | ||
305 | - List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size()); | ||
306 | - | ||
307 | - for (Iterator<Object> it = result.iterator(); it.hasNext();) { | ||
308 | - OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next(); | ||
309 | - accessTokens.add(accessToken); | ||
310 | - } | ||
311 | - | ||
312 | - return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens); | ||
313 | - } | ||
314 | - | ||
315 | - public Collection<OAuth2AccessToken> findTokensByClientId(String clientId) { | ||
316 | - List<Object> result = redisTemplate.opsForList().range((CLIENT_ID_TO_ACCESS + clientId), 0, -1); | ||
317 | - | ||
318 | - if (result == null || result.size() == 0) { | ||
319 | - return Collections.<OAuth2AccessToken>emptySet(); | ||
320 | - } | ||
321 | - List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size()); | ||
322 | - | ||
323 | - for (Iterator<Object> it = result.iterator(); it.hasNext();) { | ||
324 | - OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next(); | ||
325 | - accessTokens.add(accessToken); | ||
326 | - } | ||
327 | - | ||
328 | - return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens); | ||
329 | - } | ||
330 | - | ||
331 | -} |
cloud/autho/src/main/java/com/sincere/autho/utils/SpringUtil.java
@@ -1,35 +0,0 @@ | @@ -1,35 +0,0 @@ | ||
1 | -package com.sincere.autho.utils; | ||
2 | - | ||
3 | -import org.springframework.beans.BeansException; | ||
4 | -import org.springframework.context.ApplicationContext; | ||
5 | -import org.springframework.context.ApplicationContextAware; | ||
6 | -import org.springframework.core.env.Environment; | ||
7 | -import org.springframework.stereotype.Component; | ||
8 | - | ||
9 | -/** | ||
10 | - * spring获取bean工具类 | ||
11 | - * | ||
12 | - * | ||
13 | - */ | ||
14 | -@Component | ||
15 | -public class SpringUtil implements ApplicationContextAware { | ||
16 | - | ||
17 | - private static ApplicationContext applicationContext = null; | ||
18 | - | ||
19 | - @Override | ||
20 | - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | ||
21 | - SpringUtil.applicationContext = applicationContext; | ||
22 | - } | ||
23 | - | ||
24 | - public static <T> T getBean(Class<T> cla) { | ||
25 | - return applicationContext.getBean(cla); | ||
26 | - } | ||
27 | - | ||
28 | - public static <T> T getBean(String name, Class<T> cal) { | ||
29 | - return applicationContext.getBean(name, cal); | ||
30 | - } | ||
31 | - | ||
32 | - public static String getProperty(String key) { | ||
33 | - return applicationContext.getBean(Environment.class).getProperty(key); | ||
34 | - } | ||
35 | -} |
cloud/autho/src/main/java/com/sincere/autho/utils/SysUserUtil.java
@@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
1 | -package com.sincere.autho.utils; | ||
2 | - | ||
3 | -import com.sincere.common.model.system.LoginAppUser; | ||
4 | -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | ||
5 | -import org.springframework.security.core.Authentication; | ||
6 | -import org.springframework.security.core.context.SecurityContextHolder; | ||
7 | -import org.springframework.security.oauth2.provider.OAuth2Authentication; | ||
8 | -import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; | ||
9 | - | ||
10 | -/** | ||
11 | - * @author 作者 owen E-mail: 624191343@qq.com | ||
12 | - * @version 创建时间:2017年11月12日 上午22:57:51 获取用户信息 | ||
13 | - */ | ||
14 | -public class SysUserUtil { | ||
15 | - | ||
16 | - /** | ||
17 | - * 获取登陆的 LoginAppUser | ||
18 | - * | ||
19 | - * @return | ||
20 | - */ | ||
21 | - @SuppressWarnings("rawtypes") | ||
22 | - public static LoginAppUser getLoginAppUser() { | ||
23 | - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); | ||
24 | - if (authentication instanceof OAuth2Authentication) { | ||
25 | - OAuth2Authentication oAuth2Auth = (OAuth2Authentication) authentication; | ||
26 | - authentication = oAuth2Auth.getUserAuthentication(); | ||
27 | - | ||
28 | - if (authentication instanceof UsernamePasswordAuthenticationToken) { | ||
29 | - UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication; | ||
30 | - return (LoginAppUser) authenticationToken.getPrincipal(); | ||
31 | - } else if (authentication instanceof PreAuthenticatedAuthenticationToken) { | ||
32 | - // 刷新token方式 | ||
33 | - PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication; | ||
34 | - return (LoginAppUser) authenticationToken.getPrincipal(); | ||
35 | - | ||
36 | - } | ||
37 | - } | ||
38 | - | ||
39 | - return null; | ||
40 | - } | ||
41 | -} |
cloud/autho/src/main/resources/application.yaml
1 | server: | 1 | server: |
2 | - port: 8763 | 2 | + port: 9005 |
3 | 3 | ||
4 | spring: | 4 | spring: |
5 | application: | 5 | application: |
6 | - name: auth-server | ||
7 | -session: | ||
8 | - store-type: redis | 6 | + name: authserver |
9 | datasource: | 7 | datasource: |
10 | - dynamic: | ||
11 | - enable: true | ||
12 | - druid: | ||
13 | - # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别) | ||
14 | - core: | ||
15 | - url: jdbc:mysql://localhost/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false | ||
16 | - username: root | ||
17 | - password: root | ||
18 | - driver-class-name: com.mysql.jdbc.Driver | ||
19 | - log: | ||
20 | - url: jdbc:mysql://59.110.164.254:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false | ||
21 | - username: root | ||
22 | - password: root | ||
23 | - driver-class-name: com.mysql.jdbc.Driver | ||
24 | - #连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive | ||
25 | - initial-size: 1 | ||
26 | - max-active: 20 | ||
27 | - min-idle: 1 | ||
28 | - # 配置获取连接等待超时的时间 | ||
29 | - max-wait: 60000 | ||
30 | - #打开PSCache,并且指定每个连接上PSCache的大小 | ||
31 | - pool-prepared-statements: true | ||
32 | - max-pool-prepared-statement-per-connection-size: 20 | ||
33 | - validation-query: SELECT 'x' | ||
34 | - test-on-borrow: false | ||
35 | - test-on-return: false | ||
36 | - test-while-idle: true | ||
37 | - #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | ||
38 | - time-between-eviction-runs-millis: 60000 | ||
39 | - #配置一个连接在池中最小生存的时间,单位是毫秒 | ||
40 | - min-evictable-idle-time-millis: 300000 | ||
41 | - filters: stat,wall | ||
42 | - # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter | ||
43 | - #是否启用StatFilter默认值true | ||
44 | - web-stat-filter.enabled: true | ||
45 | - web-stat-filter.url-pattern: /* | ||
46 | - web-stat-filter.exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*" | ||
47 | - web-stat-filter.session-stat-max-count: 1000 | ||
48 | - web-stat-filter.profile-enable: true | ||
49 | - # StatViewServlet配置 | ||
50 | - #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API | ||
51 | - #是否启用StatViewServlet默认值true | ||
52 | - stat-view-servlet.enabled: true | ||
53 | - #根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如: | ||
54 | - #http://110.76.43.235:9000/druid/index.html | ||
55 | - #http://110.76.43.235:8080/mini-web/druid/index.html | ||
56 | - stat-view-servlet.url-pattern: /druid/* | ||
57 | - #允许清空统计数据 | ||
58 | - stat-view-servlet.reset-enable: true | ||
59 | - stat-view-servlet.login-username: admin | ||
60 | - stat-view-servlet.login-password: admin | ||
61 | - #StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置allow和deny这两个参数 | ||
62 | - #deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。如果allow没有配置或者为空,则允许所有访问 | ||
63 | - #配置的格式 | ||
64 | - #<IP> | ||
65 | - #或者<IP>/<SUB_NET_MASK_size>其中128.242.127.1/24 | ||
66 | - #24表示,前面24位是子网掩码,比对的时候,前面24位相同就匹配,不支持IPV6。 | ||
67 | - #stat-view-servlet.allow= | ||
68 | - #stat-view-servlet.deny=128.242.127.1/24,128.242.128.1 | ||
69 | - # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置 | ||
70 | - #aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔 | ||
71 | -################### mysq end ########################## | ||
72 | - | ||
73 | - | 8 | + username: szjxtuser |
9 | + password: RQminVCJota3H1u8bBYH | ||
10 | + url: jdbc:sqlserver://116.62.155.137:33419;database=SmartCampus | ||
11 | + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver | ||
12 | +##mybatis | ||
13 | +mybatis: | ||
14 | + mapper-locations: classpath:mapper/*.xml | ||
15 | + type-aliases-package: com.sincere.autho.mapper | ||
16 | + check-config-location: true | ||
17 | +ribbon: | ||
18 | + ReadTimeout: 50000 | ||
19 | + ConnectTimeout: 5000 | ||
74 | eureka: | 20 | eureka: |
75 | instance: | 21 | instance: |
76 | hostname: localhost | 22 | hostname: localhost |
@@ -78,19 +24,5 @@ eureka: | @@ -78,19 +24,5 @@ eureka: | ||
78 | lease-renewal-interval-in-seconds: 10 | 24 | lease-renewal-interval-in-seconds: 10 |
79 | client: | 25 | client: |
80 | service-url: | 26 | service-url: |
81 | - defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/ | ||
82 | - | 27 | + defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ |
83 | 28 | ||
84 | - redis: | ||
85 | - ################### redis 单机版 start ########################## | ||
86 | - host: localhost | ||
87 | - port: 6379 | ||
88 | - timeout: 6000 | ||
89 | - database: 2 | ||
90 | - lettuce: | ||
91 | - pool: | ||
92 | - max-active: 10 # 连接池最大连接数(使用负值表示没有限制),如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽) | ||
93 | - max-idle: 8 # 连接池中的最大空闲连接 ,默认值也是8 | ||
94 | - max-wait: 100 # # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException | ||
95 | - min-idle: 2 # 连接池中的最小空闲连接 ,默认值也是0 | ||
96 | - shutdown-timeout: 100ms | ||
97 | \ No newline at end of file | 29 | \ No newline at end of file |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8" ?> | ||
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | ||
3 | +<mapper namespace="com.sincere.autho.mapper.UserMapper"> | ||
4 | + | ||
5 | + | ||
6 | + <select id="loginTeacher" parameterType="com.sincere.autho.dto.req.LoginReqDto" resultType="java.lang.String"> | ||
7 | + select user_id from SZ_User where mobile = #{account} and pass = #{password} | ||
8 | + </select> | ||
9 | + | ||
10 | + <select id="loginStudent" parameterType="com.sincere.autho.dto.req.LoginReqDto" resultType="java.lang.String"> | ||
11 | + select user_id from SZ_User where name = #{account} and pass = #{password} | ||
12 | + </select> | ||
13 | + | ||
14 | +</mapper> |
cloud/common/src/main/java/com/sincere/common/util/TokenUtils.java
cloud/getaway/src/main/java/com/sincere/getaway/client/filter/AccessFilter.java
@@ -63,8 +63,8 @@ public class AccessFilter implements GlobalFilter, Ordered { | @@ -63,8 +63,8 @@ public class AccessFilter implements GlobalFilter, Ordered { | ||
63 | exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); | 63 | exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); |
64 | ServerHttpResponse response = exchange.getResponse(); | 64 | ServerHttpResponse response = exchange.getResponse(); |
65 | JSONObject message = new JSONObject(); | 65 | JSONObject message = new JSONObject(); |
66 | - message.put("resp_code", result.getCode()); | ||
67 | - message.put("resp_msg", result.getMessage()); | 66 | + message.put("code", result.getCode()); |
67 | + message.put("message", result.getMessage()); | ||
68 | byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8); | 68 | byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8); |
69 | DataBuffer buffer = response.bufferFactory().wrap(bits); | 69 | DataBuffer buffer = response.bufferFactory().wrap(bits); |
70 | response.setStatusCode(HttpStatus.UNAUTHORIZED); | 70 | response.setStatusCode(HttpStatus.UNAUTHORIZED); |
@@ -86,7 +86,7 @@ public class AccessFilter implements GlobalFilter, Ordered { | @@ -86,7 +86,7 @@ public class AccessFilter implements GlobalFilter, Ordered { | ||
86 | return ResultEnums.getByCode(e.getCode()); | 86 | return ResultEnums.getByCode(e.getCode()); |
87 | } | 87 | } |
88 | } | 88 | } |
89 | - return ResultEnums.error ; | 89 | + return ResultEnums.success ; |
90 | } | 90 | } |
91 | 91 | ||
92 | public String extractToken(ServerHttpRequest request) { | 92 | public String extractToken(ServerHttpRequest request) { |
cloud/getaway/src/main/resources/application.yml
@@ -35,6 +35,12 @@ spring: | @@ -35,6 +35,12 @@ spring: | ||
35 | - Path=/file-center/** | 35 | - Path=/file-center/** |
36 | filters: | 36 | filters: |
37 | - StripPrefix=1 | 37 | - StripPrefix=1 |
38 | + - id: authserver | ||
39 | + uri: lb://authserver | ||
40 | + predicates: | ||
41 | + - Path=/authserver/** | ||
42 | + filters: | ||
43 | + - StripPrefix=1 | ||
38 | # discovery: | 44 | # discovery: |
39 | # locator: | 45 | # locator: |
40 | # lowerCaseServiceId: true | 46 | # lowerCaseServiceId: true |
@@ -54,5 +60,6 @@ ribbon: | @@ -54,5 +60,6 @@ ribbon: | ||
54 | MaxAutoRetries: 1 | 60 | MaxAutoRetries: 1 |
55 | MaxAutoRetriesNextServer: 1 | 61 | MaxAutoRetriesNextServer: 1 |
56 | 62 | ||
63 | + | ||
57 | url: | 64 | url: |
58 | - ignored: /SmartCampusWebApi/** | ||
59 | \ No newline at end of file | 65 | \ No newline at end of file |
66 | + ignored: /SmartCampusWebApi/**,/authserver/** | ||
60 | \ No newline at end of file | 67 | \ No newline at end of file |
cloud/user_search/src/main/java/com/sincere/userSearch/Swagger2.java
@@ -36,7 +36,7 @@ public class Swagger2 { | @@ -36,7 +36,7 @@ public class Swagger2 { | ||
36 | .enableUrlTemplating(true) | 36 | .enableUrlTemplating(true) |
37 | .select() | 37 | .select() |
38 | // 扫描所有有注解的api,用这种方式更灵活 | 38 | // 扫描所有有注解的api,用这种方式更灵活 |
39 | - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) | 39 | + .apis(RequestHandlerSelectors.basePackage("com.sincere.userSearch.control")) |
40 | .paths(PathSelectors.any()) | 40 | .paths(PathSelectors.any()) |
41 | .build().globalOperationParameters(pars); | 41 | .build().globalOperationParameters(pars); |
42 | 42 |
cloud/user_search/src/main/java/com/sincere/userSearch/controller/UserController.java
1 | package com.sincere.userSearch.controller; | 1 | package com.sincere.userSearch.controller; |
2 | 2 | ||
3 | +import com.sincere.common.exception.ResultException; | ||
4 | +import com.sincere.common.util.TokenUtils; | ||
5 | +import com.sincere.userSearch.model.StudentInfo; | ||
3 | import com.sincere.userSearch.service.UserService; | 6 | import com.sincere.userSearch.service.UserService; |
4 | import com.sincere.userSearch.vo.BaseVo; | 7 | import com.sincere.userSearch.vo.BaseVo; |
5 | import com.sincere.userSearch.vo.UserInfo; | 8 | import com.sincere.userSearch.vo.UserInfo; |
9 | +import com.sincere.userSearch.vo.rep.Info; | ||
6 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; | 10 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; |
11 | +import com.sincere.userSearch.vo.req.UserInfoReqVo; | ||
7 | import com.sincere.userSearch.vo.req.ZnxwReqVo; | 12 | import com.sincere.userSearch.vo.req.ZnxwReqVo; |
8 | import io.swagger.annotations.Api; | 13 | import io.swagger.annotations.Api; |
9 | import io.swagger.annotations.ApiOperation; | 14 | import io.swagger.annotations.ApiOperation; |
10 | import org.springframework.beans.factory.annotation.Autowired; | 15 | import org.springframework.beans.factory.annotation.Autowired; |
11 | import org.springframework.web.bind.annotation.*; | 16 | import org.springframework.web.bind.annotation.*; |
12 | 17 | ||
18 | +import javax.servlet.http.HttpServletRequest; | ||
19 | +import java.util.ArrayList; | ||
20 | +import java.util.List; | ||
21 | + | ||
13 | @RestController | 22 | @RestController |
14 | @RequestMapping("/user") | 23 | @RequestMapping("/user") |
15 | @Api(value = "用户中心") | 24 | @Api(value = "用户中心") |
@@ -23,28 +32,47 @@ public class UserController { | @@ -23,28 +32,47 @@ public class UserController { | ||
23 | */ | 32 | */ |
24 | @ApiOperation("获取智能校卫agentid") | 33 | @ApiOperation("获取智能校卫agentid") |
25 | @RequestMapping(value = "getZNXWWebApp" , method = RequestMethod.POST) | 34 | @RequestMapping(value = "getZNXWWebApp" , method = RequestMethod.POST) |
26 | - public BaseVo<ZnxwRepVo> getZNXWWebApp(@RequestBody ZnxwReqVo znxwReqVo , UserInfo userInfo){ | 35 | + public BaseVo<ZnxwRepVo> getZNXWWebApp(@RequestBody ZnxwReqVo znxwReqVo){ |
27 | BaseVo<ZnxwRepVo> result = new BaseVo<>() ; | 36 | BaseVo<ZnxwRepVo> result = new BaseVo<>() ; |
28 | ZnxwRepVo data = userService.selectAgentId(znxwReqVo) ; | 37 | ZnxwRepVo data = userService.selectAgentId(znxwReqVo) ; |
29 | result.setData(data); | 38 | result.setData(data); |
30 | return result ; | 39 | return result ; |
31 | } | 40 | } |
32 | 41 | ||
33 | - | ||
34 | - public void getUserRole(){ | ||
35 | - | ||
36 | - } | ||
37 | - | ||
38 | /** | 42 | /** |
39 | * 用户类型 0-班主任; 1-任课老师; 2-学生; 3-家长; 10-学校管理员; | 43 | * 用户类型 0-班主任; 1-任课老师; 2-学生; 3-家长; 10-学校管理员; |
40 | */ | 44 | */ |
41 | @ApiOperation("根据userId 获取用户信息") | 45 | @ApiOperation("根据userId 获取用户信息") |
42 | - @RequestMapping(value = "getUserInfo" , method = RequestMethod.GET) | ||
43 | - public String getUserInfo(){ | ||
44 | - return "aa" ; | 46 | + @RequestMapping(value = "getUserInfo" , method = RequestMethod.POST) |
47 | + public BaseVo<Info> getUserInfo(@RequestBody UserInfoReqVo userInfoReqVo , HttpServletRequest request){ | ||
48 | + String userId = getToken(request) ; | ||
49 | + BaseVo<Info> result = new BaseVo<>() ; | ||
50 | + Info info = new Info() ; | ||
51 | + if(userInfoReqVo.getUserType() == 2){ | ||
52 | + //学生 | ||
53 | + List<StudentInfo> studentInfos = new ArrayList<>(); | ||
54 | + studentInfos.add(userService.selectStudentInfo(userId)); | ||
55 | + info.setStudentInfos(studentInfos); | ||
56 | + }else if(userInfoReqVo.getUserType() == 3){ | ||
57 | + //家长 | ||
58 | + info.setParentInfos(userService.selectParentInfo(userId)); | ||
59 | + }else { | ||
60 | + //教师 | ||
61 | + info.setTeacherInfos(userService.selectTeacherInfo(userId)); | ||
62 | + } | ||
63 | + result.setData(info); | ||
64 | + return result ; | ||
45 | } | 65 | } |
46 | 66 | ||
47 | - public void getUserId(){ | ||
48 | 67 | ||
68 | + private String getToken(HttpServletRequest request){ | ||
69 | + String token = request.getHeader("X-Authorization"); | ||
70 | + try{ | ||
71 | + String userId = TokenUtils.validToken(token) ; | ||
72 | + return userId ; | ||
73 | + }catch (ResultException e){ | ||
74 | + System.out.println(e.getMessage()); | ||
75 | + } | ||
76 | + return null ; | ||
49 | } | 77 | } |
50 | } | 78 | } |
cloud/user_search/src/main/java/com/sincere/userSearch/mapper/UserMapper.java
1 | package com.sincere.userSearch.mapper; | 1 | package com.sincere.userSearch.mapper; |
2 | 2 | ||
3 | +import com.sincere.userSearch.model.StudentInfo; | ||
4 | +import com.sincere.userSearch.model.TeacherInfo; | ||
5 | + | ||
6 | +import java.util.List; | ||
7 | + | ||
3 | public interface UserMapper { | 8 | public interface UserMapper { |
9 | + | ||
10 | + List<TeacherInfo> selectTeacherInfo(String userId) ; | ||
11 | + | ||
12 | + StudentInfo selectStudentInfo(String userId) ; | ||
13 | + | ||
14 | + StudentInfo selectParentInfo(int studentId) ; | ||
15 | + | ||
16 | + List<String> selectChildrenId(String userId) ; | ||
4 | } | 17 | } |
cloud/user_search/src/main/java/com/sincere/userSearch/model/StudentInfo.java
0 → 100644
@@ -0,0 +1,141 @@ | @@ -0,0 +1,141 @@ | ||
1 | +package com.sincere.userSearch.model; | ||
2 | + | ||
3 | +public class StudentInfo { | ||
4 | + | ||
5 | + private String userId ; | ||
6 | + private int studentId ; | ||
7 | + private String studentName ; | ||
8 | + private int schoolId ; | ||
9 | + private String schoolName ; | ||
10 | + private String face ; | ||
11 | + private String pass ; | ||
12 | + private String otherName ; | ||
13 | + private String studentCode ; | ||
14 | + private int classId ; | ||
15 | + private String className ; | ||
16 | + | ||
17 | + private String parentUserId ; | ||
18 | + private String parentMobile ; | ||
19 | + private String parentPass ; | ||
20 | + private String parentName ; | ||
21 | + | ||
22 | + public String getUserId() { | ||
23 | + return userId; | ||
24 | + } | ||
25 | + | ||
26 | + public void setUserId(String userId) { | ||
27 | + this.userId = userId; | ||
28 | + } | ||
29 | + | ||
30 | + public int getStudentId() { | ||
31 | + return studentId; | ||
32 | + } | ||
33 | + | ||
34 | + public void setStudentId(int studentId) { | ||
35 | + this.studentId = studentId; | ||
36 | + } | ||
37 | + | ||
38 | + public String getStudentName() { | ||
39 | + return studentName; | ||
40 | + } | ||
41 | + | ||
42 | + public void setStudentName(String studentName) { | ||
43 | + this.studentName = studentName; | ||
44 | + } | ||
45 | + | ||
46 | + public int getSchoolId() { | ||
47 | + return schoolId; | ||
48 | + } | ||
49 | + | ||
50 | + public void setSchoolId(int schoolId) { | ||
51 | + this.schoolId = schoolId; | ||
52 | + } | ||
53 | + | ||
54 | + public String getSchoolName() { | ||
55 | + return schoolName; | ||
56 | + } | ||
57 | + | ||
58 | + public void setSchoolName(String schoolName) { | ||
59 | + this.schoolName = schoolName; | ||
60 | + } | ||
61 | + | ||
62 | + public String getFace() { | ||
63 | + return face; | ||
64 | + } | ||
65 | + | ||
66 | + public void setFace(String face) { | ||
67 | + this.face = face; | ||
68 | + } | ||
69 | + | ||
70 | + public String getPass() { | ||
71 | + return pass; | ||
72 | + } | ||
73 | + | ||
74 | + public void setPass(String pass) { | ||
75 | + this.pass = pass; | ||
76 | + } | ||
77 | + | ||
78 | + public String getOtherName() { | ||
79 | + return otherName; | ||
80 | + } | ||
81 | + | ||
82 | + public void setOtherName(String otherName) { | ||
83 | + this.otherName = otherName; | ||
84 | + } | ||
85 | + | ||
86 | + public String getStudentCode() { | ||
87 | + return studentCode; | ||
88 | + } | ||
89 | + | ||
90 | + public void setStudentCode(String studentCode) { | ||
91 | + this.studentCode = studentCode; | ||
92 | + } | ||
93 | + | ||
94 | + public int getClassId() { | ||
95 | + return classId; | ||
96 | + } | ||
97 | + | ||
98 | + public void setClassId(int classId) { | ||
99 | + this.classId = classId; | ||
100 | + } | ||
101 | + | ||
102 | + public String getClassName() { | ||
103 | + return className; | ||
104 | + } | ||
105 | + | ||
106 | + public void setClassName(String className) { | ||
107 | + this.className = className; | ||
108 | + } | ||
109 | + | ||
110 | + public String getParentUserId() { | ||
111 | + return parentUserId; | ||
112 | + } | ||
113 | + | ||
114 | + public void setParentUserId(String parentUserId) { | ||
115 | + this.parentUserId = parentUserId; | ||
116 | + } | ||
117 | + | ||
118 | + public String getParentMobile() { | ||
119 | + return parentMobile; | ||
120 | + } | ||
121 | + | ||
122 | + public void setParentMobile(String parentMobile) { | ||
123 | + this.parentMobile = parentMobile; | ||
124 | + } | ||
125 | + | ||
126 | + public String getParentPass() { | ||
127 | + return parentPass; | ||
128 | + } | ||
129 | + | ||
130 | + public void setParentPass(String parentPass) { | ||
131 | + this.parentPass = parentPass; | ||
132 | + } | ||
133 | + | ||
134 | + public String getParentName() { | ||
135 | + return parentName; | ||
136 | + } | ||
137 | + | ||
138 | + public void setParentName(String parentName) { | ||
139 | + this.parentName = parentName; | ||
140 | + } | ||
141 | +} |
cloud/user_search/src/main/java/com/sincere/userSearch/model/TeacherClassInfo.java
0 → 100644
@@ -0,0 +1,77 @@ | @@ -0,0 +1,77 @@ | ||
1 | +package com.sincere.userSearch.model; | ||
2 | + | ||
3 | +public class TeacherClassInfo { | ||
4 | + | ||
5 | + private int classId ; | ||
6 | + private String className ; | ||
7 | + private String subjectId ; | ||
8 | + private String subjectName ; | ||
9 | + private int userType ; | ||
10 | + private int teacherId ; | ||
11 | + private String grade ; | ||
12 | + private String gradeName ; | ||
13 | + | ||
14 | + public int getClassId() { | ||
15 | + return classId; | ||
16 | + } | ||
17 | + | ||
18 | + public void setClassId(int classId) { | ||
19 | + this.classId = classId; | ||
20 | + } | ||
21 | + | ||
22 | + public String getClassName() { | ||
23 | + return className; | ||
24 | + } | ||
25 | + | ||
26 | + public void setClassName(String className) { | ||
27 | + this.className = className; | ||
28 | + } | ||
29 | + | ||
30 | + public String getSubjectId() { | ||
31 | + return subjectId; | ||
32 | + } | ||
33 | + | ||
34 | + public void setSubjectId(String subjectId) { | ||
35 | + this.subjectId = subjectId; | ||
36 | + } | ||
37 | + | ||
38 | + public String getSubjectName() { | ||
39 | + return subjectName; | ||
40 | + } | ||
41 | + | ||
42 | + public void setSubjectName(String subjectName) { | ||
43 | + this.subjectName = subjectName; | ||
44 | + } | ||
45 | + | ||
46 | + public int getUserType() { | ||
47 | + return userType; | ||
48 | + } | ||
49 | + | ||
50 | + public void setUserType(int userType) { | ||
51 | + this.userType = userType; | ||
52 | + } | ||
53 | + | ||
54 | + public int getTeacherId() { | ||
55 | + return teacherId; | ||
56 | + } | ||
57 | + | ||
58 | + public void setTeacherId(int teacherId) { | ||
59 | + this.teacherId = teacherId; | ||
60 | + } | ||
61 | + | ||
62 | + public String getGrade() { | ||
63 | + return grade; | ||
64 | + } | ||
65 | + | ||
66 | + public void setGrade(String grade) { | ||
67 | + this.grade = grade; | ||
68 | + } | ||
69 | + | ||
70 | + public String getGradeName() { | ||
71 | + return gradeName; | ||
72 | + } | ||
73 | + | ||
74 | + public void setGradeName(String gradeName) { | ||
75 | + this.gradeName = gradeName; | ||
76 | + } | ||
77 | +} |
cloud/user_search/src/main/java/com/sincere/userSearch/model/TeacherInfo.java
0 → 100644
@@ -0,0 +1,79 @@ | @@ -0,0 +1,79 @@ | ||
1 | +package com.sincere.userSearch.model; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +public class TeacherInfo { | ||
6 | + | ||
7 | + private String userId ; | ||
8 | + private String userName ; | ||
9 | + private String mobile ; | ||
10 | + private int schoolId ; | ||
11 | + private String schoolName ; | ||
12 | + private String face ; | ||
13 | + private String pass ; | ||
14 | + private List<TeacherClassInfo> classInfos ; | ||
15 | + | ||
16 | + public String getUserId() { | ||
17 | + return userId; | ||
18 | + } | ||
19 | + | ||
20 | + public void setUserId(String userId) { | ||
21 | + this.userId = userId; | ||
22 | + } | ||
23 | + | ||
24 | + public String getUserName() { | ||
25 | + return userName; | ||
26 | + } | ||
27 | + | ||
28 | + public void setUserName(String userName) { | ||
29 | + this.userName = userName; | ||
30 | + } | ||
31 | + | ||
32 | + public String getMobile() { | ||
33 | + return mobile; | ||
34 | + } | ||
35 | + | ||
36 | + public void setMobile(String mobile) { | ||
37 | + this.mobile = mobile; | ||
38 | + } | ||
39 | + | ||
40 | + public int getSchoolId() { | ||
41 | + return schoolId; | ||
42 | + } | ||
43 | + | ||
44 | + public void setSchoolId(int schoolId) { | ||
45 | + this.schoolId = schoolId; | ||
46 | + } | ||
47 | + | ||
48 | + public String getSchoolName() { | ||
49 | + return schoolName; | ||
50 | + } | ||
51 | + | ||
52 | + public void setSchoolName(String schoolName) { | ||
53 | + this.schoolName = schoolName; | ||
54 | + } | ||
55 | + | ||
56 | + public String getFace() { | ||
57 | + return face; | ||
58 | + } | ||
59 | + | ||
60 | + public void setFace(String face) { | ||
61 | + this.face = face; | ||
62 | + } | ||
63 | + | ||
64 | + public List<TeacherClassInfo> getClassInfos() { | ||
65 | + return classInfos; | ||
66 | + } | ||
67 | + | ||
68 | + public void setClassInfos(List<TeacherClassInfo> classInfos) { | ||
69 | + this.classInfos = classInfos; | ||
70 | + } | ||
71 | + | ||
72 | + public String getPass() { | ||
73 | + return pass; | ||
74 | + } | ||
75 | + | ||
76 | + public void setPass(String pass) { | ||
77 | + this.pass = pass; | ||
78 | + } | ||
79 | +} |
cloud/user_search/src/main/java/com/sincere/userSearch/service/UserService.java
1 | package com.sincere.userSearch.service; | 1 | package com.sincere.userSearch.service; |
2 | 2 | ||
3 | +import com.sincere.userSearch.model.StudentInfo; | ||
4 | +import com.sincere.userSearch.model.TeacherInfo; | ||
3 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; | 5 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; |
4 | import com.sincere.userSearch.vo.req.ZnxwReqVo; | 6 | import com.sincere.userSearch.vo.req.ZnxwReqVo; |
5 | 7 | ||
8 | +import java.util.List; | ||
9 | + | ||
6 | public interface UserService { | 10 | public interface UserService { |
7 | 11 | ||
8 | ZnxwRepVo selectAgentId(ZnxwReqVo znxwReqVo); | 12 | ZnxwRepVo selectAgentId(ZnxwReqVo znxwReqVo); |
9 | 13 | ||
14 | + List<TeacherInfo> selectTeacherInfo(String userId) ; | ||
15 | + | ||
16 | + StudentInfo selectStudentInfo(String userId) ; | ||
17 | + | ||
18 | + List<StudentInfo> selectParentInfo(String userId) ; | ||
19 | + | ||
10 | } | 20 | } |
cloud/user_search/src/main/java/com/sincere/userSearch/service/impl/UserServiceImpl.java
1 | package com.sincere.userSearch.service.impl; | 1 | package com.sincere.userSearch.service.impl; |
2 | 2 | ||
3 | import com.sincere.userSearch.mapper.QyhApplyMapper; | 3 | import com.sincere.userSearch.mapper.QyhApplyMapper; |
4 | +import com.sincere.userSearch.mapper.UserMapper; | ||
5 | +import com.sincere.userSearch.model.StudentInfo; | ||
6 | +import com.sincere.userSearch.model.TeacherClassInfo; | ||
7 | +import com.sincere.userSearch.model.TeacherInfo; | ||
4 | import com.sincere.userSearch.service.UserService; | 8 | import com.sincere.userSearch.service.UserService; |
5 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; | 9 | import com.sincere.userSearch.vo.rep.ZnxwRepVo; |
6 | import com.sincere.userSearch.vo.req.ZnxwReqVo; | 10 | import com.sincere.userSearch.vo.req.ZnxwReqVo; |
7 | import org.springframework.beans.factory.annotation.Autowired; | 11 | import org.springframework.beans.factory.annotation.Autowired; |
8 | import org.springframework.stereotype.Service; | 12 | import org.springframework.stereotype.Service; |
9 | 13 | ||
14 | +import java.util.ArrayList; | ||
15 | +import java.util.List; | ||
16 | + | ||
10 | @Service | 17 | @Service |
11 | public class UserServiceImpl implements UserService { | 18 | public class UserServiceImpl implements UserService { |
12 | 19 | ||
13 | @Autowired | 20 | @Autowired |
14 | QyhApplyMapper qyhApplyMapper ; | 21 | QyhApplyMapper qyhApplyMapper ; |
15 | 22 | ||
23 | + @Autowired | ||
24 | + UserMapper userMapper ; | ||
25 | + | ||
16 | @Override | 26 | @Override |
17 | public ZnxwRepVo selectAgentId(ZnxwReqVo znxwReqVo) { | 27 | public ZnxwRepVo selectAgentId(ZnxwReqVo znxwReqVo) { |
18 | return qyhApplyMapper.selectAgentId(znxwReqVo); | 28 | return qyhApplyMapper.selectAgentId(znxwReqVo); |
19 | } | 29 | } |
30 | + | ||
31 | + @Override | ||
32 | + public List<TeacherInfo> selectTeacherInfo(String userId) { | ||
33 | + List<TeacherInfo> teacherInfos = userMapper.selectTeacherInfo(userId); | ||
34 | + for(TeacherInfo teacherInfo : teacherInfos ){ | ||
35 | + List<TeacherClassInfo> teacherClassInfos = new ArrayList<>() ; | ||
36 | + for(TeacherClassInfo classInfo : teacherInfo.getClassInfos()){ | ||
37 | + if(classInfo.getClassId() != 0){ | ||
38 | + teacherClassInfos.add(classInfo); | ||
39 | + } | ||
40 | + } | ||
41 | + teacherInfo.setClassInfos(teacherClassInfos); | ||
42 | + } | ||
43 | + return teacherInfos ; | ||
44 | + } | ||
45 | + | ||
46 | + @Override | ||
47 | + public StudentInfo selectStudentInfo(String userId) { | ||
48 | + StudentInfo studentInfo = userMapper.selectStudentInfo(userId); | ||
49 | + if(studentInfo != null){ | ||
50 | + StudentInfo parent = userMapper.selectParentInfo(studentInfo.getStudentId()) ; | ||
51 | + studentInfo.setParentMobile(parent.getParentMobile()); | ||
52 | + studentInfo.setParentName(parent.getParentName()); | ||
53 | + studentInfo.setParentPass(parent.getParentPass()); | ||
54 | + studentInfo.setParentUserId(parent.getParentUserId()); | ||
55 | + return studentInfo ; | ||
56 | + } | ||
57 | + return null ; | ||
58 | + } | ||
59 | + | ||
60 | + @Override | ||
61 | + public List<StudentInfo> selectParentInfo(String userId) { | ||
62 | + List<String> children = userMapper.selectChildrenId(userId) ; | ||
63 | + List<StudentInfo> patentInfo = new ArrayList<>(); | ||
64 | + for(String child : children){ | ||
65 | + StudentInfo studentInfo = selectStudentInfo(child); | ||
66 | + if(studentInfo != null){ | ||
67 | + patentInfo.add(studentInfo); | ||
68 | + } | ||
69 | + } | ||
70 | + return patentInfo; | ||
71 | + } | ||
20 | } | 72 | } |
cloud/user_search/src/main/java/com/sincere/userSearch/vo/rep/Info.java
0 → 100644
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +package com.sincere.userSearch.vo.rep; | ||
2 | + | ||
3 | +import com.sincere.userSearch.model.StudentInfo; | ||
4 | +import com.sincere.userSearch.model.TeacherInfo; | ||
5 | + | ||
6 | +import java.util.List; | ||
7 | + | ||
8 | +public class Info { | ||
9 | + | ||
10 | + private List<TeacherInfo> teacherInfos ; | ||
11 | + private List<StudentInfo> parentInfos ; | ||
12 | + private List<StudentInfo> studentInfos ; | ||
13 | + | ||
14 | + public List<TeacherInfo> getTeacherInfos() { | ||
15 | + return teacherInfos; | ||
16 | + } | ||
17 | + | ||
18 | + public void setTeacherInfos(List<TeacherInfo> teacherInfos) { | ||
19 | + this.teacherInfos = teacherInfos; | ||
20 | + } | ||
21 | + | ||
22 | + public List<StudentInfo> getParentInfos() { | ||
23 | + return parentInfos; | ||
24 | + } | ||
25 | + | ||
26 | + public void setParentInfos(List<StudentInfo> parentInfos) { | ||
27 | + this.parentInfos = parentInfos; | ||
28 | + } | ||
29 | + | ||
30 | + public List<StudentInfo> getStudentInfos() { | ||
31 | + return studentInfos; | ||
32 | + } | ||
33 | + | ||
34 | + public void setStudentInfos(List<StudentInfo> studentInfos) { | ||
35 | + this.studentInfos = studentInfos; | ||
36 | + } | ||
37 | +} |
cloud/user_search/src/main/java/com/sincere/userSearch/vo/req/UserInfoReqVo.java
0 → 100644
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +package com.sincere.userSearch.vo.req; | ||
2 | + | ||
3 | +public class UserInfoReqVo { | ||
4 | + private int userType ; // 2:学生;3:家长;其他都是老师 | ||
5 | + | ||
6 | + public int getUserType() { | ||
7 | + return userType; | ||
8 | + } | ||
9 | + | ||
10 | + public void setUserType(int userType) { | ||
11 | + this.userType = userType; | ||
12 | + } | ||
13 | +} |
cloud/user_search/src/main/resources/application.yaml
@@ -12,7 +12,7 @@ spring: | @@ -12,7 +12,7 @@ spring: | ||
12 | ##mybatis | 12 | ##mybatis |
13 | mybatis: | 13 | mybatis: |
14 | mapper-locations: classpath:mapper/*.xml | 14 | mapper-locations: classpath:mapper/*.xml |
15 | - type-aliases-package: com.sincere.quartz.mapper | 15 | + type-aliases-package: com.sincere.userSearch.mapper |
16 | check-config-location: true | 16 | check-config-location: true |
17 | ribbon: | 17 | ribbon: |
18 | ReadTimeout: 50000 | 18 | ReadTimeout: 50000 |
cloud/user_search/src/main/resources/mapper/UserMapper.xml
@@ -2,13 +2,75 @@ | @@ -2,13 +2,75 @@ | ||
2 | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | 2 | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
3 | <mapper namespace="com.sincere.userSearch.mapper.UserMapper"> | 3 | <mapper namespace="com.sincere.userSearch.mapper.UserMapper"> |
4 | 4 | ||
5 | - <resultMap id="ZnxwMap" type="com.sincere.userSearch.vo.rep.ZnxwRepVo"> | ||
6 | - <result column="AgentId" property="agentId" /> | ||
7 | - <result column="school_name" property="schoolName" /> | 5 | + <resultMap id="TeacherInfo" type="com.sincere.userSearch.model.TeacherInfo"> |
6 | + <result column="user_id" property="userId"/> | ||
7 | + <result column="name" property="userName"/> | ||
8 | + <result column="mobile" property="mobile"/> | ||
9 | + <result column="face" property="face"/> | ||
10 | + <result column="pass" property="pass"/> | ||
11 | + <result column="schoolid" property="schoolId"/> | ||
12 | + <result column="schoolname" property="schoolName"/> | ||
13 | + <collection property="classInfos" ofType="com.sincere.userSearch.model.TeacherClassInfo"> | ||
14 | + <result column="classid" property="classId"/> | ||
15 | + <result column="classname" property="className"/> | ||
16 | + <result column="subjectid" property="subjectId"/> | ||
17 | + <result column="subjectname" property="subjectName"/> | ||
18 | + <result column="usertype" property="userType"/> | ||
19 | + <result column="TeacherId" property="teacherId"/> | ||
20 | + <result column="grade" property="grade"/> | ||
21 | + <result column="gradename" property="gradeName"/> | ||
22 | + </collection> | ||
8 | </resultMap> | 23 | </resultMap> |
9 | - <select id="selectAgentId" parameterType="com.sincere.userSearch.vo.req.ZnxwReqVo" resultMap="ZnxwMap"> | ||
10 | - SELECT EM_QYHApply.AgentId , SZ_School.school_name FROM EM_QYHApply join SZ_School on EM_QYHApply.SchoolId = SZ_School.school_id | ||
11 | - where EM_QYHApply.SchoolId = #{schoolId} and EM_QYHApply.Type = #{type} and EM_QYHApply.ApplyName = '智能校卫' | 24 | + <select id="selectTeacherInfo" parameterType="java.lang.String" resultMap="TeacherInfo"> |
25 | + SELECT u.user_id , u.name , u.mobile , u.face , u.pass, s.school_id AS schoolid, s.numType, s.school_name AS schoolname,s.school_area as schoolArea, | ||
26 | + c.class_id AS classid, c.class_name AS classname, | ||
27 | + sj.subject_id AS subjectid, sj.subject_name AS subjectname, sj.subId as SysSubjectId, | ||
28 | + ur.usertype, ur.customerId AS TeacherId,c.grade AS grade,(SELECT grade FROM dbo.SZ_Grade WHERE id=c.grade) gradename | ||
29 | + FROM dbo.SZ_UserRole ur | ||
30 | + join sz_user u on ur.user_id = u.user_id | ||
31 | + INNER JOIN dbo.SZ_School s ON s.school_id = ur.school_id AND ur.isconfirm=1 | ||
32 | + LEFT JOIN dbo.SZ_Class c ON (c.state=1 AND ur.school_id = c.school_id AND c.class_id=ur.class_id AND c.is_finish=0) | ||
33 | + LEFT JOIN dbo.SZ_Subject sj ON sj.subject_id=ur.subject_id | ||
34 | + WHERE ur.usertype not in (2,3,33,34) AND ur.state=1 AND ur.user_id=#{userId} order by ur.class_id desc | ||
12 | </select> | 35 | </select> |
13 | 36 | ||
37 | + | ||
38 | + <resultMap id="StudentInfo" type="com.sincere.userSearch.model.StudentInfo"> | ||
39 | + <result column="user_id" property="userId"/> | ||
40 | + <result column="student_id" property="studentId"/> | ||
41 | + <result column="name" property="studentName"/> | ||
42 | + <result column="school_id" property="schoolId"/> | ||
43 | + <result column="school_name" property="schoolName"/> | ||
44 | + <result column="photo" property="face"/> | ||
45 | + <result column="pass" property="pass"/> | ||
46 | + <result column="othername" property="otherName"/> | ||
47 | + <result column="studentcode" property="studentCode"/> | ||
48 | + <result column="class_id" property="classId"/> | ||
49 | + <result column="class_name" property="className"/> | ||
50 | + </resultMap> | ||
51 | + <select id="selectStudentInfo" parameterType="java.lang.String" resultMap="StudentInfo"> | ||
52 | + select sz_v_school_student.* , sz_school.school_name from sz_v_school_student join sz_school | ||
53 | + on sz_v_school_student.school_id = sz_school.school_id where user_id = #{userId} | ||
54 | + </select> | ||
55 | + | ||
56 | + | ||
57 | + <resultMap id="ParentInfo" type="com.sincere.userSearch.model.StudentInfo"> | ||
58 | + <result column="user_id" property="parentUserId"/> | ||
59 | + <result column="mobile" property="parentMobile"/> | ||
60 | + <result column="name" property="parentName"/> | ||
61 | + <result column="pass" property="parentPass"/> | ||
62 | + </resultMap> | ||
63 | + <select id="selectParentInfo" parameterType="java.lang.Integer" resultMap="ParentInfo"> | ||
64 | + select sz_user.user_id , sz_user.name ,sz_user.pass ,sz_user.mobile from sz_user where user_id = ( | ||
65 | + select user_id from sz_userRole where customerid = | ||
66 | + (select parent_id from SZ_SPRole where student_id = #{studentId})) | ||
67 | + </select> | ||
68 | + | ||
69 | + | ||
70 | + | ||
71 | + <select id="selectChildrenId" parameterType="java.lang.String" resultType="java.lang.String"> | ||
72 | + select user_id from SZ_UserRole where state = 1 and CustomerId in ( | ||
73 | + select student_id from SZ_SPRole where parent_id in ( | ||
74 | + select DISTINCT customerId from SZ_UserRole where user_id = #{userId} and UserType = 3)) | ||
75 | + </select> | ||
14 | </mapper> | 76 | </mapper> |