Tengo una vieja aplicación web que necesito migrar a Vaadin.

En la app antigua hay una página que le pide al usuario de inicio de sesión y la contraseña.

La página JSP se parece a esto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8"%>
[...]
<head>
<title>Some product</title>
    <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()+"/css/styles.css"%>" />
</head>
<body>
<%@ include file="inc/main-navigation.jsp"%>
    <form action="j_security_check" method="post" style="margin:0px">
        [...]
        <input type="text" style="width:100%" name="j_username" />
        <input type="password" name="j_password" />
    </form>
</body>
</html>

web.xml contiene las siguientes entradas:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Some product</realm-name>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/login_fail.jsp</form-error-page>
    </form-login-config>
</login-config>

Esto significa que en caso de no autenticación el usuario es dirigido a la página login_fail.jsp.

En el context.xml archivo he encontrado siguiente entrada desde que llego a la conclusión de que hay un mecanismo interno en Tomcat que dice nombre de usuario correcto y la contraseña de la base de datos especificada y realiza su control, sin ningún código adicional.

<Context path="/myapp">
    <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
        connectionURL="[...]"
        userTable="[...]" userNameCol="user_name" userCredCol="user_pass"
        userRoleTable="[...]" roleNameCol="role_name"/>
</Context>

En el Vaadin aplicación tiene una interfaz de usuario con ambos campos de texto y un botón.

public class BookkeepingView extends VerticalLayout implements View {
public BookkeepingView()
{
VerticalLayout contentPanel = new VerticalLayout();
contentPanel.setStyleName("body");
contentPanel.addComponent(getHeaderPanel());
contentPanel.addComponent(getLoginPanel());
contentPanel.addComponent(getFooterPanel());
addComponent(contentPanel);
}
private Component getHeaderPanel() {
return createCustomLayoutPanel("main-navigation");
}
private Component getFooterPanel() {
return createCustomLayoutPanel("copyright");
}
private CustomLayout getLoginPanel() {
Panel panel = new Panel();
panel.setSizeUndefined();
addComponent(panel);
CustomLayout customLayoutPanel = new CustomLayout("login");
final TextField userName = new TextField();
customLayoutPanel.addComponent(userName, "j_username");
final PasswordField password = new PasswordField();
customLayoutPanel.addComponent(password, "j_password");
final Button loginButton = new Button(I18n.l("bookkeeping_login_button"));
customLayoutPanel.addComponent(loginButton, "login");
loginButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent clickEvent) {
loginButtonPressed();
}
});
return customLayoutPanel;
}
private void loginButtonPressed() {
Notification.show("Login button pressed", Notification.Type.TRAY_NOTIFICATION);
}
private CustomLayout createCustomLayoutPanel(final String aHtmlFileName) {
Panel panel = new Panel();
panel.setSizeUndefined();
addComponent(panel);
CustomLayout customLayoutPanel = new CustomLayout(aHtmlFileName);
return customLayoutPanel;
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
}
}

Cuando el usuario presiona el botón (método loginButtonPressed se ejecuta), quiero

  1. comprobar las credenciales especificadas en los campos de texto userName y password,
  2. mostrar un cuadro de notificación, si las credenciales son incorrectas y
  3. abre otra interfaz de usuario (vista), si son correctos.

¿Cómo puedo hacer que mi Vaadin de acceso de la aplicación que Tomcat mecanismo para la comprobación de las credenciales (he. e. mi Vaadin aplicación se debe realizar la comprobación de credenciales exactamente de la misma manera como la edad, app)?

Cuál es el código que me permite comprobar si el nombre de usuario x y contraseña y son válidas de acuerdo a la base de datos especificada en context.xml?

Update 1 (05.11.2013): he encontrado una descripción de cómo utilizar reino de la autenticación basada en aquí.

Pero me encontré con un problema:

