2013-04-12 10 views
7

Jestem nowicjuszem w zakresie programowania stron internetowych. Pytam o wspólny wzorzec, aby robić rzeczy takie jak sprawdzanie uwierzytelnienia. Oto scenariusz:Jak strona JSP powinna sprawdzać autentyczność

Strona ma stronę logowania dla odwiedzających. Przejmie nazwę użytkownika i zaszyfrowane hasło i wyśle ​​je do serwera, a następnie otrzyma kod błędu (nazwa użytkownika/hasło nie pasuje) lub klucz uwierzytelniający z serwera. Gdy użytkownik zaloguje się pomyślnie, chcę, aby strona internetowa automatycznie przechodziła na stronę main.jsp, która przedstawia główną funkcjonalność strony.

W tym przypadku chcę, aby main.jsp sprawdzić uwierzytelnianie użytkownika. Oznacza to, że nie chcę, aby coś takiego się działo, ponieważ użytkownik może otworzyć bezpośrednio www.example.com/main.jsp, a jeśli coś takiego, chcę przekierować na stronę logowania.

Jak mogę przekazywać informacje uwierzytelniające na stronie i jak mogę uniemożliwić użytkownikowi bezpośredni dostęp do main.jsp bez logowania? Czy muszę korzystać z sesji lub cokolwiek?

+3

Jeśli rozumiem zostanie poprawnie, wydaje się to, czego potrzebujesz jest filtrowany w Twojej aplikacji internetowej ...możesz spróbować przeczytać ten http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html –

Odpowiedz

14

można spróbować użyć filtry:

Filtr może wstępnie proces żądania, zanim dotrze do serwletu, post-procesowego odpowiedzią pozostawiając serwletu, lub oba. Filtry mogą przechwytywać, analizować i modyfikować żądania i odpowiedzi.

UWAGA: należy dodać atrybut sesji po zapłaceniu użytkownik jest zalogowany, możesz użyć tego atrybutu sesji na filtrze

na login.jsp dodają:

session.setAttribute("LOGIN_USER", user); 
//user entity if you have or user type of your user account... 
//if not set then LOGIN_USER will be null 

web.xml

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 

SessionCheckFilter.java

public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (!userType.equals("ADMIN")){ //check if user type is not admin 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to 
     } 
     fc.doFilter(request, response); 
    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
5

Jak strona JSP powinien sprawdzić uwierzytelnianie

nie powinno. Należy użyć uwierzytelniania zarządzanego kontenera i zdefiniować login/zabezpieczenie w pliku web.xml za pomocą wzorców adresów URL.


Dodane przez Glen najlepiej:

np Dodaj coś takiego web.xml:

<security-constraint> 
    <display-name>GET: Employees Only</display-name> 
    <web-resource-collection> 
     <web-resource-name>Restricted Get</web-resource-name> 
     <url-pattern>/restricted/employee/*</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>Employee</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
+0

Uwierzytelnianie zarządzane przez kontener jest zdefiniowane w specyfikacji serwletu. Czy to wystarczająco oficjalne dla ciebie? – EJP

+0

Zdecydowanie użyj tego i nie koduj własnego rozwiązania! To jest zamierzony sposób. –

+0

Nie tylko to, ale zgodnie ze specyfikacją platformy JEE, kontener internetowy będzie znał tożsamość użytkownika i role, umożliwiając automatyczną integrację z EJB, JCA itp. Oraz umożliwiający programowy dostęp za pośrednictwem standardowego interfejsu API, jak również. request.isUserInRole (rola), request.getUserPrinciple() i podobne z EJB –

0

Działa to również dla mnie

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 


public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     req.getRequestDispatcher("login.jsp").forward(req, resp); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (userType.equals("ADMIN")){ //check if user type is admin 
     fc.doFilter(request, response); it redirected towards main.jsp 
     } 

    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
-4

Jak o użyciu:

String username = request.getRemoteUser();