Spring + Hibernate (JPA) + Spring Security + JSF kullanıyorum.

Bir base class tanımladım, silindimi, kayit tarihi, version gibi sabit kolonları base class üzerinden modele extend ediyorum.

Ekleyen ve güncelleyen kullanıcı bilgilerini de tablolarda tutmak istiyorum. Spring Security'de oturumu açan kullanıcı bilgisi zaten var. Her kayıt ve update işleminde kullanıcı bilgisini yazmak yerine kolonun bir interface üzerinden kullanıcıyı okumasını sağlayabilir miyim?

Ben bir kaç yol denedim ama Base class içerisinde interface'i Autowired yapınca kızıyor. :)

Base class:

@MappedSuperclass
public abstract class BaseClass {

    @Column(name="SavesUserId", length=36)
    private String savesUserId;

    @Column(name="InsertDate", nullable=false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date insertDate;

    @Column(name="UpdateDate", nullable=true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateDate;

    @PrePersist
    protected void onCreate() {
        insertDate = updateDate = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updateDate = new Date();
    }

    @Column(name="IsDeleted", nullable=false, columnDefinition="int default '0'")
    private int isDeleted;
<getter/setter>

Interface:

public interface IGeneralClass {
    String getBundleMessage(String key);
    void sendFacesMessage(Severity severity, String summary, String Detail);
    void sendFacesMessagebyBundleKey(Severity severity, String summaryKey, String detailKey);
    String getUserName();
    void setUserName(String userName);
    String getUserId();
    String getUserCompanyId();
}

soruldu: 27 Haz '12, 03:28

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

değiştirildi: 27 Haz '12, 04:43

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183

Spring Security de oturum açan birisinin kullanıcı bilgilerine nasıl ulaşıyorsun?

(27 Haz '12, 05:55) scarface_tnt scarface_tnt's gravatar image

@scarface_tnt:

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

String userName = user.getUsername();

(27 Haz '12, 06:50) SaRPaRDa SaRPaRDa's gravatar image

Ama böyle sadece kullanıcı adı ve şifresi gibi bilgileri alabiliyorum. Kullanıcı için oluşturulmuş entity sınıfın tüm bilgilerini almamın bir yolu var mı?

(27 Haz '12, 07:06) scarface_tnt scarface_tnt's gravatar image

İhtiyacım olmadığı için hiç araştırmadım inanki. Zaten öğrenip öğrenip yazıyorum.

Ama ihtiyacım olsaydı; Kullanıcı login olduğu anda gerekli bilgileri okur ve her zaman okuyabileceğim bir class'ta tutardım. -@özcanacar hocam o class'a bağımlılık yaratıyorsun diye bana kızacak ama :)-

(27 Haz '12, 07:25) SaRPaRDa SaRPaRDa's gravatar image

Bu soru açıkta kalmış. Kullandığım çözüm:

@MappedSuperclass
public abstract class BaseClass implements Serializable {
    private static final long serialVersionUID = 1721800761158823311L;

@Column(name = "SAVESUSERID", length = 36)
    private String savesUserId;

@Column(name = "INSERTDATE", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date insertDate;

@Column(name = "UPDATEDATE", nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateDate;

@PrePersist
    protected void onCreate() {
        insertDate = updateDate = new Date();
            User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        savesUserId = user.getUsername();
    }

@PreUpdate
    protected void onUpdate() {
        updateDate = new Date();
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        savesUserId = user.getUsername();
    }

@Column(name = "UPDATER", length = 36)
    private String updater;

@Column(name = "ISDELETED", nullable = false, columnDefinition = "SMALLINT default 0")
    private short isDeleted;

////getter{} setter{}
}
(27 Kas '12, 07:02) SaRPaRDa SaRPaRDa's gravatar image

Sorunuzu doğru mu anladım emin değilim ancak özellikle sayın @mceliksoy'un verdiği cevaptan hareketle, yapmak istediğiniz şey örneğin crud operasyonları öncesi ya da sonrasında, örneğin işlemi gerçekleştiren yetkilendirilmiş kullanıcı bilgisini(ya da bir başka bilgiyi) çıktılamak/db'ye yazmak ise ve Spring kullanıyorsanız, bunu AOP(Aspect Oriented Programming) ile tek bir noktada etkinleştirilecek iş mantığı ile gerçekleştirebilirsiniz.

Belirleyeceğiniz sınıf ve metodlar için before/after metod çağrımlarını Spring AOP ile gerçekleştirmeniz mümkün...

permanent link

cevaplandı: 27 Haz '12, 07:01

hakdogan's gravatar image

hakdogan
2.1k31926
cevap kabul oranı: 43%

Bunun basit bir örneğini verebilir misin?

(27 Haz '12, 07:27) SaRPaRDa SaRPaRDa's gravatar image

Burada, Spring konfigürasyon dosyası içinde oluşturlacak bir tanımlamayı kısaca göstermeye çalıştım: http://chopapp.com/#s87mv02k ClassName class'ı ile ilintili olarak, söz diziminde görülen paket yapısı altında yer alan bütün metodlar çağrılmadan önce, konfigürasyonda belirtilen metod(MyMethod) çalıştırılacaktır...

(27 Haz '12, 07:39) hakdogan hakdogan's gravatar image

Spring de bu isler nasil olur bilmem, ancak Entity lerde kullaniciyi almak herzaman problem olmustur. Belki PrePersist ve PostUpdate Methodlarinda Session a ulasmayi deneyebilirsin ve ordan kullaniciyi yükleyebilirsin.

User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");

Java bir Interceptor ve ya JPA-Listener yardimiyla olabilir. Burda bulunan örnek aslinda creation and update date icin ve biliyorum bunu yapmak kolay, ancak Interceptor ve JPA Listener mantigini anlattigi icin belki sana yardimci olabilir.

permanent link

cevaplandı: 27 Haz '12, 05:57

mceliksoy's gravatar image

mceliksoy ♦
6.5k84988
cevap kabul oranı: 25%

Hocam

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

ile base classtaki (at)PrePersist ve (at)PreUpdate içerisinde kullanıcıyı alıp kaydedebiliyorum. Esasen benim öğrenmek istediğim;

Base Class veya (at)Entity altında interface'lerden bilgi okuyup okuyamadığım? (at)Autowired'ı koyduğum anda JPA sorun çıkarıyor.

Security'i kurcalarken bozdum biraz :) Onu düzelttikten sonra Linkteki dokümana göre deneyeceğim.

Teşekkürler.

(27 Haz '12, 06:56) SaRPaRDa SaRPaRDa's gravatar image

Önce de yazdigim gibi, Spring konusunda bisey diyemem fazla, ancak Seam de bir komponenti @In annotation u ile bir Bean nin icine alabilcegin gibi(Sanirim bu Spring de Autowired oluyor), ayni zamanda

Components.getInstance("component name");

seklinde de yazabiliyordun. Belki buna benzer bir yapi Spring de de vardir.

(27 Haz '12, 07:00) mceliksoy ♦ mceliksoy's gravatar image

Doğru anladıysam soruyu.

Farklı bir yaklaşım olacak ama Reflection ile yapabilirsin. Bir sınıftaki bir değişken içindeki değeri set,get edebilirsin.

permanent link

cevaplandı: 27 Kas '12, 08:31

Turgay%20Can's gravatar image

Turgay Can
8.4k63799
cevap kabul oranı: 18%

Sanirim burda bir mantik hatasi var, entity modellerin icine Context ile ilgili yapilari inject/autowired yapmak yanlis, yapilmamali! Create ve Update Date yapilarinda @PrePersist, @PreUpdate'de sadece date islemleri yapildigi icin sorun olmaz. Model classlarin icine View veya Business Logic ile ilgili yapilar girmemeli!

Eger user bilgileri lazimsa controller veya service katmaninda entity'lere setlemeniz daha mantikli. Ornegin controller icin: bir AbstractController yazip icinde getUser() metodu ile user bilgilerini butun controller classlarindan kullanabilirsiniz. Daha otomatize etmek icin beforeInsert(), beforeUpdate() gibi generic metodlar yazip gelen entity modellere setUserId() yapabilirsiniz.

Bu islemleri tek bir yerden otomatize etmenin diger bir yolu da Spring kullaniliyorsa @hakdogan arkadasimizin bahsettigi Spring AOP.

permanent link

cevaplandı: 28 Kas '12, 04:43

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

Haklısınız... Yukarıdaki BaseClass, Apache CXF'yi entegre ettikten sonra, web servis üzerinden kayıt yapmaya çalıştığımda hata üretti. Çünkü spring security üzerinden oturum açılmamıştı ve User yoktu. Manel olarak Authentication ekledim, session yok dedi. Mecburen Spring Security'i web serviste devre dışı bıraktım. Entegrasyonu çözebilirsem düzelteceğim.

Bu kodları yazdığım sırada öğrenmeye yeni başlamış olmam da benim mazeretim olsun...

(28 Kas '12, 05:38) SaRPaRDa SaRPaRDa's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×109
×86

Soruldu: 27 Haz '12, 03:28

Görüntüleme: 1,429 kez

Son güncelleme: 28 Kas '12, 05:38

powered by BitNami OSQA