У меня есть старое веб-приложение, которое мне нужно перенести в Ваадин.Как выполнить проверку учетных данных пользователя 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
выполняется), я хочу
- проверки учетных данных, введенных в текстовых полях
userName
иpassword
, - дисплей окно уведомления, если учетные данные неверны, и
- открывает другой интерфейс (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>
Но это не работает: диалоговое окно учетных данных отображается на доступ к приложению, но когда я ввожу правильные учетные данные и нажмите «ОК», снова появится такое же диалоговое окно.
Дмитрий, вам удалось решить вашу проблему? –
Да. Сейчас я использую Apache Shiro. Он позволяет использовать данные из базы данных из области Apache Tomcat. –