package com.example;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.security.Principal;
import java.util.Optional;
import java.util.stream.Stream;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
class Account {
@Id
@GeneratedValue
private Long id;
private String username, password;
private boolean active = true;
public Account(String u, String p) {
this.username = u;
this.password = p;
}
}
interface AccountRepository extends JpaRepository<Account, Long> {
Optional<Account> findByUsername(String u);
}
@EnableDiscoveryClient
@SpringBootApplication
@EnableResourceServer
public class AuthServiceApplication {
@RestController
public static class PrincipalRestController {
@RequestMapping("/user")
public Principal principal(Principal p) {
return p;
}
}
@Component
public static class AccountInitializer
implements CommandLineRunner {
private final AccountRepository accountRepository;
AccountInitializer(AccountRepository accountRepository) {
this.accountRepository = accountRepository;
}
@Override
public void run(String... strings) throws Exception {
Stream.of("jlong,spring", "dsyer,cloud")
.map(x -> x.split(","))
.forEach(tpl -> this.accountRepository.save(new Account(tpl[0], tpl[1])));
}
}
@Service
public static class JpaUserDetailsService
implements UserDetailsService {
private final AccountRepository accountRepository;
JpaUserDetailsService(AccountRepository accountRepository) {
this.accountRepository = accountRepository;
}
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
Optional<Account> accountOptional = accountRepository.findByUsername(s);
return accountOptional
.map(a -> new User(a.getUsername(), a.getPassword(), a.isActive(), a.isActive(), a.isActive(), a.isActive(),
AuthorityUtils.createAuthorityList("ROLE_USER", "ROLE_ADMIN")))
.orElseThrow(() -> new UsernameNotFoundException("couldn't find " + s + "!"));
}
}
@Configuration
@EnableAuthorizationServer
public static class AuthServerConfiguration
extends AuthorizationServerConfigurerAdapter {
private final AuthenticationManager authenticationManager;
AuthServerConfiguration(AuthenticationManager am) {
this.authenticationManager = am;
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("html5").secret("secret").scopes("openid").authorizedGrantTypes("password");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(this.authenticationManager);
}
}
public static void main(String[] args) {
SpringApplication.run(AuthServiceApplication.class, args);
}
}