2012-01-25 4 views
2

사용자가 프로필 정보를 업데이트 할 수있는 양식이 있지만 일부 정보가 변경되는 것을 방지하고 싶습니다. 또한 컨트롤러 코드를 매우 간단하게 유지하고 싶습니다. 내 사용자 컨트롤러의 업데이트 작업에서 다음 코드를 가지고 있습니다.필드에 양식을 추가하는 사용자 양식을 중지하는 방법은 무엇입니까?

def update 
    @user = Users.find params[:id] 

    if @user.update_attributes(params[:user]) 
    flash[:notice] = 'Update successful.' 
    redirect_to user_path(@user) 
    else 
    render :action => :edit 
    end 
end 

이것은 매우 깨끗하고 간단합니다. 그러나 사용자가 속성과 동일한 이름을 가진 필드를 양식에 추가하고이를 사용하여 금지 된 속성을 수정할 수 있다는 점이 마음에 들지 않습니다. 이 작업을 수행하는 간단한 방법이 있습니까? 아니면이 작업을 직접 수행 할 방법을 고안해야합니까? 내가 고려하고

한 가지 방법은 hash-based message authentication code, 모든 형태의 요소 이름을 사용하여 해시 값을 생성하는 것이다. 이 메시지 액세스 코드는 양식의 숨겨진 값입니다. 그런 다음 양식이 제출되면 매개 변수 해시의 키 이름을 사용하여 메시지 액세스 코드 (MAC)를 다시 계산합니다. 두 개의 MAC이 다르거 나 첫 번째 MAC이 매개 변수 해시에없는 경우 오류가 발생합니다. 나는 이미 거기에 이미 있고 쉬운 해결책이 있다면 이것을 구현하는 데 시간을 낭비하지 않을 것이다.

감사합니다.

답변

1

모델에서는 attr_protected 또는 attr_accessible을 사용하여 대량 할당을 통해 설정 될 때 (양식 제출시와 마찬가지로) 속성을 차단하거나 허용 할 수 있습니다.

+0

에서 찾을 수 있습니다. attr_accessible 및 attr_protected에 대해 알고 있지만, 불필요한 복잡성을 앱에 추가한다고 생각합니다. 예를 들어 사용자는 사용자 이름을 수정할 수 없어야하지만 관리자는 모든 사용자의 이름을 수정할 수 있어야합니다. '@ user.update_attribute (: login, params [: login] if current_user.role? : admin') 이런 종류의 코드를 여러 줄 사용하면 모든 컨트롤러에 들어갈 필요가 있습니다. 그 많은 로직이 이미 내 캉캉 능력 파일에 정의 된, 그래서되는 코드 중복의 공정한 금액이있을 것 – Max

+0

무엇에 대해 -. http://enlightsolutions.com/articles/whats-new-in-edge-scoped- 대량 할당 된 레일-3-1 – Nate

+0

덕분에 네이트, 즉 정확히 내가 무엇을 찾고. – Max

1

attr_protected :protectedcolumn (블랙리스트) 또는 attr_accessible :safecolumn (허용 된 사이트)을 모델에 사용하면 레일스가 대량 지정을 방지합니다. 이 주제에 대한 자세한 내용은 나도 이상이 게시 Ruby on Rails Security Guide (Section 6.1)

+0

나는 attr_accessible 및 attr_protected에 대해 알고 있지만 나는 그들이 내 응용 프로그램에 불필요한 복잡성을 추가 생각합니다. 예를 들어, 사용자가 안된다 사용자 이름을 수정할 수 있지만 관리자는 모든 사용자의 사용자 이름을 수정할 수 있어야합니다. @ user.update_attribute (: login, params [: login] if current_user.role? : admin') 여러 줄의 이 유형의 코드는 갈 필요가있다. 내 모든 컨트롤러에. 또 다른 나쁜 점은 그 논리가 이미 CanCan 능력 파일에 정의되어있어 상당량의 코드 중복이있을 것이라는 점입니다. – Max

관련 문제