[개인 노트] 파드리노-warden과 파드리노-admin으로 인증을 하겠습니다.

11232 단어 wardenPadrinoRuby

Padrino로 인증 메커니즘을 쉽게 구축하고 싶어요...


Padrino에서 제작한 응용 프로그램에서 사용Padrino-admin
사용자 인증을 하면 편할 것 같아요.
padrino-warden 찾았어요. 그래서 썼어요.
OmniAuth 그렇지 않은 것도 있을 것 같아서 써봤어요.

각 요소


Padrino


말 안 해도 돼...
sinatra의 자신이 좋아하는 웹 Application Framework를 기반으로 합니다.

Warden


warden
Rack Middleware를 사용하는 WAF에서 사용할 수 있는 인증 라이브러리입니다.

Padrino-warden


padrino-warden Padrino에서 Warden 사용 가능
헬퍼가 추가돼 손쉽게 이용할 수 있다.

Padrino-admin


Padrino 제품에 포함
관리자 화면 만드는 거.
scaffold에서 padrino g admin,
padrino 프로젝트에 scaffold를 실행하면admin 화면을 만들 수 있습니다.
그렇구나.

padrino-admin 환경을 구축할 때까지


파드리노 가입


뭐, 전 세계에 설치하면 쉬울 거야.
> gem install padrino -V

generator로 빠르게 만들기

> padrino g project test-padrino-warden -t rspec -e haml -m mocha -s jquery -d activerecord -c sass
> cd test-padrino-warden
> bundle ins --path vendor/bundle

admin 응용 프로그램 만들기


Padrino-admin을 다른 응용 프로그램으로 사용
Padrino 옆에 Padrino-admin을 설치합니다.
응, scaffold를 쓰면 돼.
> cd test-padrino-warden
> padrino admin

DB migrate


DB 마이그레이션
> bundle
> bundle ex db:create
> bundle ex db:marge

Admin을 만든 사용자


아래의 Rake task로 제작할 수 있습니다.
> bundle ex db:seed

padrino-admin 확인


프로그램을 시작하여padrino-admin에 대한 접근을 확인합니다.
> bundle ex rackup
> open http://localhost:9292/admin/sessions/new

OK.

warden과padrino-admin의 연결


Warden 등을 설치하다


Gemfile에padrino-warden을 천천히 설치합니다
추서해 두다.
루비게이지로 얻은padrino-warden 버전이 구버전(0.1.0)입니다.
github에서 마스터 브랜치를 얻습니다.

Gemfile
gem 'padrino', '0.12.2'
gem 'padrino-warden', :github => 'jondot/padrino-warden'
> bundle

app.rb에 대한 Warden provide 대응


generator에서 만든 앱입니다.함께
보충의 결과를 나타내는 diff.
--- app.rbx 2014-07-12 19:07:15.000000000 +0900
+++ app.rb  2014-07-13 09:58:03.000000000 +0900
@@ -4,9 +4,36 @@
     use ActiveRecord::ConnectionAdapters::ConnectionManagement
     register Padrino::Mailer
     register Padrino::Helpers
+    register Padrino::Warden
+    register Padrino::Warden::Helper

     enable :sessions

+    set :auth_failute_path, '/sessions/login'
+    set :auth_success_path, '/'
+
+    Warden::Strategies.add(:password) do
+      def valid?
+        params['email'] || params['password']
+      end
+
+      def authenticate!
+        account = Account.authenticate(
+          params['email'], params['password']
+        )
+        account.nil? ? fail!('Invalid username of password') : success!(account)
+      end
+    end
+
+    Warden::Manager.serialize_into_session { |account| account.email }
+    Warden::Manager.serialize_from_session { |email| Account.where(email: email) }
+
+    before do
+      unless request.path == '/sessions/login'
+        return redirect '/sessions/login' unless authenticated?
+      end
+    end
+
     ##
     # Caching support.
     #

layouts/aplication template 만들기


제작${root}/app/views/layouts/application.haml.
application.haml
%html
  %head
    %meta{:charset => "utf-8"}
    = stylesheet_link_tag '//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css'
    = javascript_include_tag '//code.jquery.com/jquery-2.1.1.min.js'
    = javascript_include_tag '//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js'
    %title
      Test - Padrino Warden -
  %body
    .navbar.navbar-default{ role: 'navigation' }
      .container-fluid
        .navbar-header
          %a{ class: 'navbar-brand'}
            Test - Padrino Warden -
        .collapse.navbar-collapse
          %ul.nav.navbar-nav.navbar-right
            %li
              %a{ href: "#" }
                - if authenticated?
                  = "#{current_user.first.name} としてログイン"
                - else
                  ログインしてません...
            - if authenticated?
              %li
                %a{ href: "/sessions/logout" }
                  ログアウトする

    = yield

sessions/login template 만들기


제작${root}/app/views/sessions/login.haml.
login
.container
  %h1
    login

  = form_tag('/sessions/login', id: 'sessions_login', method: 'post', role: 'form', role: 'form') do
    .form-group
      %label.label(for='email') Login
      = text_field_tag :email, type: 'email', class: 'form-control', value: params[:email]
    .form-group
      %label.label(for='password') Password
      = password_field_tag :password, class: 'form-control'

    = submit_tag('Sign in', class: 'btn btn-default')

Top 페이지 만들기


index controller를 만듭니다.이름은 그거...
> padrino g controller index

index controller 정리


app/controllers/index.rb
TestPadrinoWarden::App.controllers :index do
  get :index do
    render :index
  end
end

index/index.만들다


index.haml
.container
  %h1
    Welcome to underground...

등록된 실험


테스트를 위해 Padrino의 응용 프로그램을 시작합니다.

응용 프로그램 시작


Rackup을 통해 시작합니다.
> bundle ex rackup

브라우저로 응용 프로그램에 액세스합니다.

> open http://localhost:9292/
로그인 페이지가 열립니다.

e-메일 주소 및 암호를 입력하고
Sign in 버튼을 누르면 index 페이지가 열립니다.

시용해 보다


계정을 쉽게 추가할 수 있습니다
롤을 추가할 수도 있어요.협조할 수 있어서 편해요.
Warden의 삽입용padrino-warden은 순조롭게 진행될 수 있습니다.
current_user.first.role
등도 롤을 얻을 수 있고 다양한 것을 사용할 수 있다.

성과물


다음 저장소에 추가되었습니다.

좋은 웹페이지 즐겨찾기