Использование идентификатора пользователя с другими классами моделей

Я использую плагин play-authenticate в своем проекте play-framework. Я хочу иметь возможность использовать идентификатор пользователя (пользователя, вошедшего в систему в данный момент) из класса модели User.java плагина.

    @Id
    public Long id;

Я хочу сделать это, чтобы когда пользователи создают записи в отдельном классе модели, я мог хранить пользователя, создавшего эти записи. Существуют ли функции для доступа к этой информации или мне нужно будет написать дополнительный метод в классе User для возврата активного пользователя?

package controllers;

import java.text.SimpleDateFormat;
import java.util.Date;
import models.*;
import models.User;
import play.Routes;
import play.data.Form;
import play.mvc.*;
import play.mvc.Http.Response;
import play.mvc.Http.Session;
import providers.MyUsernamePasswordAuthProvider;
import providers.MyUsernamePasswordAuthProvider.MyLogin;
import providers.MyUsernamePasswordAuthProvider.MySignup;
import play.data.*;
import views.html.*;
import play.*;
import be.objectify.deadbolt.actions.Restrict;
import com.feth.play.module.pa.PlayAuthenticate;
import com.feth.play.module.pa.providers.password.UsernamePasswordAuthProvider;

public class Application extends Controller {

    /*Part of the Play-Authenticate authentication plugin for the Play Framework.*/
    public static final String FLASH_MESSAGE_KEY = "message";
    public static final String FLASH_ERROR_KEY = "error";
    public static final String USER_ROLE = "user";




