Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?

Posted

技术标签:

【中文标题】Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?【英文标题】:Vaadin4Spring's ManagedSecurity: How to update user list? 【发布时间】: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;
            
        ;
    


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

问候 新奇拉赫

【问题讨论】:

【参考方案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(或自定义实现)。 非常感谢您的帮助。我想我知道该怎么做。最后一个问题:因为我有自己的密码加密工具,所以我必须定义自己的密码编码器,对吧?我该怎么做?

以上是关于Vaadin4Spring 的 ManagedSecurity:如何更新用户列表?的主要内容,如果未能解决你的问题,请参考以下文章

既是3的倍数又是5的倍数都有哪些

一个三位数既是3的倍数,又是5的倍数。这样的三位数最小是啥

数组的创建,及数组的方法

cnn中的步长的目的和重要性是啥

物质的运动

多态的好处??