Spring Security OAuth2数据库 - 错误的凭据错误

时间:2018-04-17 11:17:23

标签: java sql spring spring-security spring-security-oauth2

我正在构建一个Spring应用程序,该应用程序在OAuth2配置中使用数据库作为授权服务。

这是Spring Security的SecurityConfig类

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


@Autowired
private CustomUserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.userDetailsService(userDetailsService)
            .passwordEncoder(getPasswordEncoder());
}


@Override
protected void configure(HttpSecurity http) throws Exception {

    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("**/secured/**").authenticated()
            .anyRequest().permitAll()
            .and()
            .formLogin().permitAll();
}

private PasswordEncoder getPasswordEncoder() {
    return new PasswordEncoder() {
        @Override
        public String encode(CharSequence charSequence) {
            return charSequence.toString();
        }

        @Override
        public boolean matches(CharSequence charSequence, String s) {
            return true;
        }
    };
}
}

这是我的数据库存储库,旨在通过电子邮件查找用户。

@Repository
public interface UsersRepository extends JpaRepository<User, Integer> {
   @Query
   Optional<User> findByEmail(String email);
}

这是我的服务类:

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

@Autowired
private UsersRepository usersRepository;


@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    Optional<User> optionalUsers = usersRepository.findByEmail(email);

    optionalUsers
            .orElseThrow(() -> new UsernameNotFoundException("Username not found"));
    return optionalUsers
            .map(CustomUserDetails::new).get();


}
}

当我输入我在数据库上的电子邮件和密码时,它会回来说

"Bad Credentials"

有人可以发现我的设置有什么问题吗?

如果我删除

@PreAuthorise("hasRole('ROLE_admin')")

在控制器中将摆脱登录屏幕,但我希望有登录屏幕。

根据评论的要求,这是我的数据库架构。我使用H2来提供内存数据库。

DROP TABLE IF EXISTS 'User'

CREATE TABLE IF NOT EXISTS User (
id INT,
role VARCHAR(5),
title VARCHAR(5),
firstname VARCHAR(20),
lastname VARCHAR(20),
email VARCHAR(50),
password VARCHAR(50),
modified DATETIME,
accessed DATETIME
)

INSERT INTO User VALUES
(
 '1',
 'admin',
 'mr',
 'bob',
 'smith',
 'bob.smith@example.com',
 'gobob',
 '1993-10-25 22:10:00',
 '2018-04-09 08:30:00'
 ),
 ....

spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Datasource
spring.datasource.url=jdbc:h2:file:path/to/application/src/main/resources/DATA-DUMP.sql
spring.datasource.username=<user>
spring.datasource.password=<pass>
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-     strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

我不认为我的H2正在填充它创建的表:

2018-04-17 13:52:43.523  INFO 4407 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2018-04-17 13:52:43.583  INFO 4407 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM
Hibernate: insert into hibernate_sequence values ( 1 )
Hibernate: create table user (id integer not null, accessed datetime, email varchar(255), firstname varchar(255), lastname varchar(255), modified datetime, password varchar(255), role varchar(255), title varchar(255), primary key (id)) engine=MyISAM
2018-04-17 13:52:43.881  INFO 4407 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'

1 个答案:

答案 0 :(得分:1)

虽然您目前收到Bad Credentials消息,但之后可能会遇到另一个问题:

@PreAuthorise("hasRole('ROLE_admin')")

请注意,hasRole区分大小写,正确的角色可能是ROLE_ADMIN。此外,根据您的Spring Security版本,您可能需要省略ROLE_并只需使用

@PreAuthorise("hasRole('ADMIN')")

问题

就像我在评论中提到的,使用PasswordEncoder的实现,只要用户名存在,您用于登录的密码就不重要了,因为您的实现matches方法始终返回true

换句话说,问题可能是您的存储库找不到具有您尝试测试的用户名的任何用户。

您的数据库很可能是空的。

<强>更新

在阅读所有使用User注释的类后,Hibernate会自动创建@Entity表,而不是因为您在模式文件中编写了它。

data-h2.sql中创建一个名为src/main/resources的文件,并在那里移动所有插入内容,例如:

INSERT INTO User VALUES (
  '1',
  'admin',
  'mr',
  'bob',
  'smith',
  'bob.smith@example.com',
  'gobob',
  '1993-10-25 22:10:00',
  '2018-04-09 08:30:00'
),
...

有关详细信息,请参阅Spring Boot - Loading Initial Data