filter order fix

This commit is contained in:
liquidjoo
2019-07-12 17:02:35 +09:00
parent 93452cfeb1
commit f3700246c0
37 changed files with 590 additions and 347 deletions

View File

@@ -8,7 +8,7 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.E
import java.util.Date;
@SpringBootApplication
@EnableResourceServer
//@EnableResourceServer
public class AuthorizationServerApplication {
public static void main(String[] args) {

View File

@@ -29,11 +29,13 @@ dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-oauth2'
// implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.5.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.google.code.gson:gson'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
// runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

View File

@@ -2,9 +2,11 @@ package io.bluemoon.authorizationserver2.config;
import io.bluemoon.authorizationserver2.service.user.CustomUserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
@@ -31,6 +33,7 @@ public class AuthorizationServer2Config extends AuthorizationServerConfigurerAda
private ClientDetailsService clientDetailsService;
private AuthenticationManager authenticationManager;
private DataSource dataSource;
private CustomUserDetailsServiceImpl customUserDetailsService;

View File

@@ -4,23 +4,24 @@ import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
@Configuration
//@Order(SecurityProperties.BASIC_AUTH_ORDER)
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
// .requestMatchers().antMatchers("/createOAuthUser")
// .and()
.authorizeRequests()
.antMatchers("/createOAuthUser").permitAll()
.antMatchers("/createToken").permitAll()
// .antMatchers("/oauth/token").permitAll()
.antMatchers("/signIn").permitAll()
.antMatchers("/signUp").permitAll()
.antMatchers("/signInMiddleWare").permitAll()
.antMatchers("/signUpMiddleWare").permitAll()
.antMatchers("/projectCreateMiddleWare").permitAll()
.anyRequest()
.authenticated();
}

View File

@@ -0,0 +1,17 @@
package io.bluemoon.authorizationserver2.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
@Configuration
public class WebMvcConfig2 implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/signIn").setViewName("signIn");
registry.addViewController("/signUp").setViewName("signUp");
}
}

View File

