【问题标题】:Vaadin4Spring's ManagedSecurity: How to update user list?Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?
【发布时间】:2016-01-13 16:31:34
【问题描述】:

我正在使用 Vaadin 7.5.6、Vaadins Spring 1.0.0、Vaadin4Spring Managed Security Extension 0.0.7-SNAPSHOT 和 Tomcat8。

目前,我有一个实现AuthenticationManagerConfigurer接口的配置类:

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.vaadin.spring.security.annotation.EnableVaadinManagedSecurity;
import org.vaadin.spring.security.config.AuthenticationManagerConfigurer;

import com.vaadin.server.CustomizedSystemMessages;
import com.vaadin.server.SystemMessages;
import com.vaadin.server.SystemMessagesInfo;
import com.vaadin.server.SystemMessagesProvider;

import de.blume2000.kiss.hibernate.dto.User;
import de.blume2000.kiss.hibernate.services.UserService;
import de.blume2000.kiss.utils.EncryptionUtil;

@Configuration
@EnableVaadinManagedSecurity
public class SecurityConfiguration implements AuthenticationManagerConfigurer
{

    @Autowired
    UserService userService;

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        List<User> users = userService.findAll();

        if (users == null)
            return;

        for (User user : users)
        {
            String encryptedPassword = EncryptionUtil.decryptPassword(user.getPassword(), user.getSalt());
            auth.inMemoryAuthentication().withUser(user.getUsername()).password(encryptedPassword).roles(user.getRole());
        }

    }

    /**
     * Provide custom system messages to make sure the application is reloaded when the session expires.
     */
    @SuppressWarnings("serial")
    @Bean
    SystemMessagesProvider systemMessagesProvider()
    {
        return new SystemMessagesProvider()
        {
            @Override
            public SystemMessages getSystemMessages(SystemMessagesInfo systemMessagesInfo)
            {
                CustomizedSystemMessages systemMessages = new CustomizedSystemMessages();
                systemMessages.setSessionExpiredNotificationEnabled(false);
                return systemMessages;
            }
        };
    }

}

现在,如果用户登录,他可以选择编辑他的用户帐户设置。这会更改数据库中的用户对象(例如登录用户名)。现在,如果他注销,我希望应用程序重新加载用户列表,以便用户可以使用他的新用户名。这怎么可能?

问候 新奇拉赫

【问题讨论】:

    标签: java spring-security vaadin vaadin4spring


    【解决方案1】:

    简而言之,将内存中的身份验证替换为 DAO 身份验证。

    请注意,在下面的示例中,UserDetailsService userService 是 Spring 核心接口,UserRepository userRepository 是您的用户的 DAO(在您的示例中也称为 UserService userService)。

    1.配置

    @Configuration
    public class Authorization extends GlobalAuthenticationConfigurerAdapter {
    
        @Autowired
        private UserDetailsService userService;
    
        @Override
        public void init(AuthenticationManagerBuilder auth) throws Exception {
           auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
        }
    
        @Bean
        public PasswordEncoder passwordEncoder(){
            return new BCryptPasswordEncoder();
        }
    }
    

    2。提供用户详细信息的服务

    @Service
    public class UserService implements UserDetailsService {
    
        @Autowired
        private UserRepository userRepository;
    
        @Override
        @Transactional(readOnly = true)
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            User user = userRepository.findByUsername(username);
            if (user == null) {
                throw new UsernameNotFoundException(username);
            }
            return user;
        }
    }
    

    【讨论】:

    • 感谢您的回答。此方法与 Vaadin4Spring 安全扩展兼容吗?所以我可以通过 vaadinSecurity.login(...) 和 vaadinSecurity.logout() 处理登录和注销?
    • @shinchillahh 我还没有真正尝试过这个插件,但你只是将InMemoryUserDetailsManagerConfigurer 切换为应该是透明的DaoAuthenticationConfigurer
    • 好的,我知道了。我必须注意 User DTO 类的一些特别之处吗?因为loadUserByUsername(String username)方法返回的是UserDetails接口……
    • @sinchillahh 为了简单起见,我让我的User bean 实现了org.springframework.security.core.userdetails.UserDetails 接口。更好更简洁的代码可能会从您自己的 Usermodel bean 创建一个 org.springframework.security.core.userdetails.User(或自定义实现)。
    • 非常感谢您的帮助。我想我知道该怎么做。最后一个问题:因为我有自己的密码加密工具,所以我必须定义自己的密码编码器,对吧?我该怎么做?
    猜你喜欢
    • 2021-11-27
    • 2011-11-02
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多