@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web -> web.ignoring().requestMatchers(new AntPathRequestMatcher("/h2-console/**")));
}
1. AuthenticationManager는 사용자의 인증 처치를 위한 작업을 AuthenticationProvider로 위임함
2. UsernamePasswordAuthenticationToken 타입의 인증 요청은 DaoAuthenticationProvider가 처리함
3. DaoAuthenticationProvider는 데이터베이스에서 사용자 인증 정보를 조회하는 작업을 UserDetailsService 인터페이스 구현체에 위임
CREATE TABLE users
(
username varchar(20) NOT NULL,
password varchar(80) NOT NULL,
enabled boolean NOT NULL DEFAULT false,
PRIMARY KEY (username)
);
CREATE TABLE authorities
(
username varchar(20) NOT NULL,
authority varchar(20) NOT NULL,
PRIMARY KEY (username)
);
이렇게 JdbcDaoImpl의 기본 쿼리에 적합한 테이블을 만든 후 해당 클래스를 빈으로 등록하면 인증 처리가 됨. 하지만 JdbcDaoImpl의 기본 쿼리에 맞춘 테이블이 아닌, 원래 만들어져 있던 테이블에 적용하려면 어떻게 할까?
@Bean
public JdbcUserDetailsManager jdbcUserDetailsManager() {
JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource);
jdbcUserDetailsManager.setUsersByUsernameQuery("SELECT " +
"login_id, passwd, true " +
"FROM " +
"users " +
"WHERE " +
"login_id = ?");
jdbcUserDetailsManager.setGroupAuthoritiesByUsernameQuery( "SELECT " +
"u.login_id, g.name, p.name " +
"FROM " +
"users u JOIN groups g ON u.group_id = g.id " +
"LEFT JOIN group_permission gp ON g.id = gp.group_id " +
"JOIN permissions p ON p.id = gp.permission_id " +
"WHERE " +
"u.login_id = ?");
jdbcUserDetailsManager.setEnableAuthorities(false);
jdbcUserDetailsManager.setEnableGroups(true);
return jdbcUserDetailsManager;
}
org.springframework.security.core.userdetails.UserDetails
객체를 만들어 반환