system autentykacji z wykorzystaniem struts

0

Witam!

Zazwyczaj programuję w PHP, w międzyczasie postanowiłem zacząć bawić się J2EE i w tym celu wykorzystałem framework struts, ORM HIBERNATE. Napisałem prostą aplikację webową. No i tu pojawia się problem. W jaki sposób w JAVA z wykorzystaniem struts zrobić system autentykacji. Tzn. sprawdzania czy dany użytkownik jest zalogowany i czy ma prawa dostępu do danych zasobów. W PHP jest inna logika myślenia, i oczywiście wiem że podobnie jak tam mozna to zrobić z wykorzystaniem sesji nawet należy. Tylko że teraz wykorzystuję każdego action'a do sprawdzania użytkownika, a chciałbym żeby to działo się niezależnie i żebym nie musiał za każdym razem pamiętać o wstawieniu odpowiedniej metody w klasie ACTION. Czytałem o wykorzystaniu interfejsu Filter (teraz go wykorzystuję do mapowania znaków na UTF-8), ale jakoś nie udało mi się zaimplementować żadnej sensownej metody do tego służacej. Proszę o ewentualny prosty przykład pokazujący sposób implementacji czy cóś.

0
package example;
public class Action extends org.apache.struts.action.Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {

     User user = (User) request.getSession().getAttribute("user");
     if(user == null){
      //TODO .....
     }
     else{ 
     //TODO   ....
     }
      // mozna tez jakies menu wygenerowac w zaleznosci od uprawien user'a
     Menu menu = generateMenu(user);
     request.setAttribute("menu", menu);
     request.setAttribute("user", user);
     //........
     return process(mapping, form, request, response);

}

public ActionForward process(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {

		return mapping.findForward("ok");
	}
}






public class JakiesAction extends example.Action {

public ActionForward process(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
               //wlasna implementacja
		return mapping.findForward("ok");
	}
}

klasa Action odpowiada za sprawdzanie uzytkownika, ewentualnie generowanie menu dla poszczegolnych uprawien uzytkownika itp...... JakiesAction (jak i inne Action klasy) ma metode process(....) ktora zapisuje metode process(...) w klasie example.Action . O takie cos chodzilo Ci?

0

Jest to lepsze na pewno niż moje rozwiązanie, na 100% lepsze (np. zachowana zasada DRY). Ale czy nie można tego jakoś zautomatyzować ?? tzn. tak żeby np. osoba pisząca moduł lub plugin nie musiała się o to martwić ?? W PHP można umieścić jedną metodę w pliku np. index.php, przez który wszystko jest rutowane i wszystko do tego prowadzi w wyniku czego wszystko co jest ładowane w aplikacji jest autentykowane. Dlatego pytałem się o interfejs Filter, ponoć za pomocą jego można to zrealizować. Bo z tego co wiem wszystko co wchodzi do aplikacji przechodzi przez ten filter i odwrotnie. Oto przykład kodu napisanego przeze mnie i chciałbym go rozszerzyć o sprawdzanie użytkownika:

package xx.filter;



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.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

 * Mappowanie danych wychodzących z aplikacji na kodowanie UTF-8

 * @author yaotzin

 *

 */

public class FilterMappings implements Filter {

	private static final String DEFAULT_ENCODING = "UTF-8";

	private String encoding = DEFAULT_ENCODING;

	

	@Override

	public void init(FilterConfig filterConfig) throws ServletException {

		// TODO Auto-generated method stub

		String enc = filterConfig.getInitParameter("encoding");

		if(enc != null){

			encoding = enc;

		}

	}

	

	@Override

	public void doFilter(ServletRequest request, ServletResponse response,

			FilterChain chain) throws IOException, ServletException {

		// TODO Auto-generated method stub

		HttpServletRequest req = (HttpServletRequest) request;

		HttpServletResponse res = (HttpServletResponse) response;

		req.setCharacterEncoding(encoding);

		res.setCharacterEncoding(encoding);

		chain.doFilter(req, res);

	}

	

	@Override

	public void destroy() {

		// TODO Auto-generated method stub

		

	}

}

Proszę nie zwracać uwagi na nazwę pakietu, kod będzie refaktoryzowany pod tym kątem.

0

Nie uzywajac jesczcze tego filtra, mozesz zrobic:

package example;
public class Action extends org.apache.struts.action.Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response) {

     User user = (User) request.getSession().getAttribute("user");
   

     String action = getAction(request);
     if(!user.hasPermission(action){
           return mapping.findForward("noPermission"); //nie ma pozwolenia to zostanie przekierowany na odpowiednia strone
     }

     
     return process(mapping, form, request, response);

   }
private String getAction(HttpServletRequest request){
// TODO Wyciagnij z uri nazwe akcji
 retrun akcja;
}

public ActionForward process(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response) {

                return mapping.findForward("ok");
        }
}

//hasPermission moze tak wygladac:
boolean hasPermission(String action){
  //do jakiej grupy nalezy uzytkownik?
   // czy ta grupa moze wywolac action?? zaptytanie do bazy danych ... itd
   // tak, return true;
   // nie, return false; 
}


0

Właśnie w ten sposób to robię ;-) dzinks za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1