2017-12-22 26 views
1

현재 함수 내에서 postgresql 데이터베이스 사용자를 만들 수 없습니다. 배경 : Java Swing 응용 프로그램이 있으며 목표는 데이터베이스 사용자를 만들고 변경하고 삭제할 수있는 메뉴를 개발하는 것입니다. 좀 더 보안을 강화하기 위해 "usermanagement"역할을 만들었으며이 역할의 구성원 만이 함수를 사용하여 사용자를 만들 수 있습니다. 역할에는 또한 "createuser"권한이 포함되어 있습니다.기능이있는 사용자를 만드는 Postgresql

쿼리는 문제없이 실행되지만 새로운 사용자를 생성하지는 않습니다 ... 그래서 잘못된 점은 모르겠습니다.

SELECT create_databaseuser(v_username := 'thisname' ,v_password := 'pwpwpw'); 

사람이 도와 드릴까요 :

이 내가 내 기능을 사용하려고 어떻게? ,

-- Function: public.create_databaseuser(text, text) 

-- DROP FUNCTION public.create_databaseuser(text, text); 

CREATE OR REPLACE FUNCTION public.create_databaseuser(
    v_username text, 
    v_password text) 
    RETURNS numeric AS 
$BODY$ 
DECLARE 
    r_id numeric; 
BEGIN 
    --CREATE ROLE v_username LOGIN 
    --PASSWORD 'v_password' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 

    EXECUTE 'CREATE USER ' || v_username || ' WITH PASSWORD ' || v_password; 
-- Alternative:CREATE ROLE v_username LOGIN PASSWORD v_password NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 

    return 1; 
    -- Simple Exception 
EXCEPTION 
    WHEN others THEN 
     RETURN 0; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE SECURITY DEFINER 
    COST 100; 
ALTER FUNCTION public.create_databaseuser(text, text) 
    OWNER TO postgres; 
+0

이 더 나은 형제 사이트에 게시 될 수도, http://dba.StackExchange.com/ –

답변

0

참고 STRICT (returns NULL on NULL input) SQL 주입 문제에 대해 도움을 FORMAT()를 사용하고, 입력을 적절히 인용 :

여기 내 코드입니다. 입력 인수 "v_username"이 NAME 유형으로 수정되어 유형이 pg_catalog.pg_roles과 일치합니다.

DROP FUNCTION IF EXISTS public.create_databaseuser(NAME, TEXT); 

CREATE OR REPLACE FUNCTION public.create_databaseuser(
    v_username NAME, 
    v_password TEXT) 
RETURNS smallint AS 
$BODY$ 
DECLARE 
BEGIN 
    EXECUTE FORMAT('CREATE ROLE "%I" LOGIN PASSWORD ''%I''', v_username, v_password); 
    RETURN 1; 
    -- Simple Exception 
EXCEPTION 
    WHEN others THEN 
     RETURN 0; 
END; 
$BODY$ 
LANGUAGE plpgsql STRICT VOLATILE SECURITY DEFINER 
COST 100; 

ALTER FUNCTION public.create_databaseuser(NAME, TEXT) OWNER TO postgres; 


select rolname from pg_catalog.pg_roles order by 1; 
SELECT create_databaseuser(v_username := 'thisname' ,v_password := 'pwpwpw'); 
select rolname from pg_catalog.pg_roles order by 1; 
+0

대단히 감사합니다. 그것은 효과가있다. 그 동안 나는 방금 응용 프로그램에서 일반 SQL을 사용했지만 지금은 그것을 변경할 수 있으며 훨씬 더 나은 기능을 사용할 수 있습니다. – Beginner

+0

plw로 일반 숫자를 사용하려면 제안 사항이 있습니까? 'pw123'으로 함수를 호출했지만 제대로 작동하지만 '12345'가 작동하지 않습니다. 실제로 발견되면 작동합니다. 하지만 그 후에 12345는되지 않습니다. pgadmin으로 pw를 변경하고 내 기능으로 md5 해시를 확인했습니다. 암호는 "12345"로 저장됩니다. 그래서 함수 안에서 reg 표현식으로 이것을 해결할 수 있습니다. 이제 내가 더 나아가 $와 같은 특수 문자를 사용하고 싶다면 잘 작동하지 않습니다. 어떻게하면이 문제를 해결할 수 있을까요? – Beginner