2016-10-07 1 views
-1

내 자바 코드에 스크립트를 작성하려고하는데, 사용자 로그인이 필요하고 실제 사용자가 웹 클라이언트와 로그 아웃에서 할 수있는 일을 할 수 있습니다.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의이 구현되어 있습니다. 위의 구현

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


} 

UserDetailsService의 구현은 다음과 같습니다

@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

주 우리에게 UR 지식 엉 또는 u 대신 어떤 이유없이 아래로 투표 .. 더 나은 아이디어가 있다면! – FuSsA

+0

내가 묻는다면 나는 투표하지 않았다. 솔직히 말해서, 나는 방금 작업 한 것을보고, 자세한 응답을 위해 을 표결했습니다. 또한 나는 왜 모르는지 모르겠다. 왜 누군가가 질문에 답했다. 적어도 두 사람이이 질문을 가장 좋아했습니다. – DamienMiheev

+0

당신이 아니란 것을 나는 안다.;) – FuSsA

관련 문제