Skip to content

Commit e31ddae

Browse files
committed
init
1 parent c5f6ef4 commit e31ddae

32 files changed

+1293
-0
lines changed

.gitignore

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
HELP.md
2+
target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
!**/src/main/**
5+
!**/src/test/**
6+
7+
### STS ###
8+
.apt_generated
9+
.classpath
10+
.factorypath
11+
.project
12+
.settings
13+
.springBeans
14+
.sts4-cache
15+
16+
### IntelliJ IDEA ###
17+
.idea
18+
*.iws
19+
*.iml
20+
*.ipr
21+
22+
### NetBeans ###
23+
/nbproject/private/
24+
/nbbuild/
25+
/dist/
26+
/nbdist/
27+
/.nb-gradle/
28+
build/
29+
30+
### VS Code ###
31+
.vscode/
32+
/.mvn/
33+
/mvnw
34+
/mvnw.cmd

pom.xml

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.1.6.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>com.crudapp</groupId>
12+
<artifactId>crudapp</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>demo</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
</properties>
20+
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-devtools</artifactId>
29+
<scope>runtime</scope>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-starter-websocket</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.springframework.boot</groupId>
37+
<artifactId>spring-boot-starter-amqp</artifactId>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.springframework.security.oauth</groupId>
41+
<artifactId>spring-security-oauth2</artifactId>
42+
<version>2.2.0.RELEASE</version>
43+
</dependency>
44+
<dependency>
45+
<groupId>io.jsonwebtoken</groupId>
46+
<artifactId>jjwt</artifactId>
47+
<version>0.9.1</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.springframework.boot</groupId>
51+
<artifactId>spring-boot-starter-security</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.springframework.boot</groupId>
55+
<artifactId>spring-boot-starter-reactor-netty</artifactId>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.springframework.boot</groupId>
59+
<artifactId>spring-boot-starter-data-rest</artifactId>
60+
</dependency>
61+
<dependency>
62+
<groupId>org.springframework.boot</groupId>
63+
<artifactId>spring-boot-starter-hateoas</artifactId>
64+
</dependency>
65+
<dependency>
66+
<groupId>com.fasterxml.jackson.datatype</groupId>
67+
<artifactId>jackson-datatype-jsr310</artifactId>
68+
</dependency>
69+
<dependency>
70+
<groupId>io.springfox</groupId>
71+
<artifactId>springfox-swagger2</artifactId>
72+
<version>2.7.0</version>
73+
</dependency>
74+
<dependency>
75+
<groupId>org.projectlombok</groupId>
76+
<artifactId>lombok</artifactId>
77+
<version>1.18.4</version>
78+
<scope>provided</scope>
79+
</dependency>
80+
<dependency>
81+
<groupId>io.springfox</groupId>
82+
<artifactId>springfox-swagger-ui</artifactId>
83+
<version>2.7.0</version>
84+
</dependency>
85+
<dependency>
86+
<groupId>org.springframework.boot</groupId>
87+
<artifactId>spring-boot-starter-actuator</artifactId>
88+
</dependency>
89+
<dependency>
90+
<groupId>org.hibernate</groupId>
91+
<artifactId>hibernate-java8</artifactId>
92+
</dependency>
93+
<dependency>
94+
<groupId>org.springframework.boot</groupId>
95+
<artifactId>spring-boot-starter-data-jpa</artifactId>
96+
</dependency>
97+
<dependency>
98+
<groupId>org.springframework.boot</groupId>
99+
<artifactId>spring-boot-starter-data-redis</artifactId>
100+
</dependency>
101+
<dependency>
102+
<groupId>mysql</groupId>
103+
<artifactId>mysql-connector-java</artifactId>
104+
<scope>runtime</scope>
105+
</dependency>
106+
<dependency>
107+
<groupId>redis.clients</groupId>
108+
<artifactId>jedis</artifactId>
109+
</dependency>
110+
<dependency>
111+
<groupId>org.springframework.boot</groupId>
112+
<artifactId>spring-boot-starter-websocket</artifactId>
113+
</dependency>
114+
115+
<dependency>
116+
<groupId>org.springframework.boot</groupId>
117+
<artifactId>spring-boot-starter-test</artifactId>
118+
<scope>test</scope>
119+
</dependency>
120+
<dependency>
121+
<groupId>org.springframework.security</groupId>
122+
<artifactId>spring-security-test</artifactId>
123+
<scope>test</scope>
124+
</dependency>
125+
<dependency>
126+
<groupId>junit</groupId>
127+
<artifactId>junit</artifactId>
128+
</dependency>
129+
</dependencies>
130+
131+
<build>
132+
<plugins>
133+
<plugin>
134+
<groupId>org.springframework.boot</groupId>
135+
<artifactId>spring-boot-maven-plugin</artifactId>
136+
</plugin>
137+
</plugins>
138+
</build>
139+
140+
</project>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.app.crud;
2+
3+
import com.app.crud.entity.User;
4+
import com.app.crud.repository.UserRepository;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.CommandLineRunner;
8+
import org.springframework.security.crypto.password.PasswordEncoder;
9+
import org.springframework.stereotype.Component;
10+
11+
import java.util.Arrays;
12+
13+
@Component
14+
@Slf4j
15+
public class DataInitializer implements CommandLineRunner {
16+
//...
17+
@Autowired
18+
UserRepository users;
19+
@Autowired
20+
PasswordEncoder passwordEncoder;
21+
@Override
22+
public void run(String... args) throws Exception {
23+
//...
24+
this.users.save(User.builder()
25+
.username("user")
26+
.name("simple user")
27+
.password(this.passwordEncoder.encode("password"))
28+
.roles(Arrays.asList( "ROLE_USER"))
29+
.build()
30+
);
31+
this.users.save(User.builder()
32+
.username("admin")
33+
.name("simple admin")
34+
.password(this.passwordEncoder.encode("password"))
35+
.roles(Arrays.asList("ROLE_USER", "ROLE_ADMIN"))
36+
.build()
37+
);
38+
log.debug("printing all users...");
39+
this.users.findAll().forEach(v -> log.debug(" User :" + v.toString()));
40+
}
41+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.app.crud;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
7+
import org.springframework.security.crypto.password.PasswordEncoder;
8+
9+
@SpringBootApplication
10+
public class DemoApplication {
11+
12+
public static void main(String[] args) {
13+
SpringApplication.run(DemoApplication.class, args);
14+
}
15+
16+
17+
@Bean
18+
public PasswordEncoder passwordEncoder() {
19+
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
20+
}
21+
22+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.app.crud.config;
2+
3+
import org.springframework.boot.autoconfigure.domain.EntityScan;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;
6+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
7+
8+
@Configuration
9+
@EnableJpaRepositories("com.app.crud.repository")
10+
@EntityScan(basePackageClasses = {Jsr310JpaConverters.class}, basePackages = {"com.app.crud.entity"})
11+
public class JpaConfig {
12+
13+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.app.crud.config;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.data.redis.connection.RedisConnectionFactory;
6+
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
7+
import org.springframework.data.redis.core.RedisTemplate;
8+
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
9+
import org.springframework.data.redis.serializer.StringRedisSerializer;
10+
import redis.clients.jedis.JedisPoolConfig;
11+
12+
13+
@Configuration
14+
public class RedisConfig {
15+
16+
@Bean
17+
public RedisConnectionFactory redisConnectionFactory() {
18+
final JedisPoolConfig poolConfig = new JedisPoolConfig();
19+
poolConfig.setMaxTotal(5);
20+
poolConfig.setTestOnBorrow(true);
21+
poolConfig.setTestOnReturn(true);
22+
23+
final JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
24+
connectionFactory.setUsePool(true);
25+
connectionFactory.setHostName("localhost");
26+
connectionFactory.setPort(6379);
27+
return connectionFactory;
28+
}
29+
30+
@Bean
31+
public RedisTemplate<?, ?> redisTemplate() {
32+
final RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
33+
redisTemplate.setConnectionFactory(redisConnectionFactory());
34+
redisTemplate.setEnableTransactionSupport(true);
35+
redisTemplate.setKeySerializer(new StringRedisSerializer());
36+
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
37+
return redisTemplate;
38+
}
39+
40+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.app.crud.config;
2+
3+
import com.app.crud.security.JwtConfigurer;
4+
import com.app.crud.security.JwtTokenProvider;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.http.HttpMethod;
9+
import org.springframework.security.authentication.AuthenticationManager;
10+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
11+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
12+
import org.springframework.security.config.http.SessionCreationPolicy;
13+
14+
@Configuration
15+
public class SecurityConfig extends WebSecurityConfigurerAdapter {
16+
17+
18+
@Autowired
19+
JwtTokenProvider jwtTokenProvider;
20+
@Bean
21+
@Override
22+
public AuthenticationManager authenticationManagerBean() throws Exception {
23+
return super.authenticationManagerBean();
24+
}
25+
@Override
26+
protected void configure(HttpSecurity http) throws Exception {
27+
//@formatter:off
28+
http
29+
.httpBasic().disable()
30+
.csrf().disable()
31+
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
32+
.and()
33+
.authorizeRequests()
34+
.antMatchers("/auth/signin").permitAll()
35+
.antMatchers(HttpMethod.POST, "/api/users/**").hasRole("ADMIN")
36+
.antMatchers(HttpMethod.PUT, "/api/users/**").hasRole("ADMIN")
37+
.antMatchers(HttpMethod.DELETE, "/api/users/**").hasRole("ADMIN")
38+
.antMatchers(HttpMethod.GET, "/api/users/**").permitAll()
39+
.anyRequest().authenticated()
40+
.and()
41+
.apply(new JwtConfigurer(jwtTokenProvider));
42+
//@formatter:on
43+
}
44+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.app.crud.config;
2+
3+
import com.google.common.base.Predicates;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.ComponentScan;
6+
import org.springframework.context.annotation.Configuration;
7+
import springfox.documentation.builders.ApiInfoBuilder;
8+
import springfox.documentation.builders.PathSelectors;
9+
import springfox.documentation.builders.RequestHandlerSelectors;
10+
import springfox.documentation.service.ApiInfo;
11+
import springfox.documentation.spi.DocumentationType;
12+
import springfox.documentation.spring.web.plugins.Docket;
13+
import springfox.documentation.swagger2.annotations.EnableSwagger2;
14+
15+
@Configuration
16+
@EnableSwagger2
17+
@ComponentScan("com.app.crud.controller")
18+
public class SwaggerConfig {
19+
@Bean
20+
public Docket api() {
21+
return new Docket(DocumentationType.SWAGGER_2)
22+
.select()
23+
.apis(RequestHandlerSelectors.any())
24+
.paths(Predicates.not(PathSelectors.regex("/error")))
25+
.build()
26+
.apiInfo(apiInfo());
27+
}
28+
29+
30+
private ApiInfo apiInfo() {
31+
return new ApiInfoBuilder()
32+
.title("Crud Application")
33+
.description("This app is built using Spring boot, redis, MySQL and RabbitMQ")
34+
.termsOfServiceUrl("github")
35+
.license("MIT")
36+
.licenseUrl("")
37+
.version("1.0")
38+
.build();
39+
}
40+
41+
}

0 commit comments

Comments
 (0)