0

Vaadin と Spring のセキュリティは初めてです。ここ数日、ユーザーが LoginForm vaadin コンポーネントを使用して自分自身を認証できるように、Spring セキュリティを (サーブレットではなく) vaadin アプリケーションに統合する方法の正しい例を探していました。onlogin イベント内で使用したコード スニペットを次に示します。

login = new LoginForm();
login.addListener(new LoginForm.LoginListener() {
    private static final long serialVersionUID = 1L;

    @Override
    public void onLogin(LoginEvent event) {
        if (event.getLoginParameter("username").isEmpty() || event.getLoginParameter("password").isEmpty()) {
            getWindow().showNotification("Please enter username and/or password", Notification.TYPE_ERROR_MESSAGE);
        } else {
            SpringContextHelper helper = new SpringContextHelper(getApplication());
            authenticationManager = (ProviderManager)helper.getBean("authenticationManager");

            try {
                UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(event.getLoginParameter("username"), event.getLoginParameter("password"));   
                Authentication authentication = authenticationManager.authenticate(token);
                SecurityContextHolder.getContext().setAuthentication(authentication);
                authentication.getDetails();
            } catch (Exception e) {
                getWindow().showNotification(e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
            }
        }                   
    }
});

applicationContext.xml ファイルに記述した資格情報でログインしようとすると、次の行で Null Pointer 例外が発生しました。

 authenticationManager = (ProviderManager)helper.getBean("authenticationManager");

getBean("authenticationManager"); によってエラーがスローされることはわかっています。「**authenticationManager」** Beanを見つけることができないため、メソッド。問題は、このコンテキストでの"**authenticationManager "** とは何かということです。特別なメソッドを備えたある種のSpringセキュリティフレームワークインターフェースを実装するクラスまたはBeanですか。誰でもそのような Bean の例 (クラス、pojo など) を提供できますか? インターネットの例で見つけたように、web.xml にリスナーと context-params を記述しました。

Web.XML

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/applicationContext*.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

また、プレーンなユーザー名とパスワードを使用して認証マネージャーを記述する applicationContext.xml も提供しています。

APPLICATIONCONTEXT.XML

<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<http>
   <intercept-url pattern="/**" access="ROLE_USER" />
   <form-login />
   <logout />
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider>
      <user-service>
        <user name="userrrr" password="passsssword" authorities="ROLE_USER, ROLE_ADMIN" />
        <user name="otheruser" password="otherpasss" authorities="ROLE_USER" />
      </user-service>
    </authentication-provider>
</authentication-manager>

要するに。私の場合、applicationContext.xmlファイルに記述されているプレーンなユーザー名とパスワードを認証できる、実際のBeanの例を誰かが提供してくれますか? Vaadin 6、Maven、Hibernate、GlassFish、Sping security 3 を使用しています。この 3 日間、この問題に取り組んでいるので、助けていただければ幸いです。

インターネット上には多くの例がありますが、それらはすべて未完成で不明確であり、Vaadin アプリケーション サーベルトまたは jsp ログイン フォーム (アプリケーションではない) を使用し、さまざまな手法を使用しています。

公式の vaadin wiki https://vaadin.com/wiki/-/wiki/Main/Spring%20Integration?p%255Fr%255Fp%255F185834411%255Ftitle=Spring%2520Integrationに記載されている方法を選択しました。しかし、それは非常に貧弱で、セキュリティではなくSpringフレームワークの統合について説明しています。

Spring Security + Vaadin: How to create custom non-JSP login form?完璧に見える別の例を見つけました。. しかし、authenticationManager に関する詳細な情報が見つかりません。

また、別の良い例もあります https://vaadin.com/forum/-/message_boards/view_message/373038。ただし、認証の詳細を渡すために HttpServletRequest と HttpServletResponse を使用しています。vaadin アプリケーション クラスが onRequestStart および onRequestEnd メソッドを使用して HttpServletRequestListener インターフェイスを実装できることはわかっていますが、これらのリクエストを onLogin イベントに渡す/使用する方法を知っています。

親愛なるJAVAマスターの皆さん、初心者のJAVA JEDIプログラマーが正しい方法を選択するのを手伝ってください:)

Spring Context ヘルパー クラス

public class SpringContextHelper {  
    private ApplicationContext context;

    public SpringContextHelper(Application application) {
        ServletContext servletContext = ((WebApplicationContext) application.getContext()).getHttpSession().getServletContext();
        context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
    }

    public Object getBean(final String beanRef) {
        return context.getBean(beanRef);
    }    
}
4

1 に答える 1

1

org.springframework.security.authenticationを試してください。ProviderManagerの代わりにAuthenticationManagerインターフェース:

authenticationManager = (AuthenticationManager)helper.getBean("authenticationManager");

編集。confでalias="authenticationManager"をid="authenticationManagerに置き換えます。

于 2013-01-17T08:52:21.373 に答える