如何解决Java中的AuthenticationManagerBuilder
我尝试使用angular / Java设置身份验证。对于Java部分,我可以使用所有过滤器,因此我只能在没有令牌的情况下转到/ login。唯一不起作用的是检查用户密码并为inMemoryAuthentication以外的其他人分发令牌,因为这是1个用户和1个admin。如何链接我的Users实体(我有用户服务器dao控制器等),以便在检查那里的密码后可以向数据库中的所有用户提供令牌。
这就是我现在拥有的:
@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
}
}
解决方法
您可以使用JDBCAuthentication Builder来存储和检索数据库中的所有用户。
首先定义要使用的架构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
还要告诉休眠状态您未使用默认架构,因此您应该禁用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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。