2012-12-07 13 views
6

Czy istnieje sposób programowego dodawania uwierzytelniania opartego na formularzach zgodnie z opisem poniżej? Używam własnego LdapLoginModule. Początkowo używam podstawowego uwierzytelniania i działało OK, ale teraz chcę mieć większą kontrolę na stronie logowania (np. Logo wyświetlacza itp.).Osadzone molo - Programowe dodawanie uwierzytelniania na podstawie formularza

Czy są jakieś dobre próbki?

Używam wbudowanego pomostu v8.1.7. Nie używam żadnego web.xml dla osadzonego pomostu. Serwer pomostowy uruchamia się programowo.

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>Test JAAS Realm</realm-name> 
    <form-login-config> 
     <form-login-page>/login.html</form-login-page> 
     <form-error-page>/error.jsp</form-error-page> 
    </form-login-config> 
</login-config> 

Odpowiedz

11

Tworzenie FormAuthenticator i ustawić to na swojej SecurityHandler dla ServletContextHandler. Ten kod tworzy banalny serwer z 2 serwletami. Pierwszy serwlet odpowiada komunikatem hello do uwierzytelnionej nazwy użytkownika. Drugi serwlet implementuje banalny formularz logowania.

powinny mieć możliwość, aby wkleić kod do main[] i uruchomić (trzeba będzie następujące słoików w ścieżce klas; jetty-server, jetty-servlet i jetty-security). Aby przetestować, wskaż przeglądarkę pod numerem http://localhost:8080, przed wyświetleniem odpowiedzi pod numerem hello username powinien zostać wyświetlony monit o podanie danych logowania (nazwa użytkownika/hasło).

Server server = new Server(8080); 
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("hello " + request.getUserPrincipal().getName()); 
    } 
}), "/*"); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("<html><form method='POST' action='/j_security_check'>" 
     + "<input type='text' name='j_username'/>" 
     + "<input type='password' name='j_password'/>" 
     + "<input type='submit' value='Login'/></form></html>"); 
    } 
}), "/login"); 

Constraint constraint = new Constraint(); 
constraint.setName(Constraint.__FORM_AUTH); 
constraint.setRoles(new String[]{"user","admin","moderator"}); 
constraint.setAuthenticate(true); 

ConstraintMapping constraintMapping = new ConstraintMapping(); 
constraintMapping.setConstraint(constraint); 
constraintMapping.setPathSpec("/*"); 

ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); 
securityHandler.addConstraintMapping(constraintMapping); 
HashLoginService loginService = new HashLoginService(); 
loginService.putUser("username", new Password("password"), new String[] {"user"}); 
securityHandler.setLoginService(loginService); 

FormAuthenticator authenticator = new FormAuthenticator("/login", "/login", false); 
securityHandler.setAuthenticator(authenticator); 

context.setSecurityHandler(securityHandler); 

server.start(); 
server.join(); 
+0

Nie udało się sprawić, aby działało ... – oshai

+0

Dzięki! To mi pomogło i udało mi się sprawić, by działało. – mwhidden

+2

Jest to pomocne, ale zastanawiam się, w jaki sposób to zrobiłeś. Dokumentacja Jetty ... nie jest niegrzeczna, skąpa. Na przykład "ConstraintMapping" jest całkowicie nieudokumentowane, a Google nie dostarcza żadnych informacji na jego temat. Czy musisz przeczytać wewnętrzny kod Jetty, aby się go nauczyć? – Timmmm

Powiązane problemy