5

Vaadinは初めてです。その前に、JSFWebアプリケーションを作成しました。ユーザーのログインを実行するManagedBeanがありました。クレデンシャルの実際の検証を委任するためにセキュリティレルムを使用しました。

Vaadinでこれを行うにはどうすればよいですか?ベストプラクティスはありますか?何かをまとめるところですが、なんらかの標準的な手順が必要ですね!?これに関するチュートリアルをいくつか見つけましたが、主にSpringを使用しています(EJBを使用したい)。また、すべてのチュートリアルは不必要に複雑に見えました。

非常に一般的なものについては、いくつかの簡単で決定的なチュートリアルが必要です。

4

3 に答える 3

3

これは、私が見つけたJAASを使用してVaadinアプリケーションを保護する方法に関する唯一のVaadin公式記事です。私はネイティブまたは公式のVaadinSecurizationを意味します。SpringのセキュリティであるShiroを少しググるともっと見つかりますが、純粋なESBはJAASを使用します。この記事では、アプリケーションの設定方法を学ぶのに十分ではないことに同意します。私はここで私の経験を共有します:

1. Vaadin CDI拡張機能:

<!-- Vaadin Official DI support. -->
<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadin-cdi</artifactId>
  <version>1.0.0.alpha2</version>
</dependency>

2.JAASについて理解する

JAASはサーバーアプリケーションプロバイダー(TomEE、Jboss、Wildfly、Glasfish)に依存しているため、概要記事を読んで、非vaadinアプリケーションでJAASがどのように機能するかを確認することをお勧めします。ここでは、Tomeeを使用した概念実証を見つけることができます。

3.独自のログインモジュールを開発します。

たとえば、カスタムログインモジュールを作成することにした場合:

public class MyLoginModule implements LoginModule {
private CallbackHandler handler;
private Subject subject;
private UserPrincipal userPrincipal;
private RolePrincipal rolePrincipal;
private String login;
private List<String> userGroups;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
Map<String, ?> options) {
handler = callbackHandler;
this.subject = subject;
}
@Override
public boolean login() throws LoginException {
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("login");
callbacks[1] = new PasswordCallback("password", true);
try {
handler.handle(callbacks);
String name = ((NameCallback) callbacks[0]).getName();
String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
// Here we validate the credentials against some
// authentication/authorization provider.
// It can be a Database, an external LDAP, a Web Service, etc.
// For this tutorial we are just checking if user is "user123" and
// password is "pass123"
if (name != null && name.equals("admin") && password != null && password.equals("admin")) {
login = name;
userGroups = new ArrayList<String>();
userGroups.add("admin");
return true;
}
// If credentials are NOT OK we throw a LoginException
throw new LoginException("Authentication failed");
} catch (IOException e) {
throw new LoginException(e.getMessage());
} catch (UnsupportedCallbackException e) {
throw new LoginException(e.getMessage());
}
}
@Override
public boolean commit() throws LoginException {
userPrincipal = new UserPrincipal(login);
subject.getPrincipals().add(userPrincipal);
if (userGroups != null && userGroups.size() > 0) {
for (String groupName : userGroups) {
rolePrincipal = new RolePrincipal(groupName);
subject.getPrincipals().add(rolePrincipal);
}
}
return true;
}
@Override
public boolean abort() throws LoginException {
return false;
}
@Override
public boolean logout() throws LoginException {
subject.getPrincipals().remove(userPrincipal);
subject.getPrincipals().remove(rolePrincipal);
return true;
}
}

アプリケーションのMETA-INF/context.xmlで参照してください。この設定はTomEE用ですが、glashfishまたはその他の設定も同様である必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Realm className="org.apache.catalina.realm.JAASRealm" appName="myrealm" userClassNames="net.sf.jaas.auth.UserPrincipal"
    roleClassNames="net.sf.jaas.auth.RolePrincipal" />
</Context>

userClassNamesとroleClassNamesは単なるJavaPojoですが、java.security.Principalを実装する必要があることに注意してください。

3.VaadinログインビューでJAASを有効にする

Vaadin TextFieldとPasswordを使用してお気に入りのログインフォームを定義し、doLoginEvent()でJAASへの参照を定義します。JaasAccessControl.loginが呼び出されるたびに、LoginModuleの新しいインスタンスが作成されます。

  import com.vaadin.cdi.access.JaasAccessControl;
  try {
            JaasAccessControl.login(loginEvent.getUsername(), loginEvent.getPassword());
            logger.info("User {} authenticated", getPrincipalName());
            navigator.navigateTo(Main.NAME);
        } catch (Exception e) {
            Notification.show("Error logging in", Type.ERROR_MESSAGE);
            logger.error(e.getMessage(), e);
        }

4.ログに記録されたユーザーの情報を使用します。

ユーザーがJAASログインフィルターを通過するたび。それは彼のリクエストコンテキストで彼を識別するクラスで利用可能になります。このクラスはプリンシパル(LoginModuleクラスで以前に設定したクラス)と呼ばれます。

public boolean isUserInRole(String role) {
        return JaasAccessControl.getCurrentRequest().isUserInRole(role);
    }

    public String getPrincipalName() {
        Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal();
        if (principal != null) {
            return principal.getName();
        }

        return null;
    }

    public boolean isUserSignedIn() {
        Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal();
        return principal != null;
    }

5.LoginModuleの代替

カスタムログインモジュールを作成する必要はありません。Tomeeが提供する実装はほとんどないため、通常はJavaEEプロバイダーです。一部のデータベーステーブルでは、プロパティファイルに基づく認証。TomeeのドキュメントJAASを見て、いくつかの例を確認してください。

6.TomEEでJAASを有効に するLoginModuleを参照するjaas.configファイルを作成する必要があります。次に例を示します。

filename: jaas.config 
myrealm{
    net.sf.jaas.MyLoginModule required;
};

次に、次のパラメータを使用してアプリケーションサーバーを起動します。

-Djava.security.auth.login.config=E:/apache-tomee-jaxrs-1.6.0.2/conf/jaas.config

これを確認したい場合は、この概念実証をご覧ください。Tomee、Vaadin 7、JAASを使用するこの例を確認してください。

于 2015-01-29T12:39:59.173 に答える
1

私は数ヶ月前に同じ問題に遭遇していました。それが実際にどのように機能するかを理解できなかったので、春のアドオンを調べて、今はVaadinログインフォームと春のセキュリティを使用しています

于 2013-07-23T07:55:22.923 に答える
1

JAAS、Vaadin 8、Vaadin CDIアドオン、および組み込みを使用する完全な例は、ここLoginFormから入手できます。手順は次のとおりです。

  1. でVaadinCDIアドオンを有効にするpom.xml
  2. 注釈付きのVaadinUIでCDIを有効にし、@CDIUINavigator
  3. 注釈(またはその他の注釈)を追加して、CDIビューで認証を有効にします@RolesAllowedjavax.annotation.security
  4. ビルトインから派生し、ユーザーの認証に使用するログインビューを実装します。LoginFormJaasAccessControl

ピースがどのように組み合わされているかを理解すれば、実際にはかなり素晴らしく流暢な体験になります。

Vaadin wikiには、JAASでデータベースに基づく認証を使用する方法を説明する長い記事があります。

于 2017-03-11T12:29:08.340 に答える