我是Vaadin和Spring安全的新手。最近几天我在google搜索正确的示例如何将spring security集成到vaadin应用程序(而不是servlet)中,以便用户可以使用LoginForm 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(class,pojo等)的例子。我在web.xml中描述了listeners和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>
所以简而言之。有没有人可以为我提供一个工作bean示例,对于我的情况,它可以验证applicationContext.xml文件中描述的普通用户名和密码。如果它有助于我使用Vaadin 6,Maven,Hibernate,GlassFish和Sping安全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事件/使用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);
}
}
答案 0 :(得分:1)
尝试org.springframework.security.authentication。 AuthenticationManager 界面,而不是 ProviderManager :
authenticationManager = (AuthenticationManager)helper.getBean("authenticationManager");
编辑。在您的conf中用id =“authenticationManager”替换alias =“authenticationManager”。