2016-10-07 6 views
-1

私は自分のJavaコードにいくつかのスクリプトを書き込もうとしています。実際のユーザーがWebクライアントやログアウトから行うことができるように、ユーザーにログインする必要があります。Spring SecurityのJavaコードからユーザーにログインする方法は?

これは春のセキュリティでどのように機能しますか? どうすればいいですか? 私は、セッション、役割、および権限を使って、実際のようにユーザー認証を模倣する方法を意味しますか?

ありがとうございます!

答えて

1

少数の時間後、私が見つけ

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

} 
ソリューション:

@Component 
public class AuthorityUtils { 

//org.springframework.security.authentication.AuthenticationManager 
@Autowired 
private AuthenticationManager authenticationManager; 

public void loginDirectly(String email, String password) { 
    UsernamePasswordAuthenticationToken loginToken = new UsernamePasswordAuthenticationToken(email, password); 
    Authentication authenticatedUser = authenticationManager.authenticate(loginToken); 
    SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    } 
} 
0

は、この例のように試してみてください:

は春のセキュリティJavaの設定を作成します。 JdbcTokenRepositoryImplInMemoryTokenRepositoryImpl

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    @Qualifier("customUserDetailsService") 
    UserDetailsService userDetailsService; 

    @Autowired 
    PersistentTokenRepository tokenRepository; 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService); 
     auth.authenticationProvider(authenticationProvider()); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/", "/list") 
       .access("hasRole('USER') or hasRole('ADMIN') or hasRole('DBA')") 
       .antMatchers("/newuser/**", "/delete-user-*").access("hasRole('ADMIN')").antMatchers("/edit-user-*") 
       .access("hasRole('ADMIN') or hasRole('DBA')").and().formLogin().loginPage("/login") 
       .loginProcessingUrl("/login").usernameParameter("ssoId").passwordParameter("password").and() 
       .rememberMe().rememberMeParameter("remember-me").tokenRepository(tokenRepository) 
       .tokenValiditySeconds(86400).and().csrf().and().exceptionHandling().accessDeniedPage("/Access_Denied"); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
     return new BCryptPasswordEncoder(); 
    } 

    @Bean 
    public DaoAuthenticationProvider authenticationProvider() { 
     DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider(); 
     authenticationProvider.setUserDetailsService(userDetailsService); 
     authenticationProvider.setPasswordEncoder(passwordEncoder()); 
     return authenticationProvider; 
    } 

    @Bean 
    public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices() { 
     PersistentTokenBasedRememberMeServices tokenBasedservice = new PersistentTokenBasedRememberMeServices(
       "remember-me", userDetailsService, tokenRepository); 
     return tokenBasedservice; 
    } 

    @Bean 
    public AuthenticationTrustResolver getAuthenticationTrustResolver() { 
     return new AuthenticationTrustResolverImpl(); 
    } 

} 

春のセキュリティはPersistentTokenRepositoryの2つの実装が付属しています。実装上

