🔐

RedmineでGoogle認証を使い、通常の認証を隠す

2021/01/15に公開

RedmineでGoogle認証を設定したあとでも、通常のログインフォームがあって邪魔だったので、view customize plugin を使って隠したときのメモ。

プラグインは 日本語化されたものがあったので、こっちを使っている。

  • パスのパターン /login(\?.+)?$
  • 挿入位置 全ページの末尾
  • 種別 JavaScript
+function(){
  const elements = [document.getElementById('login-form'), document.getElementsByClassName("register")[0]]
  const li = document.createElement("li")
  li.onclick=function(){elements.forEach(function(e){e.style["display"]="block"})}
  li.innerText="$"
  document.getElementById("top-menu").getElementsByTagName("ul")[0].appendChild(li)
  elements.forEach(function(e){e.style["display"]="none"})
}()

右上隅にひっそりとおいてある $ をクリックしたら復元できるようにしてある。


リダイレクトで戻ってきたページのpasswordも邪魔なので、埋めておこう。

  • パスのパターン /oauth2callback?.*
  • 挿入位置 全ページの末尾
  • 種別 JavaScript
+function(pw){
  ["user_password", "user_password_confirmation"].forEach(function(id){
    const e = document.getElementById(id);e.value=pw;e.disabled=true;
  })
}("@Aa"+Math.random())

IE11 11.0.220 と Chrome 88.0.4324.96 で動作確認済み。

Google Apps ではなく Cloud Identity を使う場合

Cloud Identity のメールアドレスはメールが届かず、別のアドレスに書き換えがち。
書き換えないでねーというのは簡単だが、書き換えても大丈夫なように修正しておく。

redmine_oauth_controller.rb
--- a/app/controllers/redmine_oauth_controller.rb
+++ b/app/controllers/redmine_oauth_controller.rb
@@ -38,7 +38,8 @@ class RedmineOauthController < AccountController
   def try_to_login info
    params[:back_url] = session[:back_url]
    session.delete(:back_url)
-   user = User.joins(:email_addresses).where(:email_addresses => { :address => info["email"] }).first_or_create
+   login = parse_email(info["email"])[:login]+"@"+parse_email(info["email"])[:domain]
+   user = User.where(:login => login).first_or_create
     if user.new_record?
       # Self-registration off
       redirect_to(home_url) && return unless Setting.self_registration?
@@ -47,8 +48,7 @@ class RedmineOauthController < AccountController
       user.firstname ||= info[:given_name]
       user.lastname ||= info[:family_name]
       user.mail = info["email"]
-      user.login = parse_email(info["email"])[:login]
-      user.login ||= [user.firstname, user.lastname]*"."
+      user.login = parse_email(info["email"])[:login]+"@"+parse_email(info["email"])[:domain]
       user.random_password
       user.register

これも入れておこう
Update last_login date when login

GitHubで編集を提案

Discussion