[백업][가리사니] mustache 문법 + 스프링 연동
html, spring
이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.
머스터치
공식 : https://mustache.github.io/ 데모 : https://mustache.github.io/#demo
- 을 통해 빠른 치환 장점
- 웬만한 플랫폼을 모두 지원한다.
- 속도가 빠르다. 단점
- 플랫폼 공용으로 만들어졌기에 스프링 같은 곳에서 쓰기위해서는 모두 모델안에 넣어줘야한다.
- 상위를 선택하는 방법이 한정적임.
문법
예제 데이터
{
"header": "Colors",
"items": [
{"name": "red", "first": true, "url": "#Red"},
{"name": "green", "link": true, "url": "#Green"},
{"name": "blue", "link": true, "url": "#Blue"}
],
"empty": false
}
출력
IF
- NOT (^)을 제외하면 루프와 동일
- (^) 제외시 IF 개념이 아니라 반복 이지만 이해를 돕기위한 설명입니다.
해더가 존재함
해더가 존재하지 않음
해더333 이 존재하지 않음
내부출력 - 자기자신
해드의 값은 임
루프 : 사실상 위 IF 가 루프를 통하고있다.
- 즉 배열형이면 루프를 돌며 출력되며, 배열이 아닌 값이면 단일 출력이되며, 값이 없으면 출력되지않음.
content<div class="post title">[백업][가리사니] spring boot security : 5. 회원가입</div>
<div class="post ctrl pad-x-4">
<div class="fl-left">
java, spring
</div>
<div class="fl-right">
<a href="https://github.com/ac-saro">박용서</a> •
<a href="https://github.com/ac-saro/ac-saro.github.io/edit/publish/_posts/old/2016-07-26-[백업][가리사니] Spring boot Security : 5. 회원가입.md">2016-07-26</a>
</div>
</div>
<div class="hr-line pad-x-4 content-layout">
<blockquote>
<p>이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다.
오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.</p>
</blockquote>
<h1 id="spring-boot-security-">Spring boot Security 시리즈</h1>
<ul>
<li><a href="/2016/07/24/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-1.-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95.html">1. 설치 및 페이지 설정</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-2.-%EC%9D%B8%EC%A6%9D-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90/html">2. 인증로직을 만들어보자.</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-3.-%EC%9D%B8%EC%A6%9D%EB%A1%9C%EC%A7%81-%EC%9E%A0%EC%9E%AC%EC%A0%81-%EC%9C%84%ED%97%98.html">3. 인증로직 - 잠재적 위험</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">4. 인증 페이지뷰</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-5.-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85.html">5. 회원가입</a></li>
<li><a href="/2016/09/03/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-Security-login-(%EC%84%B1%EA%B3%B5-%EC%8B%A4%ED%8C%A8)-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88.html">부록 : Spring Security login (성공 / 실패) 이벤트 리스너 </a></li>
</ul>
<h1 id="section">뷰</h1>
<p>2장 강의에선 string 으로 뽑았던 메인페이지도 새로 만들어줍니다.
src/main/resources/templates/main.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">></span>
<span class="nt"><head></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/></span>
<span class="nt"><title></span>메인페이지<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/mypage"</span><span class="nt">></span>마이페이지<span class="nt"></a><br/></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/login"</span><span class="nt">></span>로그인<span class="nt"></a><br/></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/create"</span><span class="nt">></span>회원가입<span class="nt"></a><br/></span>
<span class="nt"></div></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<p>src/main/resources/templates/create.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">></span>
<span class="nt"><head></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/></span>
<span class="nt"><title></span>회원가입<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div></span>
<span class="nt"><form</span> <span class="na">th:action=</span><span class="s">"@{/createProcessing}"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">></span>
<span class="nt"><h2></span>회원가입<span class="nt"></h2></span>
<span class="c"><!-- 강의를 간결하게 끝내기 위함.. 원래는 가입실패 여부를 자세히 표시해야한다 --></span>
<span class="nt"><div</span> <span class="na">th:if=</span><span class="s">"${param.error}"</span><span class="nt">></span>
계정이 중복됩니다.
<span class="nt"></div></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"ac"</span> <span class="na">placeholder=</span><span class="s">"계정"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"password"</span> <span class="na">name=</span><span class="s">"pw"</span> <span class="na">placeholder=</span><span class="s">"암호"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"회원가입"</span><span class="nt">/></span>
<span class="nt"></form></span>
<span class="nt"></div></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<h1 id="section-1">서비스</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Component</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AccountService</span>
<span class="o">{</span>
<span class="nd">@Autowired</span>
<span class="nc">AccountRepository</span> <span class="n">accountRepository</span><span class="o">;</span>
<span class="c1">// 리턴을 저런식으로하면 안됩니다.</span>
<span class="c1">// (무었때문에 가입 실패했는지를 적어주셔야..)</span>
<span class="nd">@Transactional</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">create</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">Account</span> <span class="n">account</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Account</span><span class="o">();</span>
<span class="n">account</span><span class="o">.</span><span class="na">setAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
<span class="n">account</span><span class="o">.</span><span class="na">setPw</span><span class="o">(</span><span class="k">new</span> <span class="nc">BCryptPasswordEncoder</span><span class="o">().</span><span class="na">encode</span><span class="o">(</span><span class="n">pw</span><span class="o">));</span>
<span class="n">account</span><span class="o">.</span><span class="na">setRole</span><span class="o">(</span><span class="s">"NORMAL"</span><span class="o">);</span>
<span class="n">accountRepository</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">account</span><span class="o">);</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">Account</span> <span class="nf">getAccount</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">return</span> <span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-2">컨트롤러</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">main</span><span class="o">()</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"main"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/create"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">create</span><span class="o">()</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"create"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Autowired</span>
<span class="nc">AccountService</span> <span class="n">accountService</span><span class="o">;</span>
<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/createProcessing"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">createProcessing</span><span class="o">(</span><span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">accountService</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">ac</span><span class="o">,</span> <span class="n">pw</span><span class="o">))</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"redirect:/login"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"redirect:/create?error"</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-3">권한설정</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span>
<span class="o">{</span>
<span class="n">http</span><span class="o">.</span><span class="na">authorizeRequests</span><span class="o">()</span>
<span class="c1">// 회원가입과 처리부분이 추가</span>
<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/login"</span><span class="o">,</span> <span class="s">"/create"</span><span class="o">,</span> <span class="s">"/createProcessing"</span><span class="o">).</span><span class="na">permitAll</span><span class="o">()</span>
<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/**"</span><span class="o">).</span><span class="na">authenticated</span><span class="o">();</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">formLogin</span><span class="o">()</span>
<span class="c1">// 로그인 처리 페이지</span>
<span class="o">.</span><span class="na">loginProcessingUrl</span><span class="o">(</span><span class="s">"/loginProcessing"</span><span class="o">)</span>
<span class="c1">// 로그인 페이지</span>
<span class="o">.</span><span class="na">loginPage</span><span class="o">(</span><span class="s">"/login"</span><span class="o">)</span>
<span class="o">.</span><span class="na">failureUrl</span><span class="o">(</span><span class="s">"/login?error"</span><span class="o">);</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">logout</span><span class="o">()</span>
<span class="c1">// /logout 을 호출할 경우 로그아웃</span>
<span class="o">.</span><span class="na">logoutRequestMatcher</span><span class="o">(</span><span class="k">new</span> <span class="nc">AntPathRequestMatcher</span><span class="o">(</span><span class="s">"/logout"</span><span class="o">))</span>
<span class="c1">// 로그아웃이 성공했을 경우 이동할 페이지</span>
<span class="o">.</span><span class="na">logoutSuccessUrl</span><span class="o">(</span><span class="s">"/"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-4">요약 - 결론</h1>
<p>회원가입시 암호를 넣을 때 로그인에 적용한 동일한 해시를 적용하시면 됩니다.</p>
<h1 id="section-5">추신</h1>
<p>처음엔 연동부부만 쓰려다가 조금 더 확장하니.... 소스가 난장판이 되었습니다.;;;;;
다듬어서 다시 쓰려고했지만... 요즘 시간이 부족하네요 ㅠㅠ...;;;</p>
</div>
<div class="hr-line pad-t-10 pad-x-4 li-4">
<ul><li>다음글: <a href="/2016/07/27/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-mustache-%EB%AC%B8%EB%B2%95-+-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%97%B0%EB%8F%99.html">[백업][가리사니] mustache 문법 + 스프링 연동</a></li><li>이전글: <a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">[백업][가리사니] spring boot security : 4. 인증 페이지뷰</a></li></ul>
</div>
<div class="pad-t-10">
<script src="https://giscus.app/client.js"
data-repo="ac-saro/ac-saro.github.io"
data-repo-id="R_kgDOKTBZgA"
data-category="General"
data-category-id="DIC_kwDOKTBZgM4CdFER"
data-mapping="url"
data-strict="1"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="bottom"
data-theme="https://gs.saro.me/assets/giscus.css"
data-lang="ko"
crossorigin="anonymous"
async>
</script>
</div>
<li><strong></strong></li>
content<div class="post title">[백업][가리사니] spring boot security : 5. 회원가입</div>
<div class="post ctrl pad-x-4">
<div class="fl-left">
java, spring
</div>
<div class="fl-right">
<a href="https://github.com/ac-saro">박용서</a> •
<a href="https://github.com/ac-saro/ac-saro.github.io/edit/publish/_posts/old/2016-07-26-[백업][가리사니] Spring boot Security : 5. 회원가입.md">2016-07-26</a>
</div>
</div>
<div class="hr-line pad-x-4 content-layout">
<blockquote>
<p>이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다.
오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.</p>
</blockquote>
<h1 id="spring-boot-security-">Spring boot Security 시리즈</h1>
<ul>
<li><a href="/2016/07/24/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-1.-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95.html">1. 설치 및 페이지 설정</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-2.-%EC%9D%B8%EC%A6%9D-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90/html">2. 인증로직을 만들어보자.</a></li>
<li><a href="/2016/07/25/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-3.-%EC%9D%B8%EC%A6%9D%EB%A1%9C%EC%A7%81-%EC%9E%A0%EC%9E%AC%EC%A0%81-%EC%9C%84%ED%97%98.html">3. 인증로직 - 잠재적 위험</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">4. 인증 페이지뷰</a></li>
<li><a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-5.-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85.html">5. 회원가입</a></li>
<li><a href="/2016/09/03/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-Security-login-(%EC%84%B1%EA%B3%B5-%EC%8B%A4%ED%8C%A8)-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88.html">부록 : Spring Security login (성공 / 실패) 이벤트 리스너 </a></li>
</ul>
<h1 id="section">뷰</h1>
<p>2장 강의에선 string 으로 뽑았던 메인페이지도 새로 만들어줍니다.
src/main/resources/templates/main.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">></span>
<span class="nt"><head></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/></span>
<span class="nt"><title></span>메인페이지<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/mypage"</span><span class="nt">></span>마이페이지<span class="nt"></a><br/></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/login"</span><span class="nt">></span>로그인<span class="nt"></a><br/></span>
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"/create"</span><span class="nt">></span>회원가입<span class="nt"></a><br/></span>
<span class="nt"></div></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<p>src/main/resources/templates/create.html</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html</span> <span class="na">xmlns:th=</span><span class="s">"http://www.typeleaf.org"</span><span class="nt">></span>
<span class="nt"><head></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">/></span>
<span class="nt"><title></span>회원가입<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div></span>
<span class="nt"><form</span> <span class="na">th:action=</span><span class="s">"@{/createProcessing}"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">></span>
<span class="nt"><h2></span>회원가입<span class="nt"></h2></span>
<span class="c"><!-- 강의를 간결하게 끝내기 위함.. 원래는 가입실패 여부를 자세히 표시해야한다 --></span>
<span class="nt"><div</span> <span class="na">th:if=</span><span class="s">"${param.error}"</span><span class="nt">></span>
계정이 중복됩니다.
<span class="nt"></div></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"ac"</span> <span class="na">placeholder=</span><span class="s">"계정"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"password"</span> <span class="na">name=</span><span class="s">"pw"</span> <span class="na">placeholder=</span><span class="s">"암호"</span> <span class="na">required=</span><span class="s">"required"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"회원가입"</span><span class="nt">/></span>
<span class="nt"></form></span>
<span class="nt"></div></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<h1 id="section-1">서비스</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Component</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AccountService</span>
<span class="o">{</span>
<span class="nd">@Autowired</span>
<span class="nc">AccountRepository</span> <span class="n">accountRepository</span><span class="o">;</span>
<span class="c1">// 리턴을 저런식으로하면 안됩니다.</span>
<span class="c1">// (무었때문에 가입 실패했는지를 적어주셔야..)</span>
<span class="nd">@Transactional</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">create</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">)</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">Account</span> <span class="n">account</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Account</span><span class="o">();</span>
<span class="n">account</span><span class="o">.</span><span class="na">setAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
<span class="n">account</span><span class="o">.</span><span class="na">setPw</span><span class="o">(</span><span class="k">new</span> <span class="nc">BCryptPasswordEncoder</span><span class="o">().</span><span class="na">encode</span><span class="o">(</span><span class="n">pw</span><span class="o">));</span>
<span class="n">account</span><span class="o">.</span><span class="na">setRole</span><span class="o">(</span><span class="s">"NORMAL"</span><span class="o">);</span>
<span class="n">accountRepository</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">account</span><span class="o">);</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">Account</span> <span class="nf">getAccount</span><span class="o">(</span><span class="nc">String</span> <span class="n">ac</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">return</span> <span class="n">accountRepository</span><span class="o">.</span><span class="na">findOneByAc</span><span class="o">(</span><span class="n">ac</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-2">컨트롤러</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">main</span><span class="o">()</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"main"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/create"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">create</span><span class="o">()</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"create"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Autowired</span>
<span class="nc">AccountService</span> <span class="n">accountService</span><span class="o">;</span>
<span class="nd">@RequestMapping</span><span class="o">(</span><span class="s">"/createProcessing"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">createProcessing</span><span class="o">(</span><span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">ac</span><span class="o">,</span> <span class="nd">@Param</span><span class="o">(</span><span class="s">"ac"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">pw</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">accountService</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">ac</span><span class="o">,</span> <span class="n">pw</span><span class="o">))</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"redirect:/login"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
<span class="k">return</span> <span class="s">"redirect:/create?error"</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-3">권한설정</h1>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="nc">HttpSecurity</span> <span class="n">http</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span>
<span class="o">{</span>
<span class="n">http</span><span class="o">.</span><span class="na">authorizeRequests</span><span class="o">()</span>
<span class="c1">// 회원가입과 처리부분이 추가</span>
<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/login"</span><span class="o">,</span> <span class="s">"/create"</span><span class="o">,</span> <span class="s">"/createProcessing"</span><span class="o">).</span><span class="na">permitAll</span><span class="o">()</span>
<span class="o">.</span><span class="na">antMatchers</span><span class="o">(</span><span class="s">"/**"</span><span class="o">).</span><span class="na">authenticated</span><span class="o">();</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">formLogin</span><span class="o">()</span>
<span class="c1">// 로그인 처리 페이지</span>
<span class="o">.</span><span class="na">loginProcessingUrl</span><span class="o">(</span><span class="s">"/loginProcessing"</span><span class="o">)</span>
<span class="c1">// 로그인 페이지</span>
<span class="o">.</span><span class="na">loginPage</span><span class="o">(</span><span class="s">"/login"</span><span class="o">)</span>
<span class="o">.</span><span class="na">failureUrl</span><span class="o">(</span><span class="s">"/login?error"</span><span class="o">);</span>
<span class="n">http</span>
<span class="o">.</span><span class="na">logout</span><span class="o">()</span>
<span class="c1">// /logout 을 호출할 경우 로그아웃</span>
<span class="o">.</span><span class="na">logoutRequestMatcher</span><span class="o">(</span><span class="k">new</span> <span class="nc">AntPathRequestMatcher</span><span class="o">(</span><span class="s">"/logout"</span><span class="o">))</span>
<span class="c1">// 로그아웃이 성공했을 경우 이동할 페이지</span>
<span class="o">.</span><span class="na">logoutSuccessUrl</span><span class="o">(</span><span class="s">"/"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h1 id="section-4">요약 - 결론</h1>
<p>회원가입시 암호를 넣을 때 로그인에 적용한 동일한 해시를 적용하시면 됩니다.</p>
<h1 id="section-5">추신</h1>
<p>처음엔 연동부부만 쓰려다가 조금 더 확장하니.... 소스가 난장판이 되었습니다.;;;;;
다듬어서 다시 쓰려고했지만... 요즘 시간이 부족하네요 ㅠㅠ...;;;</p>
</div>
<div class="hr-line pad-t-10 pad-x-4 li-4">
<ul><li>다음글: <a href="/2016/07/27/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-mustache-%EB%AC%B8%EB%B2%95-+-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%97%B0%EB%8F%99.html">[백업][가리사니] mustache 문법 + 스프링 연동</a></li><li>이전글: <a href="/2016/07/26/%EB%B0%B1%EC%97%85-%EA%B0%80%EB%A6%AC%EC%82%AC%EB%8B%88-Spring-boot-Security-4.-%EC%9D%B8%EC%A6%9D-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B7%B0.html">[백업][가리사니] spring boot security : 4. 인증 페이지뷰</a></li></ul>
</div>
<div class="pad-t-10">
<script src="https://giscus.app/client.js"
data-repo="ac-saro/ac-saro.github.io"
data-repo-id="R_kgDOKTBZgA"
data-category="General"
data-category-id="DIC_kwDOKTBZgM4CdFER"
data-mapping="url"
data-strict="1"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="bottom"
data-theme="https://gs.saro.me/assets/giscus.css"
data-lang="ko"
crossorigin="anonymous"
async>
</script>
</div>
<li><a href=""></a></li>
주석
상위선택
- 상위를 선택하는 문법이 한정적임
- 이렇게 사용할 경우 items 안에 해더가 없을때 한단계 위 해더가 선택된다.
- 단계별로 올라가도 끝내 해더가 나오지 않을 경우 빈값
포함 : include
- 해당 경로에 있는 템플릿을 결합합니다.
스프링에서 적용하기
메이븐 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
src/main/resources/templates/test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title></title>
</head>
<body>
<div>
</div>
</body>
</html>
컨트롤러
@RequestMapping("/")
public String root(Model model)
{
model.setAttribute("title", "타이틀 테스트");
model.setAttribute("msg", "Hello!!");
return "test";
}
연동이 안되는 경우는 아래와 같이 리졸버를 등록해보세요.
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
MustacheViewResolver resolver = new MustacheViewResolver();
resolver.setCharset("UTF-8");
resolver.setContentType("text/html;charset=UTF-8");
resolver.setPrefix("classpath:/templates/");
resolver.setSuffix(".html");
registry.viewResolver(resolver);
}
}