Есть ли способ изменить соединение Oracle на лету в Play!Фреймворк? - PullRequest
3 голосов
/ 20 сентября 2011

В настоящее время я работаю в проекте, где каждый пользователь имеет свою собственную схему в БД Oracle 11g.Этот дизайн был сделан, потому что все роли безопасности и привилегии для доступа к таблицам Oracle хранятся в БД.Наша команда пытается понять, как это сделать в крутой игре!фреймворк.Есть предложения?

1 Ответ

2 голосов
/ 20 сентября 2011

Насколько я понимаю, вы можете попробовать обернуть значение DB.datasource чем-то вроде этого (где currentUser() и currentPassword() должны возвращать учетные данные текущего пользователя, который делает запрос):

public class DataSourceWrapper {
    private DataSource original;
    public DataSourceWrapper(DataSource original) {
        this.original = original;
    }

    public Connection getConnection() {
        return original.getConnection(currentUser(), currentPassword());
    }

    ...

    public DataSource getOriginal() {
        return original;
    }
}

Замена DB.datasource должна происходить между выполнением onApplicationStart() методов DB и JPA-плагинов, так что вам нужно создать собственный плагин:

public class DataSourceReplacementPlugin extends PlayPlugin {
    public void onApplicationStart() {
        DB.datasource = new DataSourceWrapper(DB.datasource);
    }

    public void onApplicationStop() {
        if (DB.datasource instanceof DataSourceWrapper) {
            DB.datasource = ((DataSourceWrapper) DB.datasource).getOriginal();
        }
    }
}

и зарегистрироваться в соответствующемуровень приоритета в conf/play.plugins:

350: DataSourceReplacementPlugin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...