0

在 Spring Security 中使用自定义 JSP 登录页面相当容易。我们的应用程序虽然基于 Vaadin,但我不想有 JSP 登录页面。我想要的是作为 Vaadin 小部件创建的自定义精美登录窗口。

从技术上讲,我可以使用 Vaadin 的FormLayout和名称字段,例如j_usernamej_password ...但这是 Java 类而不是 JSP 文件,那么我在http Spring Security 元素中指定什么?我是说:

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page='MyLoginWindow.java or what?' />
</http>
4

3 回答 3

1

使用 LoginForm 并在 LoginListener 中使用类似这样的东西

try {
  val authentication = new UsernamePasswordAuthenticationToken(name, pass)
  SecurityContextHolder.getContext.setAuthentication(authenticationManager.authenticate(authentication))
} catch {
  case e: AuthenticationException => {
    SecurityContextHolder.clearContext()
  }
}
于 2012-08-16T17:59:03.343 回答
1

我对 Spring Security 完全不熟悉,但是几年前我们 Vaadin 的一个人制作了一个演示应用程序https://github.com/peholmst/SpringSecurityDemo。我不知道它是否仍然是最新的,或者它是否回答了你的问题,但也许你可以自己看看,看看你是否能从那里得到任何答案。否则,您也许可以亲自联系 Petter,看看他是否对该主题有任何新的想法。

于 2012-08-20T06:56:46.433 回答
1

请看下面我的方法。该代码显示了单击登录按钮时发生的功能。

loginBtn.addListener(new Button.ClickListener() {            
        @Override
        public void buttonClick(ClickEvent event) {
            // Getting the helper for working with spring context
            // found here https://vaadin.com/wiki/-/wiki/Main/Spring%20Integration   
            SpringContextHelper helper = new SpringContextHelper(getApplication());

            // Get the providerManagerBean
            ProviderManager authenticationManager = (ProviderManager)helper
                    .getBean("authenticationManager");

            // Get entered data for name and password
            String name = usernameEntered;
            String password = passwordEntered;

            // Validation
            if (StringUtils.isBlank(name) || StringUtils.isBlank(password)) {
                getWindow().showNotification("Username or password cannot be empty", 
                        Notification.TYPE_ERROR_MESSAGE);
            } else {
                try {
                    // Security functionality goes here
                    UsernamePasswordAuthenticationToken token = 
                            new UsernamePasswordAuthenticationToken(name, password);

                    Authentication authentication = authenticationManager.authenticate(token);

                    // Set the authentication info to context      
                    SecurityContextHolder.getContext().setAuthentication(authentication);

                    // During the authentification the AppUser instance was set as 
                    // details, for more info about the user
                    AppUser user = (AppUser) authentication.getDetails();                        

                    if (user != null) {
                        // Switch the view after succesfull login
                        getApplication().getMainWindow().setContent(new ComboBoxUserStartsWith());

                    }
                } catch (AuthenticationException e) {
                    // Display error occured during logining
                    getWindow().showNotification(e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
                }
            }
        }
    });
于 2012-08-22T12:46:11.957 回答