authenticationmanagerbuilder

qyzbxkaa  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(228)

我正在尝试用angular/java设置身份验证。对于java部分,我有所有的过滤器工作,所以我只能在没有令牌的情况下进入/登录。唯一不起作用的是检查用户密码并为inmemoryauthentication以外的其他人分发令牌目前这是一个用户和一个管理员。如何链接我的users实体(我有users server dao controller等等),以便在检查了数据库中的所有用户的密码后,将令牌提供给他们。
这就是我现在所拥有的:

@Configuration
@EnableWebSecurity
//@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests().antMatchers("/login").permitAll() 

                .anyRequest().authenticated() // cualquier otra peticion requiere autenticacion
                .and()
                .addFilterBefore(new LoginFilter("/login", authenticationManager()),
                        UsernamePasswordAuthenticationFilter.class)
                .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin")
                .password("{noop}password").roles("ADMIN");

//// here I want to add all my users from the database

    }
}
w9apscun

w9apscun1#

您可以使用JDBCAuthenticationBuilder来存储和检索数据库中的所有用户。
首先定义要使用的模式 schema.sql -

CREATE TABLE users (
  username VARCHAR(50) NOT NULL,
  password VARCHAR(100) NOT NULL,
  enabled TINYINT NOT NULL DEFAULT 1,
  PRIMARY KEY (username)
);

CREATE TABLE authorities (
  username VARCHAR(50) NOT NULL,
  authority VARCHAR(50) NOT NULL,
  FOREIGN KEY (username) REFERENCES users(username)
);

CREATE UNIQUE INDEX ix_auth_username
  on authorities (username,authority);

然后是一些样本数据 data.sql -

INSERT INTO users (username, password, enabled)
  values ('user',
    '$2a$10$8.UnVuG9HHgffUDAlk8qfOuVGkqRzgVymGe07xd00DMxs.AQubh4a',
    1);

INSERT INTO authorities (username, authority)
  values ('user', 'ROLE_USER');

更新应用程序属性以指向正确的数据库-


# MySQL

# spring.datasource.url=jdbc:mysql://localhost:3306/test

# spring.datasource.username=dbuser

# spring.datasource.password=dbpass

# spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

还要告诉hibernate您没有使用默认模式,因此应该禁用 ddl-auto 财产

spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=none

然后您可以更新您的安全配置,如下所示-

@Configuration
@EnableWebSecurity
//@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserService userService;

    //DataSource connection to your DB
    @Autowired
    DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests().antMatchers("/login").permitAll() 

                .anyRequest().authenticated() // cualquier otra peticion requiere autenticacion
                .and()
                .addFilterBefore(new LoginFilter("/login", authenticationManager()),
                        UsernamePasswordAuthenticationFilter.class)
                .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
       //Telling spring to use DB based authentication.
       auth.jdbcAuthentication()
           .dataSource(dataSource);

    }
}

相关问题