プロジェクト

全般

プロフィール

QA #946

奈良 裕記 さんが約5年前に更新

h3. ■現象/要望 

 Redmineでは、PJ間で共用するカスタムクエリの作成及び編集操作は、adminのみ可能に設計されている。(Redmine3.4, 4.0時点) 

 この事は、結果的に下記問題を招く場合がある(特に大規模環境) 
 ・adminへの作業負荷集中 
 ・admin権限割当者の増加 
 ・PJ間共用カスタムクエリの作成/編集機能は、ユーザで作業完結しないため、積極的に利用されない。 
 (adminにいちいち頼まなければならないため心理的障壁になる) 
 これにより、同一カスタムクエリを各PJで個別に作成→作業負荷増加、作業ミス増加 

 この対応として、PJ間共用カスタムクエリをadmin以外が作成/編集可能としたい。 

 なお、カスタムクエリのPJ間共用自体については、 #250 参照(PJのRole指定利用) 

 h3. ■解決策 

 操作者=カスタムクエリ作成者の場合、admin同様に無条件にカスタムクエリを編集可能とする処理を追加する。 
 カスタムクエリの表示制御は、各PJのロール割当により行う。(現行機能) 

 h4. ■Redmine本体のコード変更 

 下記3ファイル-4行の変更で可能 
 app/models/query.rb 
 app/controllers/queries_controller.rb 
 app/views/queries/_form.html.erb 

 


 h5. app/models/query.rb 

 操作者=クエリ作成者の場合、無条件にカスタムクエリを編集可能とする処理を追加 
  (self.user_id == user.id)) 

 <pre><code class="ruby"> 
   def editable_by?(user) 
     return false unless user 
     # Admin can edit them all and regular users can edit their private queries 

 >      return true if ((is_public? && user.allowed_to?(:manage_public_queries, project)) || (self.user_id == user.id)) 
 <      return true if is_public? && user.allowed_to?(:manage_public_queries, project) 

     return true if user.admin? || (is_private? && self.user_id == user.id) 
     # Members can not edit public queries that are for all project (only admin is allowed to) 
     is_public? && !is_global? && user.allowed_to?(:manage_public_queries, project) 
   end 
 </code></pre> 


 h5. app/controllers/queries_controller.rb 

 adminまたはPJ内クエリ以外の場合、強制的に個人単位クエリに再設定している処理を回避した。 

 <pre><code class="ruby"> 
   def update_query_from_params 

 <      if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin? 
 >      if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin? || @query.user == User.current 
 </code></pre> 

 h5. app/views/queries/_form.html.erb 

 カスタムクエリ編集画面の表示権限設定部分、adminのみ/クエリ作成時のみ表示している箇所を、クエリ作成者にも表示するように変更した。 

 <pre><code class="ruby"> 
 < <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @query.project) %> 
 --- 
 > <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @query.project) || @query.user == User.current %> 

 < <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :class => (User.current.admin? ? '' : 'disable-unless-private') %></p> 
 --- 
 > <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :class => (true ? '' : 'disable-unless-private') %></p> 

 </code></pre> 

 h4. ■ カスタムクエリ作成-PJ共用化手順 

 h5. 事前準備 

 (admin) 
 ・カスタムクエリ表示制御に用いるロールを作成する。 

 (PJ-admin) 
 ・カスタムクエリの作成者に、PJ内のクエリ作成/保存権限を割り当てる。 
 ・カスタムクエリの利用者に、PJ内のクエリ表示用ロールを割り当てる。 

 h5. PJ間共有カスタムクエリ作成 

 クエリ作成者:(PJのクエリ作成、クエリ保存の権限が必要) 
 ・PJ内でカスタムクエリを作成する。 
 ・「全プロジェクト向け」をチェックする。 
 ・「表示」-「次のロールのみ」、クエリ利用許可するロールを選択する。 
 ・カスタムクエリを保存する。 

 h5. PJ間共有カスタムクエリ編集 

 カスタムクエリを編集し保存する。 
 表示権限変更も可能(ロール制御/作成者本人のみ/制限無) 

 本操作は、カスタムクエリ作成者またはadminが可能。 
 (PJ間共用のカスタムクエリは、PJに所属しないため、PJ内のクエリ編集/保存ロールによりアクセス制限できない。代用としてカスタムクエリ作成者のIDを利用している) 


 h3. ■対応状況 

 Redmineソース変更+運用により対処可能 

 h3. ■補足 

 h4. 運用効率化 

 各カスタムクエリを表示制御するロールの権限は、PJ単位に設定する必要がある。 
 多数のPJで共用する場合、PJ間のメンバー継承、ユーザグループ単位のロール割当の利用が必要と思われる。 

 h4. 機能改善 

 クエリ編集画面にて、クエリ作成者の表示/編集機能を追加する事が望ましいと思われる。 クエリ編集画面にて、クエリ作成者の表示/編集機能を追加する事が望ましい。 
 クエリ作成者の変更は、adminまたはクエリ作成者本人 
 (カスタムクエリ作成者IDは、queriesテーブルのuser_id に格納されている。) 

 admin以外の、すべてのユーザー/全プロジェクト向けカスタムクエリ作成は、不可とした方が良いかもしれない。(意図せずに作成/公開しSEC問題になる事も考えられる) admin以外の、すべてのユーザー/全プロジェクト向けカスタムクエリ作成は、不可とした方が良いかもしれない。(気付かずに作成するケースも出そう) 

 h4, SEC面考察 

 本変更は、PJ間共用クエリ作成権限を性善説でadminのみから変更している。 

 本変更前でも、別PJにて下記可能。(adminのみ作成可能だが) 現状でも、別PJにて、下記可能。 

 ・他PJと同一ロールで表示制御するカスタムクエリを作成すれば、他PJにも見える 
 ・他PJと同じロールをPJ内で割り当てれば、無関係なPJで作成したカスタムクエリを利用できる。 
  (PJ共用カスタムクエリの編集権限は、adminとカスタムクエリ作成者のみなので、変更はされない) 

 ロールはシステムレベルで設定され、それ自体を表示制御する機能が無い。 
 この事はユーザ数が数千人になれば問題になるかもしれない。 
  

戻る