2012. 1. 18. 08:20 IT

Jump Into Grails 2.0 스크린캐스트 ( http://grails.org/screencast/show/31 ) 를 따라해봄
 

1. 플러그인 추가
 

conf/BuildConfig.groovy
---------------------------
    plugins {
                ... 
runtime ":spring-security-core:1.2.7"
                ... 
    }

2. compile을 이용하여 플러그인 자동설치 
>grails compile

실행이 잘되면 "s2-quickstart" script를 실행하라는 메세지가 나온다. 

cf) 여기서 제대로 안되고 다운로드를 실패하면 바로 이전 글 "Grails에서 플러그인 설치실패" http://pffm.tistory.com/273  내용을 참고바람.

3. spring security 초기화 및 도메인 클래스 생성 
다음과 같이 실행하여 초기화 및 도메인 클래스를 생성하는 작업을 수행한다. 
>grails s2-quickstart org.example.demo User Role
 
작업이 끝나면 conf/Config.groovy 에 수정이 반영되었으니 확인하라는 메세지가 나온다. 

하단에 세줄이 추가된 것을 알 수 있다. 
conf/Config.groovy
 
---------------------------
grails.plugins.springsecurity.userLookup.userDomainClassName = 'org.example.demo.User'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'org.example.demo.UserRole'
grails.plugins.springsecurity.authority.className = 'org.example.demo.Role'

여기에 한줄 더 추가 입력 (로긴 성공시 기본으로 갈 Url)
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/home' 


4. 테스트용 컨트롤러 생성
이제  home 과  publiccontroller 를 만들고.. 
>grails create-controller home
>grails create-controller  public


5. 각각 컨트롤러의 접근 권한을 다르게 부여

- 접근 권한이 불필요한곳
class PublicController{
    def index() { render 'public' }

- 명시적으로 접근권한 부여 (Secured annotation 사용)
import grails.plugins.springsecurity.Secured
@Secured(['ROLE_USER'])
class HomeController {
    def index() { render 'home' }

    @Secured(['ROLE_ADMIN'])
    def adminOnly() { render 'admin' }
}


6. 부트스트랩에 USER, ROLE  사전 등록작업  
 conf/BootStrap.groovy
--------------------------
 import org.example.demo.* // import 문 추가 
...
    def init = { servletContext ->   // init 안에 추가 
        // admin Role과 userRole 을 생성 
def adminRole = Role.findByAuthority('ROLE_ADMIN') ?: new Role(authority: 'ROLE_ADMIN').save(failOnError: true)
def userRole = Role.findByAuthority('ROLE_USER') ?: new Role(authority: 'ROLE_USER').save(failOnError: true)

        // user role을 가진 bobby와 admini role을 가진 adminuser를 생성  
def user1 = User.findByUsername('bobby') ?: new User(username: 'bobby', enabled:true, password: 'pass').save(failOnError: true)
if(!user1.authorities.contains(userRole)){
UserRole.create user1, userRole, true
}
def user2 = User.findByUsername('admin') ?: new User(username: 'adminuser', enabled:true, password: 'pass').save(failOnError: true)
        if(!user2.authorities.contains(userRole)){ UserRole.create user2, userRole, true }
        if(!user2.authorities.contains(adminRole)){ UserRole.create user2, adminRole, true } 
 
 7. 확인작업
>grails run-app
 | Server running. Browse to http://localhost:8080/demo

1) http://localhost:8080/demo/public 은 로그인 없이 접근 OK
2) http://localhost:8080/demo/home 은 로그린 화면으로 redirection
3) bobby 로그인 후 http://localhost:8080/demo/home/index 접근 OK
4) bobby 로그인 후 http://localhost:8080/demo/home/adminOnly 접근 불가
5) adminuser 로그인 후  http://localhost:8080/demo/home/adminOnly 접근 OK

8. User에 필드 추가하기 (option)
도메인 클래스만 손보면 알아서 추가해줌... (당연한거잖아.. )

ex) 사용자 정보에 nick 을 추가한다면.. 
User.groovy 
----------------
String nick; // 사용자 정보에 nick 필드 추가 

// 참고로 마지막  encodePassword 메소드를 보면 password 필드를 암호화처리해주고 있음을 알 수 있다.
 
물론..  BootStrap.groovy 안에서도 유저 생성할때 nick 을 추가해주세요. 
... new User(username: 'nickuser', enabled:true, password: 'pass', nick: 'blah blah')  

cf) BootStrap 파일을 수정할 경우에는 grails를 재시작 해주어야 합니다. 당연하긴 하지만.. 뭔가 BootStrap도 재기동 할수 있는 기능을 제공해 해줬으면... 


기타.

1. 한글 문제
한글을 BootStrap.groovy 에 넣어보았는데 안되더라. 원인은 .groovy 파일을 UTF-8 로 저장하지 않아서.  
혹시 이걸로 해결이 안된다면 다음 링크를 참조하세요.  
http://jgrasstechtips.blogspot.com/2008/05/how-to-learn-new-groovy-friend-italian.html 
comment를 보면 JAVA_OPTS 에 groovy.source.encoding 을 전달하라는 이야기가 나온다. 

2.  LDAP, ActiveDirectory 연계는?
찾아보니.. 
spring-security-ldap 플러그인이 제공된다. 


마치며... 
 
이걸 더 진행시킬 기회가 올지는 잘 모르겠다. 아마 힘들듯... 

비교할 자리는 아니지만...

grails와 playframework을 다시 생각해보면 grails는 위와같이 spring 위에 올라탄 느낌을 편리하게 제공해준다.

일단 groovy에 익숙해진다면 플러그인을 직접 만드는 것도 그리 어려워보이지 않는다.

하지만 편리함 뒤에는 내부의 복잡함이 지나치게 숨겨진게 아닌가 싶기도 하다.
 
반면 playframework은 java 고유의 호흡법을 유지할 수 있다는 장점과 컴팩트함을 장점으로 가지는 것 같다. 

물론 다시 안을 들여다 보게 된다면 SCALA의 무덤에 기겁을 할 지도 모른다... (뭘 그리 겁내냐!) 


아무튼...  개인 신변이 조금 정리되어 이제 다시 링크... 
posted by smplnote