https://github.com/VBA-tools/VBA-JSON
https://github.com/VBA-tools/VBA-Web
VBA로 RestClient호출해야하는경우 사용하기 좋은 라이브러리
https://github.com/VBA-tools/VBA-JSON
https://github.com/VBA-tools/VBA-Web
VBA로 RestClient호출해야하는경우 사용하기 좋은 라이브러리
JWT토큰 ACL 기능 설계중에
payload를 짧게 만들려고 생각하다가 나온 부분
1 2 3 4 5 6 |
VIEW READ WRITE MODIFY DELETE EXECUTE |
서비스에 따라 좀 다른 형태가 추가될 가능성도 있지만 숫자를 늘리면 된다
1 2 3 4 5 6 7 8 9 10 11 12 |
--- user --- r 400 w 200 x 100 --- group --- r 40 w 20 x 10 --- other --- r 4 w 2 x 1 |
여기서 숫자 규칙은..
어떤숫자 조합을 더해도 중복숫자가 없어야한다.
1 2 3 4 5 6 |
VIEW 1 READ 2 WRITE 4 MODIFY 8 DELETE 16 EXECUTE 32 |
ex1) VIEW,READ = 3
ex2) READ,MODIFY = 10
이런식으로 1개 늘어날 때 마다 숫자가 2배씩 커지고
필요한 권한을 더해서 숫자로 payload에 넣어주면 된다
숫자를 더 줄일 규칙이 있는지 찾아봐야겠다
VIEW, READ, WRITE 다 더해도 MODIFY보다 작다.
권한숫자 = AuthNum = AN
ex1) AN = 16 — 16
큰 숫자부터 하나씩 빼서 -가 되면 다음,
+가 나오면 권한체크
0이 되면 종료
근데 어차피 권한이 많지 않으니 매번 계산하는 것 보다 저장 해 놓고 쓰는게 낫겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
HTTP Status 500 – Internal Server Error Type Exception Report Message Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/layouts/standard-layout", template might not exist or might not be accessible by any of the configured Template Resolvers Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/layouts/standard-layout", template might not exist or might not be accessible by any of the configured Template Resolvers org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:686) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:791) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) kr.solarconnect.app.security.jwt.JwtAuthFilter.doFilterInternal(JwtAuthFilter.java:58) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) Root Cause org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/layouts/standard-layout", template might not exist or might not be accessible by any of the configured Template Resolvers org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:245) org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104) org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) org.thymeleaf.extras.tiles2.renderer.ThymeleafAttributeRenderer.write(ThymeleafAttributeRenderer.java:155) org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) org.thymeleaf.extras.tiles2.renderer.MetadataCleaningAttributeRendererWrapper.render(MetadataCleaningAttributeRendererWrapper.java:111) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321) org.thymeleaf.extras.tiles2.spring4.web.view.ThymeleafTilesView.render(ThymeleafTilesView.java:125) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:686) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:791) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) kr.solarconnect.app.security.jwt.JwtAuthFilter.doFilterInternal(JwtAuthFilter.java:58) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) Note The full stack trace of the root cause is available in the server logs. Apache Tomcat/8.5.20 |
Spring Boot문제인지 리눅스 문제인지
/tempalte/layout.html 경로를 인식하지못한다.
template/layout.html 처럼 앞의 /를 제외해준다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
java.lang.RuntimeException: Must set 'realm' in config at org.keycloak.adapters.KeycloakDeploymentBuilder.internalBuild(KeycloakDeploymentBuilder.java:55) ~[keycloak-adapter-core-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.KeycloakDeploymentBuilder.build(KeycloakDeploymentBuilder.java:164) ~[keycloak-adapter-core-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver.resolve(KeycloakSpringBootConfigResolver.java:37) ~[keycloak-spring-boot-adapter-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.AdapterDeploymentContext.resolveDeployment(AdapterDeploymentContext.java:88) ~[keycloak-adapter-core-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.PreAuthActionsHandler.preflightCors(PreAuthActionsHandler.java:107) ~[keycloak-adapter-core-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.PreAuthActionsHandler.handleRequest(PreAuthActionsHandler.java:79) ~[keycloak-adapter-core-3.2.1.Final.jar!/:3.2.1.Final] at org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.invoke(AbstractKeycloakAuthenticatorValve.java:181) ~[spring-boot-container-bundle-3.2.1.Final.jar!/:3.2.1.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) ~[tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:677) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144-cedar14] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144-cedar14] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144-cedar14] |
https://github.com/keycloak/keycloak
뭔가 좋을 것 같아서 나중에 쓰려고 gradle.build 플러그인 추가하니까 뜨는 오류
인증관련 라이브러리인데 자세히 보지는 못했다.
1 2 3 4 5 6 7 |
subprojects { dependencyManagement { imports { mavenBom "org.keycloak.bom:keycloak-adapter-bom:3.2.1.Final" } } } |
아직
꼭 한개씩 빼먹어서 기록.
chef셋팅은 여유있을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo apt install mysql-server mysql-common mysql-client $ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf -------- #bind-address = 127.0.0.1 bind-address = * -------- $ sudo service mysql restart $ mysql -u root -p password : 입력 mysql> select User, Host from mysql.user; mysql> set password for 'root'@'localhost' = password('패쓰워드'); mysql> create user 'userid'@'%' identified by '패쓰워드'; mysql> grant all privileges on *.* to 'userid'@'%'; mysql> flush privileges; mysql> exit; |
테스트계정 추가하면서 마스터권한을 줘버렸는데
권한이나 접근가능서버는 상황에 맞게 조절하면 된다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ sudo apt install rabbitmq-server 사용자 추가 $ sudo rabbitmqctl add_user testuser testpassword 관리자권한부여 $ sudo rabbitmqctl set_user_tags testuser administrator 접근권한 부여 $ sudo rabbitmqctl set_permissions -p / test ".*" ".*" ".*" 관리화면 플러그인 활성화 $ sudo rabbitmq-plugins enable rabbitmq_management 재시작 $ sudo service rabbitmq-service restart 접속 (서버주소) http://localhost:15672 |
1 2 3 4 5 6 7 8 9 |
$ sudo apt install redis-sentinel redis-server redis-tools $ sudo nano /etc/redis/redis.conf ------ # bind 192.168.1.100 10.0.0.1 #bind 127.0.0.1 bind * ------ $ sudo service redis-server restart |
sentinel 관련 설정은 클러스터링테스트시..
이 프레임워크의 존재는 오래전부터 알았지만 이걸 쓸 생각은 한번도 안해봤다.
그냥 별로 쓸모가 없어보여서… 이런짓을 왜 해야되나 싶었다.
그냥 controller에서 리다이렉트하고 뭐 하면 되는데
그런데 최근.. SSO서비스를 만들면서 플로우가 너무 꼬여서 고생하고 나니 생각이 바뀌었다.
소셜로그인 때문에 OAuth의 redirect까지 끼어들고 나니 코드가 뭐가뭔지 정신이 하나도 없었다.
그래서 사용하기로 결정.
사용법은 매우 쉽다. 웹 플로우의 필요성을 느꼈다면 설명은 필요없어보인다.
아쉬운점은 xml이고 spring boot에서 별로 지원이 없다는 점.
아직 쓸모가 있고 수요도 있는데
업그레이드는 되지 않는 것 같다.
SpringBoot에서 참견을 안하니까 알수없는 오류의 구렁텅이에 빠지는 일도 없고
심플하고 오래된 프레임워크라 버그가 없을 것만같다. (아직 안써봤다)
ex0) SignupFlow
로그인-> Y -> end.메인화면으로.view
-> N -> 회원가입폼.view -> email? -> EmailFlow
-> social? -> SocialFlow
ex1) EmailFlow
~~~
ex2) SocialFlow
~~~
적용하면서 시간낭비 하다가 다 빼버렸다.
쓴다면 플로우가(Scene이?) 3단계 이상인 경우에만 쓰는게 좋을 것 같다.
ex)이메일인증, OAuth 등의 경우
RequestParam, Cookie 또는 Session을 선택적으로 쓸 수 있는 환경이 필요해 보인다.
시간날 때 GroovyDSL 형태로 만들어보는게 좋을까
flow는 항상 처음부터 시작되는걸로 여러개 만드는 방식도 좋지만
중간진입이 필요한 경우도 있지 않을까? 이건 좀 애매한 부분.
_elementId_{name} 형태로 써서 보내야 되는데
오지게 불편하다.
대소문자와 밑줄 사용
camelCase
변수명, 메서드명에 사용
약자인 경우에는 대문자를 연속해서 쓰는 경우가 있는데 글자수에 따른 변동이 있음
2글자 VO, 그냥 두개 대문자로 쓰는게 일반적인 룰이지만.. 사람에 따라
3글자 Dto, Api, 3글자 이상부터는 뒤에는 소문자로 쓰는게 룰이라고 하지만… userDTO, smsAPI와 같이 3글자 다 대문자로 쓰는경우도 많다. 대문자로 쓰자그냥
4글자 이상. 몰라
자주쓰이는 약자들만 프로젝트 단위별로 정해놓고 쓰면 되겠다.
이것들은 그냥 대문자로 쓰자
DTO, VO, API
snake_case
json, xml에만 사용 소스코드에는 사용하지 않음
_number
타 언어에서 전역변수에 사용하는데 자바에서는 (잘)사용하지않음
C하던사람들이 자바하면 이런거 많이씀
__number
타 언어에서 접근금지 변수에 사용하는데 자바에서는 사용하지 않음
data class suffic
Entity : JPA(ORM)
Dto : API 호출
VO : Mybatis 접근
Model
Data
Wrapper : Dto 의 묶음. 대부분 고정된 형태 외부 프레임
json을 읽어들일때: ~JsonModel