Rodauth와 Hanami 통합 과정
Rodauth는 Roda 위에 구축되어 있으므로, Roda 앱에서는 간단하게 플러그인으로 추가할 수 있습니다. Hanami 앱에서는 Roda를 미들웨어로 활용하여 Rodauth를 통합합니다.
- AuthenticationApp (Roda 앱):
plugin :middleware및plugin :rodauth를 사용하여 인증 기능을 정의합니다.env["rodauth"] = rodauth를 통해 Rodauth 인스턴스를 Rack 환경에 노출합니다.r.rodauth를 통해 Rodauth 라우트를 처리합니다.
- Hanami 라우트:
Hanami::Routes내에서use Main::AuthenticationApp을 사용하여 Rodauth 라우트를 노출하고 요청을 처리하게 합니다. 인증 관련 요청은 Rodauth가, 그 외는 Hanami 라우터가 처리합니다.
- 인증된 액션 (Authenticated Action):
Main::Actions::Authenticated클래스를 생성하여before :require_authentication콜백을 정의합니다.- 이 콜백은
request.env["rodauth"]에서 Rodauth 인스턴스를 가져와rodauth.require_account를 호출하여 사용자 인증을 요구합니다. handle_rodauth_redirect메서드를 통해 Rodauth가 시작한 리다이렉션을 Hanami 액션이 처리하고, 플래시 메시지를 Hanami의 플래시 객체로 전달합니다.
Rodauth 기능 및 설정
Rodauth는 50개 이상의 다양한 기능을 제공하며, Decaf Sucks 앱에서는 다음과 같은 기능을 활성화했습니다:
create_account,verify_account,login,logout,remember,reset_passwordchange_login,verify_login_change,change_password,change_password_notify
이러한 기능들은 기본적으로 연동되지만, 높은 설정 유연성을 통해 맞춤형 경험을 제공합니다:
- URL 사용자 정의:
login_route,logout_route등을 사용하여 원하는 URL 경로를 설정합니다. - 리다이렉션 제어:
login_return_to_requested_location?,logout_redirect,already_logged_in등을 통해 리다이렉션 동작을 조정합니다. - 계정 생성 로직 확장:
before_create_account,after_create_account훅을 사용하여 계정 생성 시 사용자 이름(name) 필드를 처리하고users테이블에 저장합니다. - 기본 동작 변경:
after_login에서remember_login을 호출하여 세션 간 로그인 유지를 활성화하고,require_password_confirmation? false,verify_account_set_password? false등으로 기본 동작을 변경합니다. - 텍스트 메시지 사용자 정의: 로그인, 로그아웃, 계정 생성 등 다양한 화면의 텍스트를 커스터마이징합니다.
데이터베이스 준비 및 Hanami 연동 최적화
Rodauth는 기능별로 분리된 데이터베이스 테이블을 사용하며, 보안 강화를 위한 기본 설정이 있지만, 이 글에서는 단순화를 위해 account_password_hash_column :password_hash와 use_database_authentication_functions? false 설정을 통해 일반적인 방식으로 패스워드 해시를 관리합니다. 또한, 사용자 정보를 저장하기 위해 accounts 테이블과 연결되는 별도의 users 테이블을 유지합니다.
Hanami 앱과의 완벽한 연동을 위해 enable :hanami 기능을 활성화하여 Rodauth 뷰를 Hanami 뷰 시스템 내에서 렌더링하도록 설정합니다. 이를 통해 Rodauth 페이지가 앱의 레이아웃과 디자인을 따르고, Hanami 뷰의 모든 기능을 활용할 수 있게 됩니다.