在会话Spring Security中获取用户名

时间:2017-08-27 18:32:05

标签: spring spring-security

我对如何在会话中获取用户名存在疑问。我正在使用Spring Security 4.2

我有我的班级Usuario

@Entity
@Data
public class Usuario {

    @Id @GeneratedValue
    private Integer id;

    private String login;
    private String senha;
    private String papel;

}

我的班级UsuarioController

@Named
@ViewScoped
public class UsuarioController {

    @Autowired
    private UsuarioRepository usuarioRepository;

    @Getter @Setter
    private List<Usuario> usuarios;

    @Getter @Setter
    private Usuario usuario = new Usuario();

}

我的类SecurityConfig扮演了过滤器的角色,已经内置于Spring Security中。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UsuarioRepository usuarioRepository;

    @Override
    protected void configure(HttpSecurity http) {
        try {
            http.csrf().disable();
            http
                .userDetailsService(userDetailsService())
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/cliente.jsf").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login.jsf")
                .permitAll()
                .failureUrl("/login.jsf?error=true")
                .defaultSuccessUrl("/cliente.jsf")
                .and()
                .logout()
                .logoutSuccessUrl("/login.jsf");
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    @Override
    protected UserDetailsService userDetailsService() {

        List<Usuario> usuarios = usuarioRepository.findAll();

        List<UserDetails> users = new ArrayList<>();

        for(Usuario u: usuarios){
            UserDetails user = new User(u.getLogin(), u.getSenha(), AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_"+u.getPapel()));
            users.add(user);
        } return new InMemoryUserDetailsManager(users);

    }
}

我已经在论坛中研究过其他帖子,没有帮助,有什么提示吗?我需要创建另一个类吗?

2 个答案:

答案 0 :(得分:0)

如果要获取使用Spring Security进行身份验证的当前用户的用户名,可以使用以下命令:

final String currentUserName = SecurityContextHolder.getContext().getAuthentication().getName();

在这里,我们找到当前的Authentication并查询用户名。对于基于密码的验证,getName()返回用户的登录信息。

答案 1 :(得分:0)

您可以像这样创建自己的SecurityUtility类:

public final class SecurityUtils {

    private SecurityUtils() {
    }


    public static String getUserName() {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        String userName = null;
        if (authentication != null) {

                UserDetails userDetails = (UserDetails) authentication.getPrincipal();
                userName = userDetails.getUsername();

        }
        return userName;
    }

并从您需要用户名的班级中调用它,例如:SecurityUtils.getCurrentUserLogin();