2017-10-19 6 views
0

봄 부팅 보안 기본 인증 데이터베이스 기반 보안을 구현하는 스프링 부팅 응용 프로그램 개발. UserDetailsService를 구현하고 loadUserByUsername 메서드를 재정의했습니다. 메서드를 살펴보면 사용자 이름, 암호 및 역할 정보가 데이터베이스 사용자 테이블에서 성공적으로 검색되었습니다.봄 부팅 보안 DAO 인증 - 기관 제거

내 UserDetailsService의 loadUserByUsername 코드 DaoAuthenticationProvider가 retrieveUser 다시 스테핑

@Override 
public UserDetails loadUserByUsername(String userName) 
     throws UsernameNotFoundException { 
    UserInfo activeUserInfo = userInfoDAO.getActiveUser(userName); 
    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(activeUserInfo.getRole()); 
    User(activeUserInfo.getUserName(), 
      activeUserInfo.getPassword(), Arrays.asList(authority)); 
    return userDetails; 
} 

이 값은 사용자 테이블 룩업에서 반환하지만 AbstractUserDetailsAuthenticationProvider 인증 방법은 제로 길이 배열, 사용자 이름과 비밀번호를 올바르게있는 것으로 당국 도시 포함합니다 반환되었습니다. 권한 값이 없으면 401 잘못된 자격 증명 오류가 반환됩니다.

나는 우편 배달부와 테스트 중입니다. 사용자 테이블에 MySQL을 5.7.11로 작업이를 사용하여 정의 :

CREATE TABLE IF NOT EXISTS `users` (
    `username` varchar(50) NOT NULL, 
    `password` varchar(100) NOT NULL, 
    `full_name` varchar(100) NOT NULL, 
    `role` varchar(50) NOT NULL, 
    `country` varchar(100) NOT NULL, 
    `enabled` tinyint(1) NOT NULL, 
    PRIMARY KEY (`username`) 
); 

암호는 BCryptPasswordEncoder를 사용하여 저장되고 우체부를 통해 일반 텍스트 암호를 보낸다.

spring.datasource.url=jdbc:mysql://localhost:3306/actotracker?useSSL=false 
spring.datasource.username=root 
spring.datasource.password=Dial0gicRots 
spring.datasource.tomcat.max-wait=20000 
spring.datasource.tomcat.max-active=50 
spring.datasource.tomcat.max-idle=20 
spring.datasource.tomcat.min-idle=15 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect 
spring.jpa.properties.hibernate.id.new_generator_mappings = false 
spring.jpa.properties.hibernate.format_sql = true 
security.basic.enabled=true 
security.basic.realm=Spring 
logging.level.org.hibernate.SQL=DEBUG 
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 

수동으로 결과에 영향을주지 않고 당국 값으로 "ROLE_ADMIN"로 설정 봤어 :로

내 application.properties 정의됩니다. 내가 잘못하고있는 것에 관한 포인터?

Java 버전 1.8 봄 부팅 1.5.3.RELEASE

내가 암호 인코더 등록 번호 :

private final Logger log = LoggerFactory.getLogger(MyApplication.class); 
@Autowired 
private AppUserDetailService appUserDetailsService; 
@Autowired 
private AppAuthenticationEntryPoint appAuthenticationEntryPoint; 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
    log.info("In configure"); 
    http.csrf().disable() 
      .authorizeRequests() 
      .antMatchers("/user/**").hasAnyRole("ROLE_ADMIN","ROLE_USER") 
      .and().httpBasic().realmName("Spring") 
     // .and().httpBasic() 
      .authenticationEntryPoint(appAuthenticationEntryPoint); 
} 
@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    log.info("configGlobal"); 
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
    auth.userDetailsService(appUserDetailsService).passwordEncoder(passwordEncoder); 
} 

이죠 값 : http://localhost:8080/user/distances 사용자 이름 필드 : 팀 비밀번호 : 일반 텍스트 암호를 값 기본 인증으로 설정된 인증

+0

코드를 조금 더 디버깅했습니다. AbstractUserDetailsAuthenticationProvider의 isPasswordValid 검사에서 additionalAuthenticationChecks가 실패합니다. 제공된 암호와 userDetails.getPassword() 및 값이 일치하는지 평가했습니다. salt 값은 null입니다. – geezer57

답변

0

맞았 으면 401이 원인입니다. d 암호가 일치하지 않습니다. 평범한 텍스트 문자열을 가져 와서 암호화하는 작은 루틴을 작성했습니다. `

 String creds = "xxxxxxx";  
     BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 
     String encPassword = bCryptPasswordEncoder.encode(creds); 

내가 사용/내 사용자 인증 테이블에서 encPassword 값을 저장.

BCryptPasswordEncoder 클래스 인 BCrypt.checkpw를 실행하면 원시 텍스트 문자열이 다른 암호화 된 값으로 변환 된 것으로 나타났습니다. 내 데이터베이스 사용자 테이블 항목을 새 암호화 값으로 업데이트했고 인증에 성공했습니다.