2012-06-08 3 views
3

질문 ... 권한을 기반으로 필드를 선택할 수 있도록 MySQL 권한을 추가 할 수 있습니까?MySQL 조건부 사용자 권한

예 :

  1. 사용자 user1 만// 삽입 컬럼 선택 instance는 (PHP 통해 전달되는 1) 1 동일하다 users 테이블로부터 삭제할 수있다.
  2. 사용자 user2instance2 (PHP를 통해 1이 전달 됨) 인 users 테이블에서만 선택/삽입/삭제할 수 있습니다.

    내가 여러 사이트에 사용되는 동일한 코드베이스를 사용하여 응용 프로그램을 만드는거야 :

다음은 배경 정보입니다. 앱 내의 조건에 따라 다른 레이아웃이로드됩니다. 대부분의 정보가 사이트간에 공유 될 수 있기 때문에 여러 사이트가 동일한 데이터베이스를 사용하고 있습니다. 하나의 사이트에 등록하는 사용자는 다른 사이트에도 등록해야합니다 (사이트가 "초대에 의해서만"있기 때문에 원하는 방식입니다).

내가 생각하는 바는 사용자 테이블을 가지고있는 것입니다 : id, email , 암호, 인스턴스. 인스턴스 열은 사이트의 ID를 갖습니다.

응용 프로그램 계층에

에게 내가 인스턴스를 추가,이 테이블에서 삭제/= [사이트 ID] 쿼리에 ... 예/삽입을 선택해야 할 때마다 : SELECT * FROM users WHERE email = '' AND instance = [site_id];

+0

:

당신을 위해 무엇을 찾고있는 것처럼 뭔가를 달성하기 위해 저장 프로 시저를 사용할 수있다 쿼리에 실수로 instance = x이없는 경우 – iDev247

+1

코드를 테스트하기 만하면 코딩시 '실수로'같은 것이 없습니다 –

+0

모든 답변과 오랜 토론을 해 주셔서 감사합니다. 나는 해결책을 고찰하고 그것을 적절히 수여 할 것이다. @pyrate 실수로 인한 코드가 없다는 것에 동의합니다. 여러 개발자가있는 경우 장기적으로 이런 종류의 것을 추적하기가 어렵습니다. 문제의 또 다른 이유는 사이트간에 사용자 정보에 액세스하는 기술적 보안 경계/제한이 있다는 것을 거래하는 회사에 안심시키는 것입니다. 다시 한 번 감사드립니다! – iDev247

답변

2

내가 아는 바로는 불가능합니다. MySQL은 조건부 사용자를 허용하지 않습니다.

두 사이트 모두 한 사용자를 사용하고 '인스턴스'에 따라 모든 쿼리를 수정하십시오. 따라서 특정 사이트에 검색어를 지정할 때마다 WHERE instance = $site_id을 추가하십시오.

3

아니, 권한 테이블 당이다, DB 서버 등하지만, 그러나, 당신은 예를 들어보기 테이블과 사용자 설정 권한을, 솔루션이 사용되는 행

mysql> CREATE VIEW test.v AS SELECT * FROM t where email = '' AND instance = [site_id]; 

단 2 개보기 테이블을 생성하고 해당 사용자에게 액세스 권한을 부여하기위한

여기에입니다.

+1

새로운 열/구조를 추가 할 때마다 두 가지 다른보기가 목에 통증이 있습니까? –

+0

@pyrate 테이블 구조를 변경하면 모든 응용 프로그램에서 고통이 될 것이라고 생각하지만 변경 사항이보기를 만드는 방법에 영향을 미치지 않는다면 전혀 문제가 없습니다. – jcho360

+0

특정 열을 선택하는 것이 영향을받지 않아야합니다. 그러나보기에서 특정 열을 선택 (일반적으로 사용자가 수행)하면 테이블뿐만 아니라 두 개의 코드베이스를 사용하는 웹 사이트가 모두있는 경우가 아니라 두 가지보기를 모두 변경해야합니다. –

2

MySQL은 데이터베이스에 연결된 MySQL 사용자를 기반으로 특정 행을 잠그는 권한을 사용하는 것을 용이하게하지 않습니다.

그런 식으로 제한하려는 사용자가있는 경우 데이터베이스에 직접 액세스하지 않고 다른 계층을 통해 연결하도록하는 것이 가장 좋습니다.

보기를 사용하는 것은 좋은 생각이 아닙니다. 모든 사용자는 동일한 쿼리를 사용하여 자신의 개인보기를 참조해야합니다. 을 사용자가 (행 대신) 볼 수 있도록 제한하는 경우보기가 좋은 해결책이됩니다.MySQL을 그냥 보안을 강화하는 응용 프로그램 팀이 쿼리에 인스턴스 =의 X를 추가 돌보는되어 있기 때문에

# This table already exists in your schema 
CREATE TABLE `user` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `email` VARCHAR(50) NOT NULL, 
    `instance` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB; 

INSERT INTO `user`(`id`,`email`,`instance`) 
    VALUES (NULL,'[email protected]','1'); 
INSERT INTO `user`(`id`,`email`,`instance`) 
    VALUES (NULL,'[email protected]','2'); 
INSERT INTO `user`(`id`,`email`,`instance`) 
    VALUES (NULL,'[email protected]','1'); 

# This would be a new table you would have to create 
CREATE TABLE `user_instance` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `user` VARCHAR(20) NOT NULL, 
    `instance` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `user_instance` (`user`,`instance`) 
) ENGINE=INNODB; 

INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user1','1'); 
INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user2','2'); 

# This is a stored procedure that might accomplish what you want 
DELIMITER $$ 

CREATE PROCEDURE `p_get_users`() 
BEGIN 
    SELECT `user`.`id`, `user`.`email` 
    FROM `user` 
    WHERE `user`.`instance` IN(
     SELECT `instance` 
     FROM `user_instance` 
     WHERE `user` = USER()); 
END$$ 

DELIMITER ;