15 | * Usage: 16 | * {@code 17 | * @Autowired 18 | * private DbProvider dbProvider; 19 | * ... 20 | * dbProvider.getXXXRepository} 21 | *22 | */ 23 | @Getter 24 | @Component 25 | @RequiredArgsConstructor 26 | public class DbProvider { 27 | 28 | private final PersonRepository personRepository; 29 | private final AppUserRepository appUserRepository; 30 | private final AppRoleRepository appRoleRepository; 31 | } 32 | -------------------------------------------------------------------------------- /backend/src/main/java/de/mrrobworks/springbootangular/backend/global/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package de.mrrobworks.springbootangular.backend.global; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.web.bind.annotation.ControllerAdvice; 5 | import org.springframework.web.bind.annotation.ExceptionHandler; 6 | 7 | @Slf4j 8 | @ControllerAdvice 9 | public class GlobalExceptionHandler { 10 | 11 | @ExceptionHandler 12 | public void handleException(Exception e) throws Exception { 13 | log.error(e.getMessage(), e); 14 | throw e; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /backend/src/main/java/de/mrrobworks/springbootangular/backend/global/LogAspect.java: -------------------------------------------------------------------------------- 1 | package de.mrrobworks.springbootangular.backend.global; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.aspectj.lang.JoinPoint; 5 | import org.aspectj.lang.ProceedingJoinPoint; 6 | import org.aspectj.lang.annotation.AfterThrowing; 7 | import org.aspectj.lang.annotation.Around; 8 | import org.aspectj.lang.annotation.Aspect; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.concurrent.TimeUnit; 12 | 13 | @Aspect 14 | @Component 15 | @Slf4j 16 | public class LogAspect { 17 | 18 | @Around("execution(* de.mrrobworks.springbootangular.backend.*.*ServiceImpl.*(..))") 19 | public static Object logTime(ProceedingJoinPoint joinPoint) throws Throwable { 20 | Object ret; 21 | long startTime = System.currentTimeMillis(); 22 | ret = joinPoint.proceed(); 23 | long seconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime); 24 | log.info("Method \"{}\" took {} sec.", joinPoint.getSignature(), seconds); 25 | return ret; 26 | } 27 | 28 | @AfterThrowing( 29 | value = "execution(* de.mrrobworks.springbootangular.backend.*.*ServiceImpl.*(..))", 30 | throwing = "e") 31 | public static void logException(JoinPoint joinPoint, Throwable e) { 32 | log.error(joinPoint + " -> " + e.getMessage(), e); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /backend/src/main/java/de/mrrobworks/springbootangular/backend/global/SwaggerConfig.java: -------------------------------------------------------------------------------- 1 | package de.mrrobworks.springbootangular.backend.global; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import springfox.documentation.builders.ApiInfoBuilder; 6 | import springfox.documentation.builders.PathSelectors; 7 | import springfox.documentation.builders.RequestHandlerSelectors; 8 | import springfox.documentation.service.ApiInfo; 9 | import springfox.documentation.service.Contact; 10 | import springfox.documentation.spi.DocumentationType; 11 | import springfox.documentation.spring.web.plugins.Docket; 12 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 13 | 14 | @Configuration 15 | @EnableSwagger2 16 | public class SwaggerConfig { 17 | 18 | @Bean 19 | public Docket api() { 20 | return new Docket(DocumentationType.SWAGGER_2) 21 | .select() 22 | .apis( 23 | RequestHandlerSelectors.basePackage( 24 | "de.mrrobworks.springbootangular.backend.controller")) 25 | .paths(PathSelectors.any()) 26 | .build() 27 | .apiInfo(metaData()); 28 | } 29 | 30 | private ApiInfo metaData() { 31 | return new ApiInfoBuilder() 32 | .title("spring-boot-angular-template REST-API") 33 | .description("REST-Endpoint for spring-boot-angular-template") 34 | .contact( 35 | new Contact("mrrobworks", "https://github.com/mrrobworks", "mrrobworks@github.com")) 36 | .build(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /backend/src/main/java/de/mrrobworks/springbootangular/backend/global/WebOAuth2Config.java: -------------------------------------------------------------------------------- 1 | package de.mrrobworks.springbootangular.backend.global; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties; 7 | import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 10 | import org.springframework.boot.web.servlet.FilterRegistrationBean; 11 | import org.springframework.context.annotation.Bean; 12 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 13 | import org.springframework.security.config.annotation.web.builders.WebSecurity; 14 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 15 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 16 | import org.springframework.security.oauth2.client.OAuth2ClientContext; 17 | import org.springframework.security.oauth2.client.OAuth2RestTemplate; 18 | import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter; 19 | import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter; 20 | import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; 21 | import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client; 22 | import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; 23 | import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; 24 | import org.springframework.security.web.csrf.CookieCsrfTokenRepository; 25 | import org.springframework.web.filter.CompositeFilter; 26 | 27 | import javax.servlet.Filter; 28 | import java.util.ArrayList; 29 | 30 | @Slf4j 31 | @EnableOAuth2Client 32 | @EnableWebSecurity 33 | @RequiredArgsConstructor 34 | public class WebOAuth2Config extends WebSecurityConfigurerAdapter { 35 | 36 | static final String GOOGLE_LOGIN_URL = "/login/google"; 37 | static final String GITHUB_LOGIN_URL = "/login/github"; 38 | 39 | private final WebOAuth2ConfigHelper webOAuth2ConfigHelper; 40 | private final OAuth2ClientContext oauth2ClientContext; 41 | 42 | @Override 43 | public void configure(WebSecurity web) { 44 | web.ignoring() 45 | .antMatchers( 46 | "/", 47 | "/**.html", 48 | "/**.js", 49 | "/**.css", 50 | "/v2/api-docs", 51 | "/swagger-resources/**", 52 | "/configuration/**", 53 | "/webjars/**"); 54 | } 55 | 56 | @Override 57 | public void configure(HttpSecurity http) throws Exception { 58 | http.authorizeRequests() 59 | .antMatchers("/backend/**") 60 | .authenticated() 61 | .and() 62 | .csrf() 63 | .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 64 | .and() 65 | .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class); 66 | } 67 | 68 | private Filter ssoFilter() { 69 | var compositeFilter = new CompositeFilter(); 70 | var filters = new ArrayList
Current User: {{currentUser.id}}
2 | 3 |ID | 7 |Firstname | 8 |Lastname | 9 |
---|---|---|
{{person.id}} | 14 |{{person.firstname}} | 15 |{{person.lastname}} | 16 |
User-ID | 7 |Roles | 8 |Actions | 9 |
---|---|---|
{{templateUser.id}} | 14 |15 | 16 | {{templateRole.id}}, 17 | 18 | | 19 |20 | 24 | | 25 |
Adminstration enabled
6 |Role-ID | 10 |Role-Description | 11 |
{{role.id}} | 16 |{{role.description}} | 17 |