自己レスですが、次の対応で、公開/非公開に関わらずメンバー外のプロジェクトにアクセスできない設定にすることができました。
・DBのusersテーブルにlimitというカラムを追加し、限定ユーザーに1にする。
・以下の3カ所を修正する。
--
Index: /app/models/user.rb
===================================================================
--- /app/models/user.rb (revision **)
+++ /app/models/user.rb (revision **)
@@ -238,7 +238,12 @@
role = role_for_project(project)
return false unless role
- role.allowed_to?(action) && (project.is_public? ||
role.member?)
+ # Limit-user cannot access the project non-member, whether or
not project is public.
+ if limit?
+ role.allowed_to?(action) && (role.member?)
+ else
+ role.allowed_to?(action) && (project.is_public? ||
role.member?)
+ end
elsif options[:global]
# authorize if user has at least one role that has this
permission
Index: /app/models/project.rb
===================================================================
--- /app/models/project.rb (revision **)
+++ /app/models/project.rb (revision **)
@@ -100,6 +100,9 @@
user ||= User.current
if user && user.admin?
return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
+ # Limit-user cannot access the project non-member, whether or not
project is public.
+ elsif user && user.limit?
+ return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}
AND (#{Project.table_name}.id IN (#{user.memberships.collect{|m|
m.project_id}.join(',')}))"
elsif user && user.memberships.any?
return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}
AND (#{Project.table_name}.is_public = #{connection.quoted_true} or #
{Project.table_name}.id IN (#{user.memberships.collect{|m|
m.project_id}.join(',')}))"
else
@@ -126,7 +129,10 @@
else
statements << "1=0"
if user.logged?
- statements << "#{Project.table_name}.is_public = #
{connection.quoted_true}" if Role.non_member.allowed_to?(permission)
+ # Limit-user cannot access the project non-member, whether or
not project is public.
+ unless user.limit?
+ statements << "#{Project.table_name}.is_public = #
{connection.quoted_true}" if Role.non_member.allowed_to?(permission)
+ end
allowed_project_ids = user.memberships.select {|m|
m.role.allowed_to?(permission)}.collect {|m| m.project_id}
statements << "#{Project.table_name}.id IN (#
{allowed_project_ids.join(',')})" if allowed_project_ids.any?
elsif Role.anonymous.allowed_to?(permission)