La aplicación servlet en el ejemplo se extiende com.vaadin.terminal.gwt.server.AbstractApplicationServlet, que no está disponible en mi Vaadin 7 proyecto.

@WebServlet(urlPatterns={"/ui/*", "/VAADIN/*"})
public class DemoAppServlet extends AbstractApplicationServlet {

Actualización 2 (05.11.2013 15:53):

Traté de implementar la autenticación en la forma más sencilla posible:

1) manejo BÁSICO del mecanismo de autenticación.
2) Configurar la aplicación web para que todos Vaadin páginas requieren que el usuario se registra en.

Con el fin de lograr esto, he añadido siguientes fragmentos web.xml:

<servlet-mapping>
<servlet-name>VaadinDemoApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>VaadinDemoApplicationConstraint</display-name>
<web-resource-collection>
<web-resource-name>Vaadin application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>viewer</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Protected page</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>viewer</role-name>
</security-role>

Pero no funciona: El cuadro de diálogo de credenciales se muestra al acceder a la aplicación, pero cuando entro credenciales correctas y pulse «ACEPTAR», el mismo aparecerá el cuadro de diálogo de nuevo.

  • Dmitri, hiciste para resolver su problema?
  • Sí. Estoy usando Apache Shiro ahora. Se permite el uso de los datos de la base de datos de Apache Tomcat reino.
InformationsquelleAutor DP_ | 2013-11-01

2 Comentarios

  1. 2

    Parece que tiene demasiado complicado todo. Por favor buscar debajo de la vida real de la solución. Se utiliza para una Vaadin aplicación y simplemente funciona.

    1. Usted necesita externo de la página de inicio de sesión

    Esta es la forma más sencilla. Si usted desea, usted puede fácilmente el estilo de la página a fin de no romper la experiencia del usuario.

    <link rel="stylesheet" type="text/css" href="VAADIN/themes/reindeer/styles.css">
    ...
    <div class="v-app v-theme-reindeer">

    Como de costumbre, usted tendrá las siguientes:

    <form id="login" method="post" action="j_security_check" >
    <input name="j_username" type="text">
    <input name="j_password" type="text">

    2. Yo sugeriría externas de error de inicio de sesión de la página de

    Básicamente, sólo se necesita para notificar a un usuario que había algo mal. También podría sugerir, por ejemplo, para entrar.

    3. Configurar adecuada auth

    <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
    <form-login-page>/VAADIN/loginPage.html</form-login-page>
    <form-error-page>/VAADIN/loginFailed.html</form-error-page>
    </form-login-config>
    </login-config>

    4. No se olvide de establecer tiempo de espera de sesión

    <session-config>
    <session-timeout>60</session-timeout>
    </session-config>

    5. Usted está hecho, sólo prueba

  2. 1

    Te recomiendo que para excluir la autenticación de Vaadin. Mantener una página JSP como formulario de autenticación y el uso de autenticación predeterminado de especificación Servlet.

    Si usted tiene programable de autenticación en el código, se abre la puerta a los errores. Por otra parte, el código es más complicado. Mejor uso de la seguridad declarativa. En caso de que la autenticación se separa de la aplicación. Su aplicación es más sencilla, la seguridad es más de confianza.

    Echar un vistazo en el webinar http://www.youtube.com/watch?v=PNAo3ApWA-A Todo es muy interesante, pero ejemplo de cómo hacer que la autenticación se inicia a partir de 47 minutos. Ambas soluciones se presentan: código personalizado y la seguridad declarativa.

    Después de ver que webinar estoy seguro de que la seguridad declarativa es la elección correcta.

    Seguridad declarativa de necesidad de algunos ajustes en web.xml. Comparando a puro Vaadin aplicación, no todas las solicitudes son tramitadas por VaadinServlet: las solicitudes de autenticación deben ser manejados de forma predeterminada. De todos modos, la seguridad declarativa vale el esfuerzo de configuración.

Dejar respuesta

Please enter your comment!
Please enter your name here