권한에 여러 조건이 있을 경우 CanCan을 어떻게 사용합니까?

5022 단어 cancan

묘사

라이언, 나는 여러 가지 조건에 기초한 모델을 가지고 있다.나는 칸막이 조건을 정확하게 정의하기 위해 빙빙 돌았지만, 칸막이 조건은 계속 혼란스러워졌다.나는 네가 여기에 도움이 될 만한 건의가 있는지 알고 싶다.
모델:
이용자
방 (id, 비밀번호 필요 (브리 값)
사용자 방 (사용자 id, 방 id, 금지)
사용자 스토리:
1. 암호 required==false일 경우 모든 사용자가 방에 가입할 수 있습니다.사용자실이 없으면금지 = = 실제 기록
2. 모든 사용자가 금지 ==false의 룸 레코드만 있으면 룸에 가입할 수 있습니다.
3. 사용자는 비밀번호 ==true가 필요하고 기존 사용자 방 기록이 없는 방에 가입할 수 없습니다
지금까지 나는 이미:
def 초기화 (사용자, 방, 방 비밀번호)
.....
can:show,Room if Room&user.try(:is_a_room_member,room)=true&&user.try(:is_a_banked_room_member,room)=false
보시다시피 위의 내용은 모든 문제를 해결할 수 없을 뿐만 아니라 점점 보기 흉해진다.
간소화/깨끗하고 효과적인 방법에 대한 건의가 있습니까?
고마워

토론 #1

난 라이언이 아니지만 내 생각이 쓸모가 있었으면 좋겠어.
Ifis_a_room_memberis_a_banned_room_member 방법은 nilroom로 받아들인다
그렇다면 아마도:can :show, Room if user.try(:is_a_room_member, room) unless user.try(:is_a_banned_room_member, room)

토론 #2

nimf가 사용해 주셔서 감사합니다. 위에서 언급한 사용자 이야기를 해결해 주셔서 감사합니다. 저는 지금 다음과 같습니다.
can: 표시, 공간, 사용자시도(: is a room member, room) | | | room.사용자를 제외한 암호 required==falsetry (: 금지입니까? 방? 멤버, 방)
그게 더 깨끗해.문제는 응용 프로그램 컨트롤러가 CanCan::AccessDenied do | 예외에서 을(를) 구할 때 |
나는 이것이 사용자가 금지되어 있기 때문인지 아니면 방에 비밀번호가 필요한지 알 수 없다.모델에 액세스할 객체가 아닌 경우 모든 CanCan::AccessDenied는 다음을 제공합니다.
룸 (id: integer, 사용자 id: integer, 제목: 문자열, 필요한 암호: 볼 값, 암호: 문자열) 등.
왜 사용자가 방을 볼 수 있는 권한을 얻지 못했는지 알 수 있습니까?고마워

토론 #셋

아, 알았어.
내가 유일하게 생각한 것은 더러운 해커였다.
처음에 || room.password_required == falsenil이면 roomnil에게 찾을 수 있는 방법을 제시할 수 없습니다.
이 체크를 is_a_room_member 방법으로 이동하거나 다음과 같은 새 도움말 프로그램을 만들어야 할 수도 있습니다.
def room_eligible?(user, room)
  unless room
    session[:cannot_reason] = "no such room"
    return nil
  end

  if user.try(:is_a_banned_room_member, room)
    session[:cannot_reason] = "user banned in this room"
    return nil
  end

  if room.password_required
    unless user.try(:is_a_room_member, room)
      session[:cannot_reason] = "room password required"
      return nil
    end
  end

  return true
end
그리고 rescue_from 블록에서 세션 [:cannot reason]을 검사할 수 있습니다.당신의 능력 코드는 다음과 같습니다.
can :show, Room if room_eligible?(user, room)
사용자가 0인지 아닌지 모르겠습니다. 비밀번호가 필요하지 않으면 방을 볼 수 있습니까?나를 예로 들면, 이것은 허락한 것이다.
사용자 모형으로 room_eligible? 이동하고 user.try(:room_eligible?, room)

토론 #4

같은 기능을 검사할 수 있습니다. nimf에 감사드립니다. 재미있습니다. 방을 저장할 다른 세션 변수를 만들어야 합니다.신분증
# 라이언, 새로운 캔캔 2.0이 이 문제를 해결했나요?감사합니다.조수는 어디에서 살까요?모델에 세션을 사용할 수 없기 때문에 이 세션은 모델에 있을 수 없습니다.능력rb모형처럼 일하면 안 돼요.어디 가고 싶어요?감사

토론 #5

의 또 다른 도전은 컨트롤러의 규격을 어떻게 정확하게 조정하여CanCan Rescue의 방향을 바꿀 수 있는지 모르겠다는 것이다.이 가능하다, ~할 수 있다,...
이제 CanCan이 액세스 거부 메시지를 보내면 테스트 사양 테스트는 여기서 종료되며 "rescue from Can::AccessDenied do | exception |"블록의 내용은 계속 실행되지 않습니다.사상

토론 #6

나 정말 수치스러워!일은 훨씬 간단하다.
#/app/models/ability.rb
  def initialize(user)
    user ||= User.new # guest user (not logged in)

    can :read, Room do |room| room_eligible?(user, room) end
  end

  def room_eligible?(user, room)
    unless room
      raise CanCan::AccessDenied.new("Not such room!", :read, Room)
    end

    if user.try(:is_a_banned_room_member?, room)
      raise CanCan::AccessDenied.new("User banned in this room!", :read, Room)
    end

    if room.password_required
      unless user.try(:is_a_room_member?, room)
        raise CanCan::AccessDenied.new("Password required!", :read, Room)
      end
    end

    return true
  end
그럼 예외를 보자.구조 정보

토론 #7

고마워요. 마음에 들어요. 하지만 칸칸 구조대에 어느 방인지 알려주지 않을 거예요.우리가 이야기하고 있는 신분증.나는 마침내 컨트롤러에서 세션 변수를 사용하여 그것을 추적했지만, 그것은 매우 더럽고 보기 흉했다.
# 라이언, 무슨 생각 있어요?

토론 #8

이상 메시지에 id를 추가하는 것을 제한하는 사람이 없습니다. 즉:
def room_eligible?(user, room)
    unless room
      raise CanCan::AccessDenied.new("Not such room!", :read, Room)
    end

    if user.try(:is_a_banned_room_member?, room)
      raise CanCan::AccessDenied.new("User banned in the room #{room.id}!", :read, Room)
    end

    if room.password_required
      unless user.try(:is_a_room_member?, room)
        raise CanCan::AccessDenied.new("Password required for room #{room.id}!", :read, Room)
      end
    end

    return true
  end
그런 다음 rescue from에서 확인합니다.

토론 #9

@nimf는 이런 방법을 사용하면 매우 유용합니다. 감사합니다.
사용자 정의 방법을 사용하는 예시를 찾을 수 없기 때문에wiki 페이지를 추가했습니다.https://github.com/ryanb/cancan/wiki/Custom-Ability-Methods

토론 #10

@nimf가 이 문제를 잘 처리한 것 같습니다. @treydock의wiki 항목은 비슷한 문제가 있는 사람에게 도움이 됩니다.이 모든 것을 끝내다.

좋은 웹페이지 즐겨찾기