@Repository("tokenRepositoryDao") 
@Transactional 
public class HibernateTokenRepositoryImpl extends AbstractDao<String, PersistentLogin> 
     implements PersistentTokenRepository { 

    static final Logger logger = LoggerFactory.getLogger(HibernateTokenRepositoryImpl.class); 

    @Override 
    public void createNewToken(PersistentRememberMeToken token) { 
     logger.info("Creating Token for user : {}", token.getUsername()); 
     PersistentLogin persistentLogin = new PersistentLogin(); 
     persistentLogin.setUsername(token.getUsername()); 
     persistentLogin.setSeries(token.getSeries()); 
     persistentLogin.setToken(token.getTokenValue()); 
     persistentLogin.setLast_used(token.getDate()); 
     persist(persistentLogin); 

    } 

    @Override 
    public PersistentRememberMeToken getTokenForSeries(String seriesId) { 
     logger.info("Fetch Token if any for seriesId : {}", seriesId); 
     try { 
      Criteria crit = createEntityCriteria(); 
      crit.add(Restrictions.eq("series", seriesId)); 
      PersistentLogin persistentLogin = (PersistentLogin) crit.uniqueResult(); 

      return new PersistentRememberMeToken(persistentLogin.getUsername(), persistentLogin.getSeries(), 
        persistentLogin.getToken(), persistentLogin.getLast_used()); 
     } catch (Exception e) { 
      logger.info("Token not found..."); 
      return null; 
     } 
    } 

    @Override 
    public void removeUserTokens(String username) { 
     logger.info("Removing Token if any for user : {}", username); 
     Criteria crit = createEntityCriteria(); 
     crit.add(Restrictions.eq("username", username)); 
     PersistentLogin persistentLogin = (PersistentLogin) crit.uniqueResult(); 
     if (persistentLogin != null) { 
      logger.info("rememberMe was selected"); 
      delete(persistentLogin); 
     } 

    } 

    @Override 
    public void updateToken(String seriesId, String tokenValue, Date lastUsed) { 
     logger.info("Updating Token for seriesId : {}", seriesId); 
     PersistentLogin persistentLogin = getByKey(seriesId); 
     persistentLogin.setToken(tokenValue); 
     persistentLogin.setLast_used(lastUsed); 
     update(persistentLogin); 
    } 

} 

以下に示す、[PersistentLogin] persistent_loginsテーブルにマッピングされたエンティティを使用するエンティティ自体です。セキュリティの構成で使用

@Entity 
@Table(name="PERSISTENT_LOGINS") 
public class PersistentLogin implements Serializable{ 

    @Id 
    private String series; 

    @Column(name="USERNAME", unique=true, nullable=false) 
    private String username; 

    @Column(name="TOKEN", unique=true, nullable=false) 
    private String token; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date last_used; 

    public String getSeries() { 
     return series; 
    } 

    public void setSeries(String series) { 
     this.series = series; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 

    public Date getLast_used() { 
     return last_used; 
    } 

    public void setLast_used(Date last_used) { 
     this.last_used = last_used; 
    } 


} 

UserDetailsS​​erviceの実装は、以下の通りである:

@Service("customUserDetailsService") 
public class CustomUserDetailsService implements UserDetailsService{ 

    static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class); 

    @Autowired 
    private UserService userService; 

    @Transactional(readOnly=true) 
    public UserDetails loadUserByUsername(String ssoId) 
      throws UsernameNotFoundException { 
     User user = userService.findBySSO(ssoId); 
     logger.info("User : {}", user); 
     if(user==null){ 
      logger.info("User not found"); 
      throw new UsernameNotFoundException("Username not found"); 
     } 
      return new org.springframework.security.core.userdetails.User(user.getSsoId(), user.getPassword(), 
       true, true, true, true, getGrantedAuthorities(user)); 
    } 


    private List<GrantedAuthority> getGrantedAuthorities(User user){ 
     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 

     for(UserProfile userProfile : user.getUserProfiles()){ 
      logger.info("UserProfile : {}", userProfile); 
      authorities.add(new SimpleGrantedAuthority("ROLE_"+userProfile.getType())); 
     } 
     logger.info("authorities : {}", authorities); 
     return authorities; 
    } 

} 

最後に、下記の初期化クラスを使用してアプリケーション戦争でspringSecurityFilterを登録します。

+0

シェアは私たちにウルの知識を聖霊降臨祭またはuではなく、理由もなくダウンの投票...より良いアイデアを持っている場合! – FuSsA

+0

私に尋ねると、私は投票していませんでした。 正直言って、私はちょうど見て、働くことになったし、詳細な回答については を投票しました。また、私はなぜ誰かが質問を投票したのか分からない。少なくとも2人がこの質問をお気に入りにしました。 – DamienMiheev

+0

私はそれがあなたではないと知っています..;) – FuSsA

関連する問題