웹 애플리케이션에 대한 세분화된 인증을 구현하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/279415

문제

저는 Rails 웹 애플리케이션을 개발 중이며 현재 약 20명의 사용자가 이 애플리케이션을 사용하고 있습니다.

애플리케이션의 일부 부분은 일부 사용자만 액세스할 수 있으므로, act_as_authenticated 플러그인을 사용하여 구현한 기본 인증 프레임워크가 이미 마련되어 있습니다.

사용자의 권한은 근무하는 부서에 따라 다릅니다. 예를 들어 관리는 애플리케이션의 모든 부분에 접근할 수 있고, 회계는 회계 관련 부분에만 접근할 수 있으며, 영업은 판매 관련 부분에 접근할 수 있습니다.

반면에 사용자에게는 권한이 부족한 작업에 대한 링크가 표시됩니다.예를 들어, 영업 부서의 직원은 기본 메뉴에서 재무 기록에 대한 링크를 볼 수 있지만 이를 클릭해도 아무 일도 일어나지 않습니다.AFAIK에는 act_as_authenticated를 사용하여 사용자 권한을 쿼리하는 효율적인 방법이 없기 때문입니다.

나는 이것을 두 가지 방법으로 바꾸고 싶습니다.

  1. 좀 더 세분화된 인증을 도입하고 싶습니다.현재 권한 부여는 컨트롤러 수준에서 수행됩니다.액션이나 모델 수준에서 이 작업을 수행하고 싶습니다.예를 들어, 영업 부서 직원이 결제를 생성하고 업데이트할 수 있지만 삭제할 수는 없도록 하고 싶습니다.

  2. 나는 사용자 권한을 효율적으로 쿼리할 수 있기를 원하므로 인터페이스에서 불필요하고 혼란스러운 링크를 제거할 수 있습니다.

이것을 구현하는 가장 우아한 방법은 무엇이라고 생각하십니까?

Rails 관련 답변은 필요하지 않습니다. 데이터 기반 애플리케이션에서 이것이 어떻게 구현되어야 하는지 알고 싶습니다.

마지막으로 현재 구현되는 방법은 다음과 같습니다.

def authorized?
  current_user.role.foo? or current_user.role.bar?
end

이 문제를 해결하는 최선의 방법은 아니라고 생각되는 초기 아이디어는 다음과 같습니다.

+------------+------------+---------+
| department | controller | action  |
+------------+------------+---------+
| accounting | payments   | index   |
| accounting | payments   | new     |
| accounting | payments   | create  |
| accounting | payments   | edit    |
| accounting | payments   | update  |
| accounting | payments   | destroy |
| sales      | payments   | new     |
| sales      | payments   | create  |
| sales      | payments   | edit    |
| sales      | payments   | update  |
+------------+------------+---------+

또는

+------------+----------+-------+--------+------+--------+--------+
| department | model    | list  | create | read | update | delete |
+------------+----------+-------+--------+------+--------+--------+
| accounting | payments | TRUE  | TRUE   | TRUE | TRUE   | TRUE   |
| sales      | payments | FALSE | TRUE   | TRUE | TRUE   | FALSE  |
+------------+----------+-------+--------+------+--------+--------+
도움이 되었습니까?

해결책

제가 이해하는 바에 따르면 권한 부여의 기본 개념은 역할입니다.역할은 다양한 것을 표현할 수 있습니다:

  1. 사용자와 시스템의 관계(예:시스템 관리자가 됨)
  2. 사용자와 특정 개체의 관계(예:댓글 조정자가 됨)
  3. 사용자와 특정 개체의 관계(예:일부 자원의 소유자가 됨)
  4. 다른 복잡한 관계(예:일부 리소스의 소유자인 사용자의 친구가 됨)
  5. 해당 사용자는 어떤 속성을 가지고 있거나 특정 방식으로 일부 메시지에 응답합니다(예:십대가 되려면)

매우 세분화된 인증 시스템을 사용하면 위에 언급된 기준을 기반으로 사용자의 역할을 정의할 수 있습니다.또한 사용자에 대해 둘 이상의 역할을 설정할 수 있어야 합니다.(Rails용 인증 플러그인의 가장 간단한 형태를 사용하면 일반적으로 첫 번째 종류의 역할만 정의하고 사용자에 대해 하나의 역할만 설정할 수 있습니다.)

권한 부여의 다른 부분은 사용자가 특정 역할(역할 집합)에 적합한지 여부를 기반으로 실행할 코드 부분(또는 실행하지 않을 부분)을 결정하는 메커니즘입니다.이 메커니즘을 적용하려면 인증이 이루어져야 하는 지점을 찾고 코드를 실행해야 하거나 실행하지 않아야 하는 역할을 선택해야 합니다.

Rails에서 저에게 효과적인 방법은 모델 수준에서 역할을 정의하고 인증 메커니즘을 떠나는 것입니다(인증을 받고 싶은 코드 부분에 대해 허용된 역할을 설정하고 현재 사용자에게 해당 부분을 실행할 수 있는 역할이 있는지 묻는 것). ) 전적으로 컨트롤러/뷰용입니다.

이를 위해 방금 언급한 모든 가능성(다양한 종류의 역할, 한 사용자에 대한 많은 역할, 컨트롤러 및 뷰 수준에 대한 권한 부여)이 내장된 조정된 Rails-authorization-plugin을 사용합니다.

다른 팁

접근을 위한 제어점으로서 모델에 '기능 점수' 또는 '특징'이라는 개념을 도입해야 할 수도 있습니다.'기능'에는 계층 구조를 형성하기 위한 선택적 '상위 기능'이 있을 수 있습니다.기능이 무엇인지 아닌지를 결정하고 프로그래밍 방식으로 권한을 확인할 수 있습니다.또한 메뉴를 그리기 전에 기능 수준 액세스를 확인할 수 있으므로 사용자는 액세스가 허용되지 않는 페이지에 대한 링크를 볼 수 없습니다.

비슷한 상황/해결책이 설명되어 있습니다. 여기

두 가지 제안 중 첫 번째 옵션은 모델 수준 작업이 아닐 수도 있는 작업을 추가할 수 있으므로 조금 더 좋아 보입니다.두 번째 모델로는 충분하지 않은 경우가 발생할 것이며 스키마를 변경하거나 앱 전체에 권한 논리를 뿌려야 할 것입니다(예:"'생성' 액세스 권한이 없는 사용자도 xxx 메소드를 실행할 수 없습니다.")

솔루션이 그다지 건조해 보이지 않는 이유는 반복이 있기 때문이라고 생각합니다.

  1. 부서명에는
  2. 부서 역량에

#1의 경우 부서 테이블을 만들고 각 부서에 ID를 부여하는 것이 합리적입니다.

#2에 대해서는 첫 번째 의견에 동의합니다.다양한 컨트롤러와 작업을 기능 그룹으로 클러스터링한 다음 사용자와 기능 간에 다대다 관계(매핑 테이블)를 설정할 수 있습니다.그러면 함수는 허용하는 작업/컨트롤러와 일대다 관계를 갖게 됩니다.이렇게 하면 최소한의 반복으로 "회계 및 영업 부서는 모든 재무 테이블을 읽을 수 있어야 합니다"와 같은 말을 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top