사용자가 액세스할 수 없는 레코드 업데이트 중지
묘사
안녕, 라이언:)나는 사용자가 일부 값으로 기록을 갱신하는 것을 방지하고 싶다. 이 값은 그들이 이후에 이 기록에 접근할 수 없다는 것을 의미한다. 예를 들어 이 기록을 그들이 속하지 않는 그룹에 속하게 하는 것이다.물론 인터페이스는 이런 상황을 방지할 수 있을 것이다. 그러나 만약에 대비하여 나는 컨트롤러에 다음과 같은 내용을 추가했다.
def update
@warranty.attributes = params[:warranty]
authorize! :update, @warranty
...
새로운 무효값이 업데이트되면 권한 수여에 실패할 것으로 예상하지만, 통과할 것 같습니다.이 방법은 창설 작업에 효과가 좋아서 사용자가 접근할 수 없는 기록을 만들 수 없습니다.무슨 생각 있어요?
토론 #1
방금 검색:https://github.com/ryanb/cancan/issues/141
이상하게도, 이런 모드를 사용해도 잘못된 값을 줍지 않는다.아마도 내 코드에 더 깊은 문제가 있을 것이다.그러나 저장을 잘못 허용한 후에 나는 자원을 다시 불러오려고 시도했다. 이것은 권한 수여에 실패할 수 있다. 이것이 바로 내가 저장하기 전에 원하는 것이다. D
토론 #2
내가 지금 해야 할 능력은 다음과 같다.can :manage, Warranty, :rollformer => { :id => user.rollformer_ids }
can :create, Warranty, :rollformer_id => user.current_rollformer_id
이것은create의 정확한 행동을 설명할 수 있을지도 모른다.hmm토론 #셋
기술을 다음과 같이 변경합니다.can :manage, Warranty, :rollformer_id => user.rollformer_ids
can :create, Warranty, :rollformer_id => user.current_rollformer_id
그것은 마치 부적과 같다.아마도 그들은 이 분야를'자기 계몽'이라고 할 수 있을 것이다.'문제'가 아니라.그런데 참고로 제 첫 번째ids예시와 두 번째ids예시는 막후의 업무에서 어떤 차이가 있습니까?
토론 #4
다음 질문이 있습니다.위의 두 줄에서, 보증 수리는 현재 rollformer로 초기화되지만, 사용자는 그들의 모든 rollformer id로 보증 수리를 만들고, 갱신할 수 있습니다.이것이 바로 내가 원하는 것이다. 비록 어떤 이유에서든지, 나는 능력inherited을 이용하여 내가 원하는 것을 얻고 있다고 생각한다.이렇게 하면 무슨 문제가 있습니까?
토론 #5
업데이트 문제가 해결되는 이유를 모르겠습니다.이것이 바로rollformer_id
엔진 덮개 아래에서 서로 다른 can 행위를 검사하는 것이다.# can :manage, Warranty, :rollformer => { :id => user.rollformer_ids }
current_user.rollformer_ids.include? @warranty.rollformer.id
# can :manage, Warranty, :rollformer_id => user.rollformer_ids
current_user.rollformer_ids.include? @warranty.rollformer_id
Active Record는 초기 검사를 할 때 캐시 authorize!
가 연결되어 있었고, 변경 rollformer
할 때 리셋되지 않았기 때문에, 여전히 오래된 rollformer_id
을 가리키고 있다고 추측합니다.근데 확실하지는 않아요.With the two lines in the above post, warranties are initialised with the current_rollformer, but the user can choose to create the warranty with any of their rollformer id's, ditto for updating. This is exactly what I want, though for some reason it feels like I'm exploiting the way abilities are inherited to my gain. Are there any problems with doing it this way?
새 동작 중
rollformer
의 초기값을 말씀하시는 건가요?CanCan은 검증된 방식으로 기록을 시작하려고 시도하기 때문에 전혀 사용하지 않습니다.rollformer_id
@brendon, 죄송합니다. 주제와 좀 다르지만 방문 대상을 담당하는 필드에 토론 #6
(또는attr_protected
)를 사용해서는 안 됩니까?만약 그것이 없다면 사용자는 정성들여 만든 표를 보내서 자신에게 더 많은 특권을 줄 수 있다.그러나
attr_accessible
를 사용하면 걱정할 필요가 없다attr_protected
. 방문과 관련된 속성은 하나씩 따로 분배해야 하기 때문이다.update_attributes
@RKushnir에서 논의한 것은 사용자가 어떤 속성을 업데이트할 수 있도록 하는 것이 아니라 사용자가 어떤 기록을 업데이트할 수 있도록 하는 것입니다.여기에서, 그는 사용자가 일치하는 rollform id의 기록을 업데이트하기를 원할 뿐입니다. 업데이트할 속성을 지정하지 않았습니다.토론 #7
셰리안, 일리가 있어.나는 두 번째 검사 전에 기록을 강제로 다시 불러오는 것이 효과가 있는지 없는지를 시험해 볼 것이다.당신의 질문에 대답할 때, 나는 내가 신기록을 세울 때의 상황을 이용하고 있다고 생각한다. cancan 검사
토론 #8
또는:rollformer_id => user.rollformer_ids
.만약 계승이 없다면, 나는 현재\u rollformer\u id로만 기록을 만들 수 있지만, 나의 모든 rollformer id로 그것을 업데이트할 수 있기를 바란다.단, 만약 당신이 말한 바와 같이,create의 목적은 검증을 통과한 기록을 초기화하는 것입니다. 이것은 매우 효과적입니다. 왜냐하면 저는 Rollformer가 사용자가 현재 선택한 Rollformer:로 기본적으로 설정되기를 희망합니다.도움말 감사합니다:)
마찬가지로 RKushnir에게 감사 드립니다. 저는attr 접근성을 준비했지만, Rollformer id는 그들이 폼에서 설정한 관계입니다. cancan을 사용하여 허용된 값인지 확인하는 것이 저에게 매우 유용합니다.
Reference
이 문제에 관하여(사용자가 액세스할 수 없는 레코드 업데이트 중지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/378텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)