Я новичок в Java EE, и у меня возникли большие проблемы с началом работы с приложением, которое я хочу создать. То, что я хотел бы, является клиентом приложения Swing, который соединяется с проектом EJB. Я использую Glassfish v3.1.1. Пока что у меня есть два bean-компонента без состояния, один из которых защищен с помощью @DeclareRoles и JDBC-области в Glassfish, а также начала клиента.
Когда клиент запущен, вы можете выбрать имя пользователя, ввести пароль и, таким образом, войти в систему. Если вы используете правильный пароль, все работает (клиентская консоль плюет на некоторую «безопасную» информацию). Однако, если вы введете неверный пароль, вы навсегда заблокированы. InitialContext.lookup больше не вызывает CallbackHandler для проверки нового пароля, он продолжает использовать неверные учетные данные.
Может кто-нибудь подсказать, пожалуйста, как это правильно сделать? Использую ли я правильный метод для этой ситуации - в Интернете огромное количество информации, но в основном 0 примеров того, что я пытаюсь сделать? Кажется, что все относится только к J2EE или сервлетам! Вот некоторый соответствующий код.
GlassFish-EJB-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<security-role-mapping>
<role-name>Admin</role-name>
<group-name>Admin</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>Employee</role-name>
<group-name>Employee</group-name>
</security-role-mapping>
<enterprise-beans>
<ejb>
<ejb-name>LoginBean</ejb-name>
<jndi-name>ejb/machineryhub/LoginService</jndi-name>
</ejb>
<ejb>
<ejb-name>EmployeeBean</ejb-name>
<jndi-name>ejb/machineryhub/EmployeeService</jndi-name>
<ior-security-config>
<as-context>
<auth_method>username_password</auth_method>
<realm>machineryhub</realm>
<required>true</required>
</as-context>
</ior-security-config>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
Нужно ли мне добавлять блок <ior-security-config>
к каждому защищенному бину, который я создаю?
приложения client.xml:
<?xml version="1.0" encoding="UTF-8"?>
<application-client version="6" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application-client_6.xsd">
<display-name>MachineryHub</display-name>
<ejb-ref>
<ejb-ref-name>LoginBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<remote>machineryhub.service.LoginService</remote>
</ejb-ref>
<ejb-ref>
<ejb-ref-name>EmployeeBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<remote>machineryhub.service.EmployeeService</remote>
</ejb-ref>
<callback-handler>machineryhub.LoginCallbackHandler</callback-handler>
</application-client>
machineryhub.LoginCallbackHandler:
public class LoginCallbackHandler implements CallbackHandler {
@Override
public void handle(Callback[] clbcks) throws IOException, UnsupportedCallbackException {
LoginFrame l = LoginFrame.instance;
for (Callback cb : clbcks) {
if (cb instanceof NameCallback) {
NameCallback ncb = (NameCallback) cb;
ncb.setName(l.usernameCombo.getSelectedItem().toString());
} else if (cb instanceof PasswordCallback) {
PasswordCallback pcb = (PasswordCallback) cb;
pcb.setPassword(l.passwordText.getPassword());
} else {
throw new UnsupportedCallbackException(cb);
}
}
}
}
А теперь, для длинного, клиент приложения Swing.
machineryhub.LoginFrame
public class LoginFrame extends JFrame implements ActionListener {
public static LoginFrame instance;
public static void main(String[] args) {
// Handle uncaught exceptions in the main and Swing threads
ExceptionHandler.registerExceptionHandler();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(new SubstanceMistSilverLookAndFeel());
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
(new LoginFrame()).setVisible(true);
} catch (final Exception exception) {
ExceptionHandler.handle(Thread.currentThread(), exception);
}
}
});
}
public JComboBox usernameCombo;
public JPasswordField passwordText;
private JButton loginButton;
public LoginFrame() {
// Window Setup
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Login :: MachineryHub");
this.setLocationRelativeTo(null);
this.setIconImages(IconFactory.application_images);
// Create GUI
createGui();
usernameCombo.requestFocusInWindow();
LoginFrame.instance = this;
}
private void createGui() {
// Content Pane
final JPanel contentPanel = new JPanel();
List<String> usernames = getLoginService().getUsernames();
Collections.sort(usernames);
usernameCombo = new JComboBox(usernames.toArray());
passwordText = new JPasswordField(15);
passwordText.setActionCommand("Login");
passwordText.addActionListener(this);
loginButton = new JButton("Login", IconFactory.getImageIcon(IconFactory.Icon.KEY, 16));
loginButton.setActionCommand("Login");
loginButton.addActionListener(this);
GroupLayout layout = new GroupLayout(contentPanel);
contentPanel.setLayout(layout);
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);
layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(usernameCombo).addGroup(layout.createSequentialGroup().addComponent(passwordText).addComponent(loginButton)));
layout.setVerticalGroup(layout.createSequentialGroup().addComponent(usernameCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(passwordText).addComponent(loginButton)));
this.setContentPane(contentPanel);
this.pack();
}
@Override
public void actionPerformed(final ActionEvent e) {
if (e == null || e.getActionCommand() == null) {
return;
}
if (e.getActionCommand().equals("Login")) {
loginButton.setEnabled(false);
passwordText.setEnabled(false);
usernameCombo.setEnabled(false);
loginButton.setIcon(IconFactory.getImageIcon(IconFactory.SpecialImage.LOADING));
try {
Context c = new InitialContext();
EmployeeService es = (EmployeeService) c.lookup("ejb/machineryhub/EmployeeService");
System.out.println("Number of employees: " + es.getAllEmployees().size());
this.dispose();
} catch (NamingException exception) {
loginButton.setEnabled(true);
passwordText.setEnabled(true);
usernameCombo.setEnabled(true);
loginButton.setIcon(IconFactory.getImageIcon(IconFactory.Icon.KEY, 16));
JOptionPane.showMessageDialog(LoginFrame.this, "Login Error: " + exception.getMessage(), "Login Error! :: MachineryHub", JOptionPane.ERROR_MESSAGE);
}
}
}
private LoginService getLoginService() {
try {
Context c = new InitialContext();
return (LoginService) c.lookup("ejb/machineryhub/LoginService");
} catch (NamingException ne) {
throw new RuntimeException(ne);
}
}
}