2017-08-27 17 views
0

セッションでユーザ名を取得する方法について疑問があります。私は私のクラスUsuarioを持って春のセキュリティ4.2セッションでユーザ名を取得するSpring Security

を使用しています

@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、すでに春のセキュリティに組み込まれています。

@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); 

    } 
} 

フォーラムで他の投稿を既に調査しましたが、ヒントはありませんでした。別のクラスを作成する必要がありますか?

+1

CDI/JSFのために間違った組み合わせを使用しています'@ Named'と' @ Viewsoped'の組み合わせです。 1つは「CDI」で、もう1つは「JSF」です。それがsprimgのためにそのように働くならば、問題は決してjsf関連ではありません。 – Kukeltje

+0

こんにちはKukeltje、そして何が正しいフォームでしょうか? – Genn

+0

通常、私はgoogleを試してみたいと思いますが、気分は良いです:https://stackoverflow.com/questions/14384369/how-to-replace-managedbean-viewscope-by-cdi-in-jsf-2 -0-2-1 – Kukeltje

答えて

0

あなたは春のセキュリティと認証された現在のユーザーのユーザー名を取得したい場合は、以下を使用することができます。ここでは

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

、我々は現在のAuthenticationを見つけると、ユーザー名のためにそれを照会します。パスワードベースの認証の場合、getName()はユーザーのログインを返します。

+0

こんにちは!答えてくれてありがとう!私は最後の文字列現在のユーザー名= SecurityContextHolder.getContext()を挿入します。 GetAuthentication()。 GetName();? SecurityConfigでは?それとも別のクラスを作るのですか? – Genn

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();

関連する問題