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);
}
}