@@ -1,9 +1,9 @@
package io.bluemoon.authorizationserver2.config;
import io.bluemoon.authorizationserver2.service.user.CustomUserDetailsServiceImpl;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@@ -11,25 +11,19 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AnyRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
@Configuration
@EnableWebSecurity
public class WebSecurity2Config extends WebSecurityConfigurerAdapter {
private CustomUserDetailsServiceImpl customUserDetailsService;
private PasswordEncoder passwordEncoder;
// private PasswordEncoder passwordEncoder;
public WebSecurity2Config(
CustomUserDetailsServiceImpl customUserDetailsService,
PasswordEncoder passwordEncoder
CustomUserDetailsServiceImpl customUserDetailsService
) {
this.customUserDetailsService = customUserDetailsService;
this.passwordEncoder = passwordEncoder;
}
@Bean
@@ -43,19 +37,37 @@ public class WebSecurity2Config extends WebSecurityConfigurerAdapter {
auth.authenticationProvider(daoAuthenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/oauth/token").permitAll()
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable()
.and()
.exceptionHandling();
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(customUserDetailsService);
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
return daoAuthenticationProvider;
}
// 패스워드 인코딩 수정
// @Bean
// public static PasswordEncoder passwordEncoder() {
// return new BCryptPasswordEncoder();
// @SuppressWarnings("deprecation")
// public static NoOpPasswordEncoder passwordEncoder() {
// return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
// }
@Bean
public static PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

View File

@@ -1,59 +1,65 @@
package io.bluemoon.authorizationserver2.controller;
import io.bluemoon.authorizationserver2.domain.user.User;
import io.bluemoon.authorizationserver2.service.user.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.Errors;
import io.bluemoon.authorizationserver2.domain.client.OAuthClientDetails;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUser;
import io.bluemoon.authorizationserver2.service.user.OAuthUserService;
import io.bluemoon.authorizationserver2.utils.APIRequest;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.security.Principal;
import java.util.Map;
@RestController
public class AuthController {
private UserService userService;
private OAuthUserService oAuthUserService;
public AuthController(
UserService userService
OAuthUserService oAuthUserService
) {
this.userService = userService;
this.oAuthUserService = oAuthUserService;
}
@RequestMapping(value = "/user")
public Principal getUser(Principal user) {
return user;
}
@RequestMapping(value = "/createOAuthUser", method = RequestMethod.POST)
public User createOAuthUser(@RequestBody @NotNull User user, @RequestHeader Map header, Errors errors) {
System.out.println(errors.toString());
System.out.println(user);
System.out.println(header);
@PostMapping("/signInMiddleWare")
public String signInMiddleWare(HttpServletRequest request) throws IOException {
OAuthUser user = requestToUser(request);
return userService.createOAuthUser(user);
return oAuthUserService.readUser(user);
}
@RequestMapping(value = "/createToken", method = RequestMethod.POST)
public String createToken(@RequestBody User user, @RequestHeader Map header) throws IOException {
return userService.createOAuthToken(user);
@PostMapping("/signUpMiddleWare")
public OAuthUser signUpMiddleWare(HttpServletRequest request) {
OAuthUser user = requestToUser(request);
return oAuthUserService.createUser(user);
}
@PutMapping(value = "/updateOAuthUser")
public User updateOAuthUser(@RequestBody User user, @RequestHeader Map header) {
System.out.println(user);
System.out.println(header);
@PostMapping("/projectCreateMiddleWare")
public OAuthClientDetails proejctCreateMiddleWare(HttpServletRequest request) {
OAuthClientDetails authClientDetails = new OAuthClientDetails();
authClientDetails.setClientId(request.getParameter("client_id"));
authClientDetails.setClientSecret(request.getParameter("client_secret"));
return oAuthUserService.createProject(authClientDetails);
}
private OAuthUser requestToUser(HttpServletRequest request) {
OAuthUser user = new OAuthUser();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
return user;
}
}

View File

@@ -0,0 +1,49 @@
package io.bluemoon.authorizationserver2.domain.client;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Entity
@Table(name = "oauth_client_details")
public class OAuthClientDetails {
@Id
@Column
private String clientId;
@Column
private String resourceIds;
@Column
private String clientSecret;
@Column
private String scope;
@Column
private String authorizedGrantTypes;
@Column
private String webServerRedirectUri;
@Column
private String authorities;
@Column
private Integer accessTokenValidity;
@Column
private Integer refreshTokenValidity;
@Column
private String additionalInformation;
@Column
private String autoApprove;
}

View File

@@ -0,0 +1,10 @@
package io.bluemoon.authorizationserver2.domain.client;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface OAuthClientDetailsRepository extends JpaRepository<OAuthClientDetails, String> {
Optional<OAuthClientDetails> findByClientId(String clientId);
}

View File

@@ -0,0 +1,42 @@
package io.bluemoon.authorizationserver2.domain.oauth;
import lombok.Data;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Collection;
@Data
@Entity
@Table(name = "oauth_user")
public class OAuthUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String username;
@Column
private String password;
@Column
private String name;
@Column
private String status;
@Column
private String reSellerId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "oAuthUser", fetch = FetchType.EAGER)
private Collection<OAuthUserRole> userRole;
@Column
private LocalDateTime createdAt;
@Column
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,11 @@
package io.bluemoon.authorizationserver2.domain.oauth;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface OAuthUserRepository extends JpaRepository<OAuthUser, Integer> {
Optional<OAuthUser> findByUsername(String username);
}

View File

@@ -0,0 +1,34 @@
package io.bluemoon.authorizationserver2.domain.oauth;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@ToString(exclude = "oAuthUser")
@Table(name = "oauth_user_role")
public class OAuthUserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String role;
@Column
private String resourceIds;
@ManyToOne(optional = false)
@JoinColumn(name = "userId")
private OAuthUser oAuthUser;
@Column
private LocalDateTime createdAt;
@Column
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,9 @@
package io.bluemoon.authorizationserver2.domain.oauth;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface OAuthUserRoleRepository extends JpaRepository<OAuthUserRole, Integer> {
List<OAuthUserRole> findByOAuthUser(OAuthUser user);
}

View File

@@ -1,5 +1,6 @@
package io.bluemoon.authorizationserver2.domain.user;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUser;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -13,16 +14,16 @@ import java.util.List;
public class CustomUserDetails implements UserDetails {
private static final long serialVersionUID = 6396079419309274853L;
private Long id;
private Integer id;
private String username;
private String password;
private List<String> userRole;
public CustomUserDetails(User user, List<String> userRole) {
public CustomUserDetails(OAuthUser user, List<String> userRoles) {
this.id = user.getId();
this.username = user.getUsername();
this.password = user.getPassword();
this.userRole = userRole;
this.userRole = userRoles;
}
@Override

View File

@@ -1,63 +0,0 @@
package io.bluemoon.authorizationserver2.domain.user;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Collection;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private String password;
@Column
private String email;
@Column
private String principal;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
private Collection<UserRole> userRole;
@Column
private LocalDateTime createdAt;
@Column
private LocalDateTime updatedAt;
// //1:수퍼관리자, 2:관리자, 3:사용자
// @Column
// private String userType;
// @Column
// @Temporal(TemporalType.TIMESTAMP)
// private Date regDate = new Date();
@Builder
public User(String username, String name, String password, String email, String principal, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.username = username;
this.name = name;
this.password = password;
this.email = email;
this.principal = principal;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
}

View File

@@ -1,11 +0,0 @@
package io.bluemoon.authorizationserver2.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
// User findByUsername(String username);
User findByEmail(String email);
Optional<User> findByUsername(String username);
}

View File

@@ -1,30 +0,0 @@
package io.bluemoon.authorizationserver2.domain.user;
import lombok.*;
import javax.persistence.*;
@Getter
@Setter
@Entity
@ToString(exclude = "user")
@NoArgsConstructor
@AllArgsConstructor
public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String role;
@ManyToOne(optional = false)
@JoinColumn(name = "userId")
private User user;
@Builder
public UserRole(User user, String role) {
this.user = user;
this.role = role;
}
}

View File

@@ -1,10 +0,0 @@
package io.bluemoon.authorizationserver2.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRoleRepository extends JpaRepository<UserRole, Integer> {
List<UserRole> findByUser(User user);
}

View File

@@ -1,5 +1,9 @@
package io.bluemoon.authorizationserver2.service.user;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUser;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUserRepository;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUserRole;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUserRoleRepository;
import io.bluemoon.authorizationserver2.domain.user.*;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -8,42 +12,44 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
public class CustomUserDetailsServiceImpl implements UserDetailsService {
// User Info
private UserRepository userRepository;
private UserRoleRepository userRoleRepository;
private OAuthUserRepository oAuthUserRepository;
private OAuthUserRoleRepository oAuthUserRoleRepository;
public CustomUserDetailsServiceImpl(
UserRepository userRepository,
UserRoleRepository userRoleRepository
OAuthUserRepository oAuthUserRepository,
OAuthUserRoleRepository oAuthUserRoleRepository
) {
this.userRepository = userRepository;
this.userRoleRepository = userRoleRepository;
this.oAuthUserRepository = oAuthUserRepository;
this.oAuthUserRoleRepository = oAuthUserRoleRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("why?????????????"+username);
User user = userRepository.findByUsername(username).get();
System.out.println(user);
List<UserRole> userRole = userRoleRepository.findByUser(user);
System.out.println(userRole);
System.out.println("---------------------------");
List<String> urs = new ArrayList<>();
for (UserRole ur : userRole) {
urs.add(ur.getRole());
}
Optional<OAuthUser> user = oAuthUserRepository.findByUsername(username);
if (user.isPresent()) {
System.out.println(user);
List<OAuthUserRole> userRoles = oAuthUserRoleRepository.findByOAuthUser(user.get());
System.out.println(userRoles);
System.out.println("---------------------------");
List<String> urs = new ArrayList<>();
for (OAuthUserRole ur : userRoles) {
urs.add(ur.getRole());
}
if (user == null) {
CustomUserDetails userDetail = new CustomUserDetails(user.get(), urs);
return userDetail;
} else {
throw new UsernameNotFoundException("UsernameNotFound[" + username + "]");
}
CustomUserDetails userDetail = new CustomUserDetails(user, urs);
System.out.println(userDetail);
return userDetail;
}
/**

View File

@@ -0,0 +1,16 @@
package io.bluemoon.authorizationserver2.service.user;
import io.bluemoon.authorizationserver2.domain.client.OAuthClientDetails;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUser;
import io.bluemoon.authorizationserver2.utils.APIRequest;
import java.io.IOException;
public interface OAuthUserService {
OAuthUser createUser(OAuthUser user);
String readUser(OAuthUser user) throws IOException;
OAuthClientDetails createProject(OAuthClientDetails clientDetails);
}

View File

@@ -0,0 +1,93 @@
package io.bluemoon.authorizationserver2.service.user;
import io.bluemoon.authorizationserver2.domain.client.OAuthClientDetails;
import io.bluemoon.authorizationserver2.domain.client.OAuthClientDetailsRepository;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUser;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUserRepository;
import io.bluemoon.authorizationserver2.domain.oauth.OAuthUserRoleRepository;
import io.bluemoon.authorizationserver2.utils.APIRequest;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Service
public class OAuthUserServiceImpl implements OAuthUserService {
private OAuthUserRepository userRepository;
private OAuthUserRoleRepository userRoleRepository;
private PasswordEncoder passwordEncoder;
private OAuthClientDetailsRepository oAuthClientDetailsRepository;
public OAuthUserServiceImpl(
OAuthUserRepository userRepository,
OAuthUserRoleRepository userRoleRepository,
PasswordEncoder passwordEncoder,
OAuthClientDetailsRepository oAuthClientDetailsRepository
) {
this.userRepository = userRepository;
this.userRoleRepository = userRoleRepository;
this.passwordEncoder = passwordEncoder;
this.oAuthClientDetailsRepository = oAuthClientDetailsRepository;
}
@Override
public OAuthUser createUser(OAuthUser user) {
// 중복 체크
user.setPassword(passwordEncoder.encode(user.getPassword()));
return userRepository.saveAndFlush(user);
}
@Override
public String readUser(OAuthUser user) throws IOException {
Optional<OAuthUser> optionalOAuthUser =
userRepository.findByUsername(user.getUsername());
if (optionalOAuthUser.isPresent()) {
if (passwordEncoder.matches(user.getPassword(), optionalOAuthUser.get().getPassword())) {
// client id
Optional<OAuthClientDetails> optionalOAuthClientDetails = oAuthClientDetailsRepository.findByClientId(user.getUsername());
if (optionalOAuthClientDetails.isPresent()) {
// token 발급
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("grant_type", "password");
userInfo.put("username", user.getUsername());
userInfo.put("password", user.getPassword());
Map<String, Object> authInfo = new HashMap<>();
authInfo.put("client_id", optionalOAuthClientDetails.get().getClientId());
authInfo.put("client_secret", "1234");
APIRequest.ResponseWrapper responseWrapper = APIRequest.getIRequestExecutor().createOAuthToken(userInfo, authInfo);
return responseWrapper.getBody();
// return optionalOAuthClientDetails.get();
} else {
}
// if (optionalOAuthClientDetails.isPresent()) {
// System.out.println(optionalOAuthClientDetails.get());
// } else {
// System.out.println(user.getUsername());
// System.out.println(user.getPassword());
// }
}
}
return null;
}
@Override
public OAuthClientDetails createProject(OAuthClientDetails clientDetails) {
clientDetails.setClientSecret(passwordEncoder.encode(clientDetails.getClientSecret()));
return oAuthClientDetailsRepository.save(clientDetails);
}
}

View File

@@ -1,15 +0,0 @@
package io.bluemoon.authorizationserver2.service.user;
import io.bluemoon.authorizationserver2.domain.user.User;
import java.io.IOException;
import java.util.Map;
public interface UserService {
User createOAuthUser(User user);
String createOAuthToken(User user) throws IOException;
User updateOAuthUser(User user);
}

View File

@@ -1,83 +0,0 @@
package io.bluemoon.authorizationserver2.service.user;
import io.bluemoon.authorizationserver2.domain.user.User;
import io.bluemoon.authorizationserver2.domain.user.UserRepository;
import io.bluemoon.authorizationserver2.utils.APIRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService{
private UserRepository userRepository;
public UserServiceImpl(
UserRepository userRepository
) {
this.userRepository = userRepository;
}
@Override
public User createOAuthUser(User user) {
// user.setPassword(passwordEncoder().encode(user.getPassword()));
// user.setPassword();
return userRepository.save(user);
}
@Override
public String createOAuthToken(User user) throws IOException {
Optional<User> optionalUser = userRepository.findByUsername(user.getUsername());
System.out.println(passwordEncoder().matches(user.getPassword(), optionalUser.get().getPassword()));
// System.out.println(passwordEncoder().matches("1234", optionalUser.get().getPassword()));
if (optionalUser.isPresent()) {
if (passwordEncoder().matches(user.getPassword(), optionalUser.get().getPassword())) {
//token 발급
Map<String, Object> tokenInfo = new HashMap<>();
tokenInfo.put("username", user.getUsername());
tokenInfo.put("password", user.getPassword());
// tokenInfo.put("password", "1234");
tokenInfo.put("grant_type", "password");
APIRequest.ResponseWrapper response = APIRequest.getIRequestExecutor().createOAuthToken(tokenInfo);
System.out.println(response.getBody());
return response.getBody();
}
System.out.println("-----------------------11");
}
System.out.println("-----------------------22");
return null;
}
@Override
public User updateOAuthUser(User user) {
Optional<User> getUser = userRepository.findById(user.getId());
if (getUser.isPresent()) {
user.setId(getUser.get().getId());
return userRepository.save(user);
} else {
return null;
}
}
// @Bean
// public PasswordEncoder passwordEncoder() {
// return new BCryptPasswordEncoder();
// }
@Bean
@SuppressWarnings("deprecation")
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
}

View File

@@ -19,7 +19,7 @@ public class APIRequest {
}
public interface IRequestExecutor {
ResponseWrapper createOAuthToken(Map tokenInfo) throws IOException;
ResponseWrapper createOAuthToken(Map userInfo, Map authInfo) throws IOException;
}
@@ -32,18 +32,22 @@ public class APIRequest {
init();
}
@Override
public ResponseWrapper createOAuthToken(Map tokenInfo) throws IOException {
public ResponseWrapper createOAuthToken(Map userInfo, Map authInfo) throws IOException {
String url = "http://localhost:8081/auth/oauth/token";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(tokenInfo);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonString);
RequestBody formBody = new FormBody.Builder()
.add("grant_type", userInfo.get("grant_type").toString())
.add("username", userInfo.get("username").toString())
.add("password", userInfo.get("password").toString())
.build();
// String jsonString = gson.toJson(userInfo);
// RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonString);
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", Credentials.basic("a","1"))
.post(body)
.header("Content-type", "application/json")
.addHeader("Authorization", Credentials.basic(authInfo.get("client_id").toString(),authInfo.get("client_secret").toString()))
.post(formBody)
// .header("Content-type", "application/json")
.build();
Call call = client.newCall(request);
@@ -51,8 +55,8 @@ public class APIRequest {
ResponseWrapper result = new ResponseWrapper(response.body().string(), convertToString(response.headers()));
System.out.println("----------===================------------");
System.out.println(result.getBody());
return result;
return result;
}
}

View File

@@ -4,24 +4,16 @@ server.servlet.context-path=/auth
security.oauth2.authorization.check-token-access=isAuthenticated()
spring.main.allow-bean-definition-overriding=true
#spring.datasource.url=jdbc:mysql://127.0.0.1/oauth2?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
#spring.datasource.username=root
#spring.datasource.password=bluemoon
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.platform=schema
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect
#spring.jpa.database = MYSQL
spring.datasource.url=jdbc:mysql://127.0.0.1/oauth2?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=bluemoon
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.platform=schema
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
spring.datasource.url=jdbc:postgresql://localhost:5432/mk2
#spring.datasource.platform=postgres
#spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.database = POSTGRESQL
spring.jpa.database = MYSQL
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true

View File

@@ -0,0 +1,39 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<head>
</head>
<body>
<div class="container">
<form role="form" th:action="@{/signInMiddleWare}" method="post">
<div class="form-group row">
<label for="username" class="col-sm-2 col-form-label">ID</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="username" placeholder="id" name="username">
</div>
</div>
<div class="form-group row">
<label for="password" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="password" placeholder="password" name="password">
</div>
</div>
<input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
</div>
</body>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</html>

View File

@@ -0,0 +1,39 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<head>
</head>
<body>
<div class="container">
<form role="form" th:action="@{/signUpMiddleWare}" method="post">
<div class="form-group row">
<label for="username" class="col-sm-2 col-form-label">ID</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="username" placeholder="id" name="username">
</div>
</div>
<div class="form-group row">
<label for="password" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="password" placeholder="password" name="password">
</div>
</div>
<input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
</div>
</body>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</html>

View File

@@ -8,12 +8,12 @@ import java.util.Collection;
@Data
@Entity
@Table(name = "user", schema = "oauth2")
@Table(name = "oauth_user", schema = "oauth2")
public class OAuthUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int id;
@Column
private String username;

View File

@@ -0,0 +1,11 @@
package io.bluemoon.testservice.domain.oauth;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface OAuthUserRepository extends JpaRepository<OAuthUser, Integer> {
Optional<OAuthUser> findByUsername(String username);
}

View File

@@ -1,18 +1,20 @@
package io.bluemoon.testservice.domain.oauth;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "user_role", schema = "oauth2")
@ToString(exclude = "oAuthUser")
@Table(name = "oauth_user_role", schema = "oauth2")
public class OAuthUserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int id;
@Column
private String role;

View File

@@ -0,0 +1,6 @@
package io.bluemoon.testservice.domain.oauth;
import org.springframework.data.jpa.repository.JpaRepository;
public interface OAuthUserRoleRepository extends JpaRepository<OAuthUserRole, Integer> {
}

View File

@@ -7,5 +7,4 @@ import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Integer> {
Optional<User> findByUsername(String username);
}

View File

@@ -0,0 +1,9 @@
package io.bluemoon.testservice.service.oauth;
import io.bluemoon.testservice.domain.oauth.OAuthUser;
import io.bluemoon.testservice.domain.user.User;
public interface OAuthUserService {
}

View File

@@ -0,0 +1,22 @@
package io.bluemoon.testservice.service.oauth;
import io.bluemoon.testservice.domain.oauth.OAuthUser;
import io.bluemoon.testservice.domain.oauth.OAuthUserRepository;
import io.bluemoon.testservice.domain.oauth.OAuthUserRoleRepository;
import org.springframework.stereotype.Service;
@Service
public class OAuthUserServiceImpl implements OAuthUserService {
private OAuthUserRepository oAuthUserRepository;
private OAuthUserRoleRepository oAuthUserRoleRepository;
public OAuthUserServiceImpl(
OAuthUserRepository oAuthUserRepository,
OAuthUserRoleRepository oAuthUserRoleRepository
) {
this.oAuthUserRepository = oAuthUserRepository;
this.oAuthUserRoleRepository = oAuthUserRoleRepository;
}
}

View File

@@ -1,9 +1,13 @@
package io.bluemoon.testservice.service.user;
import io.bluemoon.testservice.domain.oauth.OAuthUser;
import io.bluemoon.testservice.domain.oauth.OAuthUserRepository;
import io.bluemoon.testservice.domain.user.User;
import io.bluemoon.testservice.service.oauth.OAuthUserService;
import io.bluemoon.testservice.utils.APIRequest;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
@@ -12,15 +16,32 @@ import java.io.IOException;
@Component
public class UserEventListener {
// private OAuthUserService oAuthUserService;
private OAuthUserRepository oAuthUserRepository;
public UserEventListener(
OAuthUserRepository oAuthUserRepository
) {
this.oAuthUserRepository = oAuthUserRepository;
}
@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, classes = UserServiceImpl.UserCreateEvent.class)
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT, classes = UserServiceImpl.UserCreateEvent.class)
public void userCreateEventHandle(UserServiceImpl.UserCreateEvent event) throws IOException {
User user = event.getUser();
System.out.println("----------handler");
System.out.println(user);
APIRequest.ResponseWrapper responseWrapper = APIRequest.getIRequestExecutor().createOAuthUser(user);
System.out.println(responseWrapper.getHeader());
System.out.println(responseWrapper.getBody());
OAuthUser oAuthUser = new OAuthUser();
oAuthUser.setUsername(user.getUsername());
oAuthUser.setPassword(user.getPassword());
oAuthUserRepository.saveAndFlush(oAuthUser);
// APIRequest.ResponseWrapper responseWrapper = APIRequest.getIRequestExecutor().createOAuthUser(user);
// System.out.println(responseWrapper.getHeader());
// System.out.println(responseWrapper.getBody());
// oauth
}

View File

@@ -1,7 +1,10 @@
package io.bluemoon.testservice.service.user;
import io.bluemoon.testservice.domain.oauth.OAuthUser;
import io.bluemoon.testservice.domain.oauth.OAuthUserRepository;
import io.bluemoon.testservice.domain.user.User;
import io.bluemoon.testservice.domain.user.UserRepository;
import io.bluemoon.testservice.service.oauth.OAuthUserService;
import io.bluemoon.testservice.utils.APIRequest;
import lombok.Getter;
import lombok.NonNull;
@@ -25,11 +28,14 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw
private UserRepository userRepository;
private ApplicationEventPublisher eventPublisher;
private OAuthUserRepository oAuthUserRepository;
public UserServiceImpl(
UserRepository userRepository
UserRepository userRepository,
OAuthUserRepository oAuthUserRepository
) {
this.userRepository = userRepository;
this.oAuthUserRepository = oAuthUserRepository;
}
@@ -39,6 +45,10 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw
user.setPassword(passwordEncoder().encode(user.getPassword()));
System.out.println(passwordEncoder().matches("1234", user.getPassword()));
userRepository.save(user);
// OAuthUser o = new OAuthUser();
// o.setPassword("123");
// o.setName("tomz");
// oAuthUserRepository.save(o);
eventPublisher.publishEvent(new UserCreateEvent(user));
return user;
}
@@ -54,10 +64,19 @@ public class UserServiceImpl implements UserService, ApplicationEventPublisherAw
if (optionalUser.isPresent()) {
System.out.println(optionalUser.get().toString());
if (passwordEncoder().matches(user.getPassword(),optionalUser.get().getPassword())) {
APIRequest.ResponseWrapper response = APIRequest.getIRequestExecutor().createOAuthToken(user);
Map a = new HashMap();
a.put("data", response);
return a;
Optional<OAuthUser> optionalOAuthUser = oAuthUserRepository.findByUsername(user.getUsername());
if (passwordEncoder().matches(user.getPassword(), optionalOAuthUser.get().getPassword())) {
// client id
Map<String, Object> tokenInfo = new HashMap<>();
tokenInfo.put("username", user.getUsername());
tokenInfo.put("password", user.getPassword());
tokenInfo.put("grant_type", "password");
APIRequest.ResponseWrapper response = APIRequest.getIRequestExecutor().createOAuthToken(tokenInfo);
System.out.println();
}
}
}

View File

@@ -20,8 +20,7 @@ public class APIRequest {
}
public interface IRequestExecutor {
ResponseWrapper createOAuthUser(User user) throws IOException;
ResponseWrapper createOAuthToken(User user) throws IOException;
ResponseWrapper createOAuthToken(Map tokenInfo) throws IOException;
ResponseWrapper updateOAuthUser(User user);
ResponseWrapper createOAuthClientDetails();
@@ -38,37 +37,16 @@ public class APIRequest {
}
@Override
public ResponseWrapper createOAuthUser(User user) throws IOException {
String url = "http://localhost:8081/auth/createOAuthUser";
public ResponseWrapper createOAuthToken(Map tokenInfo) throws IOException {
String url = "http://localhost:8081/auth/oauth/token";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(user);
String jsonString = gson.toJson(tokenInfo);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonString);
Request request = new Request.Builder()
.url(url)
.post(body)
.header("Content-type", "application/json")
.build();
Call call = client.newCall(request);
Response response = call.execute();
ResponseWrapper result = new ResponseWrapper(response.body().string(), convertToString(response.headers()));
return result;
}
@Override
public ResponseWrapper createOAuthToken(User user) throws IOException {
String url = "http://localhost:8081/auth/auth";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(user);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonString);
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", Credentials.basic("a","1"))
.post(body)
.header("Content-type", "application/json")
.build();
@@ -76,6 +54,8 @@ public class APIRequest {
Call call = client.newCall(request);
Response response = call.execute();
ResponseWrapper result = new ResponseWrapper(response.body().string(), convertToString(response.headers()));
System.out.println("----------===================------------");
System.out.println(result.getBody());
return result;
}