Ruby On Rails/작은 팁2011/02/01 10:04
devise는 restful-authentication과 유사한 놈이라고 생각하면 된다.
readme에 약간의 레퍼런스가 제공되며 github의 wiki에 예제들이 제공되고 있다.
물런 rdoc도 있다.

1. devise Gem Download & Install
Gemfile
gem 'devise', '1.1.3'
Rails 2 사용자는 Rails 2용 최신 Version을 찾아서 넣어주면 되고, Rails 3유저라면 구지 버전을 적어줄 필요는 없다.
bundle install


2. devise Install
rails g devise:install
딸랑 2개의 파일만 만든다.
config/initializers/devise.rb
config/locales/devise.en.yml
devise:install를 해줘야 generator가 추가가 된다.

environment/development.rb
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
추가


3. devise Initialize
rails g devise User
User Model과 Migration을 생성하고 Routes.rb파일에 관련 route가 추가된다.


4. Ready
user.rb에 들어가보면 
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
이 기본적으로 적혀져 있고
# :token_authenticatable, :confirmable, :lockable and :timeoutable
들은 제외되어 있다.
만약 제외되어 있는 이 옵션들을 사용하고 싶다면 migration파일(create_user)
의 해당 옵션들 주석도 제거를 해주어야 한다.

각 옵션들에 대한 설명은 README에 있다. 
해석은 알아서..
  • Database Authenticatable: encrypts and stores a password in the database to validate the authenticity of anuser while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication.
  • Token Authenticatable: signs in a user based on an authentication token (also known as "single access token"). The token can be given both through query string or HTTP Basic Authentication.
  • Omniauthable: adds Omniauth (github.com/intridea/omniauth) support;
  • Confirmable: sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in.
  • Recoverable: resets the user password and sends reset instructions.
  • Registerable: handles signing up users through a registration process, also allowing them to edit and destroy their account.
  • Rememberable: manages generating and clearing a token for remembering the user from a saved cookie.
  • Trackable: tracks sign in count, timestamps and IP address.
  • Timeoutable: expires sessions that have no activity in a specified period of time.
  • Validatable: provides validations of email and password. It’s optional and can be customized, so you’re able to define your own validations.
  • Lockable: locks an account after a specified number of failed sign-in attempts. Can unlock via email or after a specified time period.
  • Encryptable: adds support of other authentication mechanisms besides the built-in Bcrypt (the default).

모든 설정이 완료가 되면 상큼한 마음으로 rake
rake db:migrate


5. Setting
migration까지 했으니, 비로서 사용이 가능하다.
하지만 입맛에 맞게 사용할려면 수정 작업이 필요하다.
각종 url이 [:model_name]/sign_in 형식이라 초기 로그인 url이 users/sign_in임으로 관련된 views도 수정을 해주어야 한다.

5.1 Routes.rb
  devise_for :users do
    get 'signin' => 'devise/sessions#new'
    post 'signin' => 'devise/sessions#create'
    get 'signout' => 'devise/sessions#destroy'
    
    get 'signup' => 'devise/registrations#new'
    post 'signup' => 'devise/registrations#create'
  end
여기서 단점은 devise가 기본적으로 사용하는 path들을 overwrite할 수 없으므로, 모든 view파일에 가서 path를 수정해줘야 한다.
예를들어 로그인같으면
<%= link_to new_user_session_path%>
<%= link_to signin_path%>
로 일일이 하나하나 찾아서 수정을 해줘야 하는것이다.

물런 안해줘도 그만. 
하지만 난 url 하나하나에 의미를 부여하고 목숨같이(는 아니지만..) 여기기 때문에, url 구조는 절대 포기할 수 없다.
이것역시 중요한 사용자 경험이라 생각하기 때문에!!

암튼, 중요한 사용자 경험때문에 코드를 전부 수정하는 삽질을 할것이냐?
다행스럽게도 해결책이 존재한다.
  devise_for :users
  devise_scope :user do
    get 'signin' => 'devise/sessions#new', :as => :new_user_session
    post 'signin' => 'devise/sessions#create', :as => :user_session
    get 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session
    
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration
    post 'signup' => 'devise/registrations#create', :as => :user_registration
  end
이런식으로 overwrite를 하는것이다. 뭐 일종의 꽁수이다.

5.2 password length
devise의 자체적인 설정같은 경우는 /config/initializers/devise.rb 에 거의 다 있으며, password lenth또한 마찬가지로 이곳에 있다.
config.password_length = 6..20

5.3 Views
gem에서 View 파일을 불러오는 형태여서, 프로젝트 디렉토리에 파일이 존재하지 않는다.
rails g devise:views users
해주면 /app/views/users 에 각종 view 파일들이 생기게 되고,

/config/initializers/devise.rb
config.scoped_views = true
해주면 gem에서 views를 땡겨오는게 아니라, 프로젝트 디렉토리에 있는 views를 사용하게 되므로, 입맛에 맛게 수정하면 된다.

5.4 login id
로그인을 email이 아닌 id로 받을려면 몇가지 수정 작업을 해주어야 한다.
devise는 email 정보만 받고 있으므로, user에 login_id를 추가해줘야 한다.
여기서는 field명을 name으로 하겠다.
rails generate migration add_name_to_users name:string
rake db:migrate

추가해준 name을 model에 등록 한다.
user.rb
attr_accessible :name

그리고 devise에 로그인시 email이 아닌 name을 사용할것이라고 알려줘야 한다.
/config/initializers/devise.rb
config.authentication_keys = [ :name ]
authentication_keys를 :name으로 등록을 해준다.

마지막으로 login form(in views)에 email이 아닌 name으로 id입력을 받도록 수정해주면 된다.

5.5 controller customized (after signup)
얼마전 찾아보니, 1.2.rc에 이 기능이 추가되었다고 한다. https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)
아래 쓴 내용은 이제 필요 없을듯. 

더보기


6. Usage
6.1 restful-authentication에서 login_reqired와 같은 역활을 하는 authenticate_user!
before_filter :authenticate_user!

6.2 로그인 여부
user_signed_in?

6.3 현재 유저
current_user

6.4 session route path_name
(#action_name)user_session

6.5 Sample
<% if user_signed_in? %>
  <%= link_to('Logout', destroy_user_session_path) %>        
<% else %>
  <%= link_to('Login', new_user_session_path)  %>  
<% end %>
<br />
  User: 
  <% if current_user %>
    <%= current_user.email %>
  <% else %>
    (not logged in)
  <% end %>
</li>
restful-authentication의 _user_bar 같은 녀석이 과거에는 menu라는 디렉토리에 제공이 되었었는데, 버전업이 되면서 사라졌나보다. 해당 코드는 아래 링크서 확인할 수 있으므로 Copy&Paste해서 쓸 사람은 쓰면 될듯.


7. Conclusion
7.1 장점
devise코드는 다 감추어져있어, 프로젝트에서 코드와 파일이 깔끔해진다.
필요한 부분만 customizing이 가능하다.

7.2 단점
controller를 customizing할때는 직접 파일을 만들어서 해야 한다.
customize할려면 restful-authentication보다 손이 많이 간다.

7.3 총평 
일반적인 유저 시스템이라면 아주 유익하지만,
로그인 및 회원가입 프로세스상 수정이 필요할 경우, 이를 customize하는게 좀 불편할 수 있음.


8. 참조 URL

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/181 관련글 쓰기

댓글을 달아 주세요