2013-11-01 4 views
1

У меня есть старое веб-приложение, которое мне нужно перенести в Ваадин.Как выполнить проверку учетных данных пользователя j_security_check в Vaadin?

В старом приложении есть страница, которая запрашивает у пользователя логин и пароль.

СПЯ страница выглядит следующим образом:

<?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 содержит следующие данные:

<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> 

Это означает, что в случае неудачной аутентификации пользователь перенаправляется на страницу login_fail.jsp.

В файле context.xml я нашел следующую запись, из которой я пришел к выводу, что в Tomcat есть встроенный механизм, который считывает правильный логин и пароль из указанной базы данных и выполняет их проверку без какого-либо дополнительного кода.

<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> 

В приложении Vaadin у меня есть пользовательский интерфейс с текстовыми полями и кнопкой.

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) { 

    } 
} 

Когда пользователь нажимает на кнопку (метод loginButtonPressed выполняется), я хочу

  1. проверки учетных данных, введенных в текстовых полях userName и password,
  2. дисплей окно уведомления, если учетные данные неверны, и
  3. открывает другой интерфейс (view), если они верны.

Как я могу сделать мой доступ к приложению Vaadin, что механизм Tomcat для проверки учетных данных (я. Е. Мой Vaadin приложение должно выполнять учетные данные проверки точно так же, как и старые приложения)?

Какой код позволяет мне проверить, являются ли имя пользователя x и пароль y действительны в соответствии с базой данных, указанной в context.xml?

Обновление 1 (05.11.2013): Я нашел описание использования аутентификации на основе домена here.

Но я столкнулся с проблемой:

сервлет применение в примере продолжается com.vaadin.terminal.gwt.server.AbstractApplicationServlet, который не доступен в моем проекте Vaadin 7.

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

Update 2 (05.11.2013 15:53):

Я пытался реализовать аутентификацию в простейшим образом:

1) Используйте BASIC механизм аутентификации. 2) Настройте веб-приложение так, чтобы все Страницы Vaadin требуют, чтобы пользователь вошел в систему.

Для того, чтобы достичь этого, я добавил следующие фрагменты: 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> 

Но это не работает: диалоговое окно учетных данных отображается на доступ к приложению, но когда я ввожу правильные учетные данные и нажмите «ОК», снова появится такое же диалоговое окно.

+0

Дмитрий, вам удалось решить вашу проблему? –

+0

Да. Сейчас я использую Apache Shiro. Он позволяет использовать данные из базы данных из области Apache Tomcat. –

ответ

1

Я рекомендую исключить аутентификацию у Ваадина. Сохраните страницу JSP как форму аутентификации и используйте аутентификацию по умолчанию из спецификации Servlet.

Если у вас есть программируемая аутентификация в вашем коде, она открывает дверь для ошибок. Более того, ваш код более сложный. Лучше использовать декларативную безопасность. В этом случае аутентификация отделена от приложения. Ваше приложение проще, безопасность более надежна.

Посмотрите на веб-семинар http://www.youtube.com/watch?v=PNAo3ApWA-A Весь интересен, но пример того, как сделать аутентификацию начинается с 47 минут. Оба решения представлены: пользовательский код и декларативная безопасность.

После просмотра этого веб-семинара я уверен, что декларативная безопасность - правильный выбор.

Декларативная безопасность нуждается в некоторой корректировке в web.xml. Сравнивая с чистым приложением Vaadin, не все запросы обрабатываются VaadinServlet: запросы аутентификации должны обрабатываться по умолчанию. Во всяком случае, декларативная безопасность стоит усилий по настройке.

1

Кажется, что у вас все сложнее. Ниже вы найдете реальное решение. Он используется для приложения Vaadin и просто работает.

1. Вы должны выносного Войти страница

Это самый простой способ. Если вы хотите, вы можете легко стилизовать эту страницу, чтобы не нарушать пользовательский интерфейс.

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

Как обычно у вас будет следующее:

<form id="login" method="post" action="j_security_check" > 

<input name="j_username" type="text"> 
<input name="j_password" type="text"> 

2. Я хотел бы предложить, чтобы внешний вход не удалось страница

В основном это просто необходимо, чтобы уведомить пользователя там было что-то неправильно. Это может также предполагать, например, переключение.

3. Метод Настройка надлежащего аутентификации

<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. Не забудьте установить тайм-аута сеанса

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

5. Вы сделаны, только тест

 Смежные вопросы

  • Нет связанных вопросов^_^