web-dev-qa-db-ja.com

実行時にSpringSecurityに新しいユーザーを追加する方法

Hibernateを介してユーザーをDBテーブルに保存し、SpringSecurityを使用して認証します。

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

これは完全に機能しますが、ポイントがあります。サーバーの起動時にユーザーが読み込まれます。実行時にSpringSecurityに新しいユーザーを追加するメソッドRegisterUser(User user)を作成する必要があります。このメソッドは、このタスクのみに焦点を当てる必要があります。この機能の実装を開始する方法がわからないので、アドバイスをありがとう! ;)

Ofcユーザーには、ログイン、パスワード、役割文字列などのフィールドがあります。

SpringMVCでソリューションを投稿しないでください。このシステムは、バージョン4.0.xのSpring WebBoostとSpringSecurityBoostを使用するRESTfulアプリです。

ユーザーが登録している場合は、メモリではなくデータベースにユーザーを保存することをお勧めします:)

  1. ユーザー用に 権限 を作成します

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
    
  2. ユーザーをインスタンス化します(実装するクラスを使用して serDetails

    UserDetails user = new User("[email protected]", passwordEncoder.encode("s3cr3t"), authorities);
    
  3. ユーザーを便利な場所に保存します。 JdbcUserDetailsManager は、ユーザーをデータベースに簡単に保存できます。

    userDetailsManager.createUser(user);
    
  4. sernamePasswordAuthenticationToken を作成します

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    
  5. 認証を SecurityContext に追加します

    SecurityContextHolder.getContext().setAuthentication(authentication);
    
7
Neil McGuigan

このコードを使用して、現在のユーザーに権限を追加します。

List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_NEWUSERROLE'); 
    SecurityContextHolder.getContext().setAuthentication(
        new UsernamePasswordAuthenticationToken(
            SecurityContextHolder.getContext().getAuthentication().getPrincipal(),
            SecurityContextHolder.getContext().getAuthentication().getCredentials(),
            authorities)
        );
0
M2E67