    public static User getLocalUser(final Session session) {
        final User localUser = User.findByAuthUserIdentity(PlayAuthenticate
                .getUser(session));
        return localUser;
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    @Restrict(Application.USER_ROLE)
    public static Result restricted() {
        final User localUser = getLocalUser(session());
        return ok(journeyManagement.render(localUser));
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    @Restrict(Application.USER_ROLE)
    public static Result profile() {
        final User localUser = getLocalUser(session());
        return ok(profile.render(localUser));
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static Result login() {
        return ok(login.render(MyUsernamePasswordAuthProvider.LOGIN_FORM));
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static Result doLogin() {
        com.feth.play.module.pa.controllers.Authenticate.noCache(response());
        final Form<MyLogin> filledForm = MyUsernamePasswordAuthProvider.LOGIN_FORM
                .bindFromRequest();
        if (filledForm.hasErrors()) {
            // User did not fill everything properly
            return badRequest(login.render(filledForm));
        } else {
            // Everything was filled
            return UsernamePasswordAuthProvider.handleLogin(ctx());
        }
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static Result signup() {
        return ok(signup.render(MyUsernamePasswordAuthProvider.SIGNUP_FORM));
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static Result jsRoutes() {
        return ok(
                Routes.javascriptRouter("jsRoutes",
                        controllers.routes.javascript.Signup.forgotPassword()))
                .as("text/javascript");
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static Result doSignup() {
        com.feth.play.module.pa.controllers.Authenticate.noCache(response());
        final Form<MySignup> filledForm = MyUsernamePasswordAuthProvider.SIGNUP_FORM
                .bindFromRequest();
        if (filledForm.hasErrors()) {
            // User did not fill everything properly
            return badRequest(signup.render(filledForm));
        } else {
            // Everything was filled
            // do something with your part of the form before handling the user
            // signup
            return UsernamePasswordAuthProvider.handleSignup(ctx());
        }
    }

    /*Source: https://github.com/joscha/play-authenticate*/
    public static String formatTimestamp(final long t) {
        return new SimpleDateFormat("yyyy-dd-MM HH:mm:ss").format(new Date(t));
    }

}

Обновлять:

package models;

import play.mvc.Http.Session;
import controllers.*;
import java.util.*;
import play.db.ebean.*;
import play.data.validation.Constraints.*;
import javax.persistence.*;
import play.data.format.*;
import com.avaje.ebean.*;
import java.text.*;




@Entity
public class Journey extends Model { 


    public SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("hh:mm");
    public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yy");


    @Id
    public Long id;

    @Required
    public String start_loc;

    @Required
    public String end_loc;

    @Required
    public String participant_type;

    @Required
    public String date = simpleDateFormat.format(new Date());

    @Required
    public String time = simpleTimeFormat.format(new Date());

    @ManyToOne
    public User createUser;

    @ManyToOne
    public User modifyUser;

    public static Finder<Long,Journey> find = new Finder(
        Long.class, Journey.class
        );

    public static List<Journey> all() {
        return find.all();
    }

    public static void create(Journey journey) {
        journey.save();
    }

    public static void delete(Long id) {
        find.ref(id).delete();
    }

    public static List<Journey> searchByAddress(String address) {
        return find.where().ilike("start_loc", "%"+address+"%").findList();
    }

    public void save() {
        User logged = Application.getLocalUser(session());
        if (logged != null) {
            this.createUser = logged;
            this.modifyUser = logged;
        }
        super.save();
    }

    public void update(Object o) {
         User logged = Application.getLocalUser(session());
        if (logged != null) {
            this.modifyUser = logged;
        }
        super.update(o);
    }
}

person Community    schedule 27.02.2013    source источник
comment
В целом в этом коде нет никаких действий, которые сохраняют или обновляют какой-либо объект... Вам не нужно показывать нам весь контроллер, только действия, в которых вы выполняете указанные операции: сохранение/обновление. Я думаю, вы также можете легко пропустить импорт...   -  person biesior    schedule 12.03.2013
comment
Теперь я включил код модели, где я выполняю обновление/сохранение. Именно строки в этих методах вызывают ошибки. Поскольку сеанс не определен для типа Journey.   -  person    schedule 12.03.2013


Ответы (1)


Вам не нужно писать его вручную, например, если у вас есть модель Book.java, вы можете добавить поле для примера updatedBy, чтобы определить, кто редактировал запись в прошлый раз, более того, вы можете переопределить Model's методы save() и update(Object o), чтобы убедиться, что эти поля всегда будут обновляться без дополнительных усилий.

@Entity
public class Book extends Model {

    @Id
    public Integer id;

    @ManyToOne
    public User createUser;

    @ManyToOne
    public User modifyUser;

    public void save() {
        User logged = Application.getLocalUser(session());
        if (logged != null) {
            this.createUser = logged;
            this.modifyUser = logged;
        }
        super.save();
    }

    public void update(Object o) {
        User logged = Application.getLocalUser(session());
        if (logged != null) {
            this.modifyUser = logged;
        }
        super.update(o);
    }

    // other fields/methods
}
person biesior    schedule 27.02.2013
comment
Я переопределил эти методы, как вы предложили, и создал пользователя @Required public User Creator; но игра бросает, не может найти ошибки символов с помощью Application.getLocalUser(session()); - person ; 28.02.2013
comment
Как вы реализовали Play-Authenticate? Следили ли вы за play-authenticate-usage образец ? В Application контроллере есть действие под названием getLocalUser , вы скопировали его в свой контроллер? - person biesior; 28.02.2013
comment
У меня есть этот метод в моем Application.java. Я в основном только что расширил пример использования в своем проекте. Я отредактировал свой вопрос, чтобы показать метод, который у меня есть в контроллере приложений. - person ; 11.03.2013
comment
Я думаю, проблема в том, что метод session() не определен в моей модели. - person ; 11.03.2013
comment
Это странно, хотя вы, вероятно, обновляете объект из действия Play, которое, как вы знаете, по умолчанию получает session(). - person biesior; 12.03.2013
comment
Да, я совсем запутался в том, что происходит. Помогло бы, если бы я загрузил свой контроллер приложения (без ненужных методов)? Я не совсем понимаю, почему он не находит этот метод. - person ; 12.03.2013
comment
Так что я только что вернулся к этой проблеме сейчас. Я повторно загрузил пример использования play-authenticate-usage, и если я попытаюсь создать модель книги, подобную вашей, я получу ту же ошибку относительно метода сеанса. Я должен что-то упустить, отсутствующий импорт, это странно, потому что он распознает метод getLocalUser как просто аргумент сеанса, в моих моделях для него не определен метод. - person ; 29.03.2013