Spring Security + PrimeFaces Yönlendirme Problemi Çözümü

Spring Security, Java EE dünyasında kabul görmüş ve java uygulamaları için -bence- güvenlik için bulunmaz bir nimet. Ayrıntılı bilgiye sitesinden ulaşabilirsiniz.
PrimeFaces da JSF dünyasında kabul gören en başarılı bileşen kütüphanesi, yine bu adresten detaylı bilgiye ulaşabilirsiniz.

JSF 2.2 + Spring 4 + Hibernate 4 + PrimeFaces 5 şeklinde altyapısını kurguladığım projemde fark ettim ki başarılı bir giriş (login) işlemi sonrası sayfa gitmesi gereken URL’e gitmiyor. Spring Security loglarını incelediğimde ise herhangi bir problem olmadan “sendRedirect” ile konfigürasyondaki belirttiğim URL’e gönderiyor. Her şeyin bu kadar mükemmel olduğu yerde nasıl olur da bu çalışmaz diye kafayı sıyırdım tabi ki :)

Spring Security logu aşağıdaki gibi. /login sayfasından istediğim gibi /pages/home sayfasına yönlendirmiş.

[DEBUG] ..access.intercept.FilterSecurityInterceptor - Authorization successful
[DEBUG] ..security.web.FilterChainProxy            - /pages/home.xhtml reached end of additional filter chain; proceeding with original chain
[DEBUG] ..web.access.ExceptionTranslationFilter    - Chain processed normally
[DEBUG] ..web.context.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed

Başladım daha detaylı incelemeye, önce tarayıcı üzerinde gelen-giden akışı izledim.

İstek (Request):

javax.faces.partial.ajax:true
javax.faces.source:loginButton
javax.faces.partial.execute:loginForm
javax.faces.partial.render:loginForm
loginButton:loginButton
loginForm:loginForm
username:test
password:123456
_csrf:49756ca7-38fd-4777-bea8-58fcfe7deb73
javax.faces.ViewState:-3601270081246135757:6121484162719565648

Yanıt (Response):

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-6140875972550706628:-2367790204853062502]]></update></changes></partial-response>

Bunları görünce tabi ki “Aman Tanrım didim”, neden mi? :)
Çünkü gelen yanıtta “redirect-url” yok! Sadece “update” var! Yani ajax işinde hata yapmışız (javax.faces.partial.ajax:true) ve bunu aşmak için önümüzde iki yol var;

  1. Primefaces commandButton özelliklerinde ajax=”false” demek
  2. Primefaces butonu yerine klasik JSF butonu kullanmak

Kullandığım buton

<p:commandButton value="Giriş Yap" />

1. yol

<p:commandButton value="Giriş Yap" ajax="false"/>

2. yol (primefaces butonunun css’inden faydalanamazsınız, elle eklemeniz lazım)

<h:commandButton value="Giriş Yap" />

Sonuç olarak bu kadar basit görünse de tarayıcı üzerindeki trafiği izlemeden ben anlayamadım. Bu arada tüm tarayıcılarda neredeyse standart haline geldi, “Developer Tools” deniliyor genelde ve F12 tuşu ile açabiliyorsunuz, bilmeyenler olabilir diye bahsedeyim dedim.

Bunların dışında Spring Security’nin “sendRedirect” yaptığı yeri ezerek (override) de bu işi yapabilirdik ama daha maliyetli olurdu. Nasıl yapılabileceği şuradaki cevapta üstad BalusC tarafından verilmiş :)

Sorunun temeline de şu kaynaktan bakılabilir.

Şükrü Çakmak hakkında

1987 - insanı sever...
Bu yazı Application Servers kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>