22 Ocak 2015 Perşembe

Jsf Authentication & Web Filter



     Bu yazımın temel konusu yetkilendirme ve web filtresini beraber  oluşturmak. Buradaki yetkilendirmeden kastımız kullanıcının login olma durumudur. Web Filter da ise kullanıcının sayfalar arası gezerken bizim yapmak istediğimiz kontrollerdir. Örneğin kişi sisteme giriş yapmamışsa anasayfaya erişememeli , giriş yapmışsa anasayfaya erişebilmeli. Bu ve buna benzer kullanıcı tarafından gelen isteklerin  kontrol edilmesini biz Web Filter ile sağlarız. 


     Web Filter tek bir sayfaya uygulanabileceği gibi birkaç sayfaya veya bütün sayfalara uygulanabilir. Aşağıda yeri geldiği zaman bunun nasıl yapıldığını hatırlatacağım.


    Yapmamız gerekenler;



  1. Web Filter class ı oluşturmak
  2. Web.xml dosyasına Web Filter kodunu yazmak
  3. Session ile Kullanıcı Yetkilendirme



1.Web Filter

   Web Filter class ını NetBeans kullanıyorasanız otomatik oluşturabilirsiniz. Ya da normal bir class oluşturarak "Filter" implements ederiz ve bütün implement metodlarını oluştururuz. Daha sonra aşağıdaki gibi annotation ekleyerek web filterin hangi sayfayalarda uygulanacağını *.xhtml kısmını değiştirerek belirleyebiliriz.

    Aşağıdaki kodda asıl işi doFilter(...) ile yapıyoruz. Burada eğer istek var ve giriş yapılmışsa faces-config.xml e göre yönlendiriyor , giriş yapılmamışsa direk login.xhml e yönlendiriyor. Giriş yapmayan kişinin login sayfası hariç diğer bütün sayfalara erişimi engelleniyor.



@WebFilter(filterName = "AuthFilter", urlPatterns = {"*.xhtml"})
public class AuthFilter implements Filter {


AuthFilter.java



import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebFilter(filterName = "AuthFilter", urlPatterns = {"*.xhtml"})
public class AuthFilter implements Filter {
     
    public AuthFilter() {
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
         
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         try {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            HttpSession ses = req.getSession(false);
            String reqURI = req.getRequestURI();
            if ( reqURI.indexOf("/login.xhtml") >= 0 || (ses != null && ses.getAttribute("username") != null)
                                       || reqURI.indexOf("/public/") >= 0 || reqURI.contains("javax.faces.resource") )
                   chain.doFilter(request, response);
            else
                   res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
                   
      }
     catch(Throwable t) {
         System.out.println( t.getMessage());
     }
    } //doFilter
 
    @Override
    public void destroy() {
         
    }
}


Gerekli yetkilendirmeyi yapabilmek için yardımcı class ım aşağıdaki gibidir



Util.java




import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class Util {

    public static HttpSession getSession() {
        return (HttpSession) FacesContext.
                getCurrentInstance().
                getExternalContext().
                getSession(false);
    }

    public static HttpServletRequest getRequest() {
        return (HttpServletRequest) FacesContext.
                getCurrentInstance().
                getExternalContext().getRequest();
    }

    public static String getUserName() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        return session.getAttribute("username").toString();
    }

    public static String getUserId() {
        HttpSession session = getSession();
        if (session != null) {
            return (String) session.getAttribute("userid");
        } else {
            return null;
        }
    }
}

  

2. Web.xml 

    Bu oluşturduğum Web Filter i web.xml de belirtmeliyim yoksa hata verir.

web.xml

3.Session ile Kullanıcı Yetkilendirme

     Aşağıda görüldüğü gibi HttpSession nesnemizi giriş yapan kişinin adı ile set ediyoruz.

loginBean.java



public String login() {

        sonuc = lc.login(this.ad, this.sifre);
        if (sonuc) {
            HttpSession hs = Util.getSession();
            hs.setAttribute("username", ad);
            return "anasayfa.xhtml";
        } else {
            return "login.xhtml";
        }

    }

0 yorum:

Yorum Gönder