'[Grails] 게시판 만들기'에 해당되는 글 4

  1. 2014.01.27 [Grails] 게시판 만들기 8 - 메세지 한글 처리
  2. 2014.01.23 [Grails] 게시판 만들기 7 - 사용자 정보 연결
  3. 2012.12.30 [Grails] 게시판 만들기 6 - 인증
  4. 2012.12.29 [Grails] 게시판 만들기 1

[Grails] 게시판 만들기 8 - 메세지 한글 처리


- 기본 메세지 파일을 복사해서 한글 메세지 파일을 만든다.
grails-app\i18n\messages_ko.properties

...
default.paginate.prev=이전
default.paginate.next=다음
...
default.deleted.message={0}이(가) 삭제되었습니다.
...
default.home.label=Home
default.list.label={0} 목록
default.add.label=Add {0}
default.new.label=새 {0}
default.create.label=Create {0}
default.show.label={0} 보기
default.edit.label={0} 수정
...
entry.label=글
entry.title.label=제목
entry.lastUpdated.label=일시
entry.content.label=내용
entry.user.label=글쓴이
entry.comments.label=댓글
entry.tags.label=태그

comment.label=댓글
...

[Grails] 게시판 만들기 7 - 사용자 정보 연결

글을 입력할 때 세션의 사용자 정보가 들어가도록 해보자.

- Entry에 User 추가, nullable:false

- EntryController 수정
grails> generate-controller com.sample.blog.Entry
class EntryController {
    def scaffold = Entry

    def save() {
        def entryInstance = new Entry(params)
        entryInstance.user = session.user //
        if (!entryInstance.save(flush: true)) {
            render(view: "create", model: [entryInstance: entryInstance])
            return
        }
        flash.message = message(code: 'default.created.message', args: [message(code: 'entry.label', default: 'Entry'), entryInstance.id])
        redirect(action: "show", id: entryInstance.id)
    }
}

User를 test라는 사용자로 입력했는데 실제 입력된 데이터는 admin이다.
그러나 수정하는 경우에는 update()가 실행되므로 EntryController를 수정해야 한다.

- 입력화면에서 보이지 않게 하려면 display를 false로 둔다.  EntryController#update()를 수정하지 않아도 된다.
grails> generate-views com.sample.blog.Entry
entry/_form.gsp에서 User 부분을 없앤다.


이 상태에서 GSP를 만들지 않고 수정 화면에서 user가 보이게 하는 방법

[Grails] 게시판 만들기 6 - 인증

- 권한을 설정해서 인증 과정을 통과한 사용자만 글쓰기를 하도록 한다.
권한을 설정하는 방법은 많지만 필터를 사용한다.   =-=>이 방법들 조사해서 정리하고 링크!!!

- 필터 생성
grails> create-filters com.sample.auth.security
class SecurityFilters {
    def filters = {
        checkLogin(controller:'*', action:'*') {
            before = {
				if(session.user){
					return true
				}
                if(controllerName == null && actionName == null){
                    //첫 페이지 호출은 제외
				}else if(actionName == "login" || actionName == "authenticate" || actionName == "logout"){
					//로그인 페이지 호출은 제외
				}else{
                    //redirect(controller:"user", action:"login")
                    render "You're not authenticated"
                    return false
                }
            }
        }
    }
}

- 사용 도메인 생성
grails> create-domain-class com.sample.auth.User
grails> create-controller com.sample.auth.User
class User {
	
	String userId
	String password

    static constraints = {
		userId(blank:false, unique:true)
		password(blank:false, password:true)
    }

	String toString(){
		userId
	}
}
class UserController {

	def scaffold = User

    def login() { }

	def authenticate(){
        def user = User.findByUserIdAndPassword(params.userId, params.password)
        if(user){
            session.user = user
            flash.message = "Hello ${user.userId}!"
        }else{
			user = new User(params)
			flash.message = "Sorry, ${params.userId}. Please try again."
		}		
		render(view: "login", model: [userInstance:user])
	    //redirect(action:"login")
	}

	def logout(){
		flash.message = "Goodbye ${session.user.userId}"
        session.user = null
        redirect(action:"login")
	}
}
- login.gsp를 만든다.
grails> generate-views com.sample.auth.User
create.gsp를 login.gsp로 바꾼다. 몇군데 수정
필터에서 리다이렉트 시킨다.
<%@ page import="com.sample.auth.User" %>
<!DOCTYPE html>
<html>
	<head>
		<meta name="layout" content="main">
		<g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" /><!--//fixme=필요있나?-->
		<title><g:message code="login.label" default="Login" /></title>
	</head>
	<body>
		<a href="#create-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a><!--//fixme=필요있나?-->
		<div class="nav" role="navigation">
			<ul>
				<li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li>
				<li><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></li>
				<li><g:link class="list" action="logout"><g:message code="logout.label" default="Logout" /></g:link></li><!--//fixme=여기에 로직을 넣어야 하는데...이래도 되나?-->
			</ul>
		</div>
		<div id="create-user" class="content scaffold-create" role="main">
			<h1><g:message code="login.label" default="Login" /></h1>
			<g:if test="${flash.message}">
			<div class="message" role="status">${flash.message}</div>
			</g:if>
			<g:hasErrors bean="${userInstance}">
			<ul class="errors" role="alert">
				<g:eachError bean="${userInstance}" var="error">
				<li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li>
				</g:eachError>
			</ul>
			</g:hasErrors>
			<g:form action="authenticate" >
				<fieldset class="form">
					<g:render template="form"/><!-- 지우고 아래 부분을 추가 -->
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'userId', 'error')} required">
	<label for="userId">
		<g:message code="user.userId.label" default="User Id" />
		<span class="required-indicator">*</span>
	</label>
	<g:textField name="userId" required="" value="${userInstance?.userId}"/>
</div>

<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'password', 'error')} required">
	<label for="password">
		<g:message code="user.password.label" default="Password" />
		<span class="required-indicator">*</span>
	</label>
	<g:field type="password" name="password" required="" value="${userInstance?.password}"/>
</div>
				</fieldset>
				<fieldset class="buttons">
					<g:submitButton name="login" class="save" value="${message(code: 'login.label', default: 'Login')}" />
				</fieldset>
			</g:form>
		</div>
	</body>
</html>

- Bootstrap에 User 데이터를 넣어둔다. =-=>[todo] Bootstrap관련 글 하나 쓰고 거기로 다 모아. 그리고 링크

- http://localhost:8080/blog/entry/index를 요청하면 http://localhost:8080/blog/user/login으로 이동한다.






[Grails] 게시판 만들기 1

- 시작
> mygrails create-app blog
> cd blog
> grails //start mygrails
grails> create-domain-class com.sample.blog.Entry
grails> create-controller com.sample.blog.Entry
grails> run-app

- 스캐폴딩
EntryContoller를 클릭하면 404에러가 난다.
EntryContoller.groovy
class EntryContoller{
	def scaffold = Entry
}

다시 호출해본다.
아직은 입력 필드가 없다.

- 도메인 생성
Entry.groovy
class Entry{
	String title
	String content

	static constraints = {
		title(blank:false)
		content(blank:false)
	}
}




- stats 로 확인